mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-05-19 21:41:52 +08:00
Summary: This is a complete rewrite of RCTText, the part of React Native which manages Text and TextInput components. Key points: * It's understandable now. It follows a simple architectural pattern, and it's easy to debug and iterate. Text flow layout is a first-class citizen in React Native layout system now, not just a wired special case. It also brings entirely new possibilities such as nested interleaving <Text> and <View> components. * All <Text>-specific APIs were removed from UIManager and co (it's about ~16 public methods which were used exclusively only by <Text>). * It relies on new Yoga measurement/cloning API and on-dirty handler. So, it removes built-in dirty propagation subsystem from RN completely. * It caches string fragments properly and granularly on a per-node basis which makes updating text-containing components more performant. * It does not instantiate UIView for virtual components which reduces memory utilization. * It drastically improves <TextInput> capabilities (e.g. rich text inside single line <TextInput> is now supported). Screenshots: https://cl.ly/2j3r1V0L0324 https://cl.ly/3N2V3C3d3q3R Reviewed By: mmmulani Differential Revision: D6617326 fbshipit-source-id: 35d4d81b35c9870e9557d0211c0e934e6072a41e
95 lines
2.6 KiB
Objective-C
95 lines
2.6 KiB
Objective-C
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
#import "RCTTextViewManager.h"
|
|
|
|
#import <React/RCTAccessibilityManager.h>
|
|
#import <React/RCTShadowView+Layout.h>
|
|
#import <React/RCTShadowView.h>
|
|
#import <React/RCTUIManager.h>
|
|
#import <React/RCTUIManagerObserverCoordinator.h>
|
|
|
|
#import "RCTTextShadowView.h"
|
|
#import "RCTTextView.h"
|
|
|
|
@interface RCTTextViewManager () <RCTUIManagerObserver>
|
|
|
|
@end
|
|
|
|
@implementation RCTTextViewManager
|
|
{
|
|
NSHashTable<RCTTextShadowView *> *_shadowViews;
|
|
CGFloat _fontSizeMultiplier;
|
|
}
|
|
|
|
RCT_EXPORT_MODULE(RCTText)
|
|
|
|
RCT_REMAP_SHADOW_PROPERTY(numberOfLines, maximumNumberOfLines, NSInteger)
|
|
RCT_REMAP_SHADOW_PROPERTY(ellipsizeMode, lineBreakMode, NSLineBreakMode)
|
|
RCT_REMAP_SHADOW_PROPERTY(adjustsFontSizeToFit, adjustsFontSizeToFit, BOOL)
|
|
RCT_REMAP_SHADOW_PROPERTY(minimumFontScale, minimumFontScale, CGFloat)
|
|
|
|
RCT_EXPORT_VIEW_PROPERTY(selectable, BOOL)
|
|
|
|
- (void)setBridge:(RCTBridge *)bridge
|
|
{
|
|
[super setBridge:bridge];
|
|
_shadowViews = [NSHashTable weakObjectsHashTable];
|
|
|
|
[bridge.uiManager.observerCoordinator addObserver:self];
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(handleDidUpdateMultiplierNotification)
|
|
name:RCTAccessibilityManagerDidUpdateMultiplierNotification
|
|
object:bridge.accessibilityManager];
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
}
|
|
|
|
- (UIView *)view
|
|
{
|
|
return [RCTTextView new];
|
|
}
|
|
|
|
- (RCTShadowView *)shadowView
|
|
{
|
|
RCTTextShadowView *shadowView = [[RCTTextShadowView alloc] initWithBridge:self.bridge];
|
|
shadowView.textAttributes.fontSizeMultiplier = self.bridge.accessibilityManager.multiplier;
|
|
[_shadowViews addObject:shadowView];
|
|
return shadowView;
|
|
}
|
|
|
|
#pragma mark - RCTUIManagerObserver
|
|
|
|
- (void)uiManagerWillPerformMounting:(__unused RCTUIManager *)uiManager
|
|
{
|
|
for (RCTTextShadowView *shadowView in _shadowViews) {
|
|
[shadowView uiManagerWillPerformMounting];
|
|
}
|
|
}
|
|
|
|
#pragma mark - Font Size Multiplier
|
|
|
|
- (void)handleDidUpdateMultiplierNotification
|
|
{
|
|
CGFloat fontSizeMultiplier = self.bridge.accessibilityManager.multiplier;
|
|
|
|
for (RCTTextShadowView *shadowView in _shadowViews) {
|
|
shadowView.textAttributes.fontSizeMultiplier = fontSizeMultiplier;
|
|
[shadowView dirtyLayout];
|
|
}
|
|
|
|
[self.bridge.uiManager setNeedsLayout];
|
|
}
|
|
|
|
@end
|