Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Refactor RCTInputAccessoryView view hierarchy and names
Reviewed By: shergin

Differential Revision: D7196162

fbshipit-source-id: 07a5c13d4cdb876f5a632d7d53859eab5e235f49
  • Loading branch information
Peter Argany authored and facebook-github-bot committed Mar 13, 2018
1 parent aa323d4 commit c136c54
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 52 deletions.
2 changes: 1 addition & 1 deletion Libraries/Text/TextInput/RCTBaseTextInputView.m
Expand Up @@ -419,7 +419,7 @@ - (void)setCustomInputAccessoryViewWithNativeID:(NSString *)nativeID
UIView *accessoryView = [strongSelf->_bridge.uiManager viewForNativeID:nativeID
withRootTag:rootView.reactTag];
if (accessoryView && [accessoryView isKindOfClass:[RCTInputAccessoryView class]]) {
strongSelf.backedTextInputView.inputAccessoryView = ((RCTInputAccessoryView *)accessoryView).content.inputAccessoryView;
strongSelf.backedTextInputView.inputAccessoryView = ((RCTInputAccessoryView *)accessoryView).inputAccessoryView;
[strongSelf reloadInputViewsIfNecessary];
}
}
Expand Down
2 changes: 0 additions & 2 deletions Libraries/Text/TextInput/RCTInputAccessoryView.h
Expand Up @@ -14,6 +14,4 @@

- (instancetype)initWithBridge:(RCTBridge *)bridge;

@property (nonatomic, readonly, strong) RCTInputAccessoryViewContent *content;

@end
38 changes: 24 additions & 14 deletions Libraries/Text/TextInput/RCTInputAccessoryView.m
Expand Up @@ -13,56 +13,66 @@

#import "RCTInputAccessoryViewContent.h"

@interface RCTInputAccessoryView()

// Overriding `inputAccessoryView` to `readwrite`.
@property (nonatomic, readwrite, retain) UIView *inputAccessoryView;

@end

@implementation RCTInputAccessoryView
{
BOOL _contentShouldBeFirstResponder;
BOOL _shouldBecomeFirstResponder;
}

- (instancetype)initWithBridge:(RCTBridge *)bridge
{
if (self = [super init]) {
_content = [RCTInputAccessoryViewContent new];
_inputAccessoryView = [RCTInputAccessoryViewContent new];
RCTTouchHandler *const touchHandler = [[RCTTouchHandler alloc] initWithBridge:bridge];
[touchHandler attachToView:_content.inputAccessoryView];
[self addSubview:_content];
[touchHandler attachToView:_inputAccessoryView];
}
return self;
}

- (BOOL)canBecomeFirstResponder
{
return true;
}

- (void)reactSetFrame:(CGRect)frame
{
[_content.inputAccessoryView setFrame:frame];
[_content.contentView setFrame:frame];
[_inputAccessoryView setFrame:frame];

if (_contentShouldBeFirstResponder) {
_contentShouldBeFirstResponder = NO;
[_content becomeFirstResponder];
if (_shouldBecomeFirstResponder) {
_shouldBecomeFirstResponder = NO;
[self becomeFirstResponder];
}
}

- (void)insertReactSubview:(UIView *)subview atIndex:(NSInteger)index
{
[super insertReactSubview:subview atIndex:index];
[_content insertReactSubview:subview atIndex:index];
[_inputAccessoryView insertReactSubview:subview atIndex:index];
}

- (void)removeReactSubview:(UIView *)subview
{
[super removeReactSubview:subview];
[_content removeReactSubview:subview];
[_inputAccessoryView removeReactSubview:subview];
}

- (void)didUpdateReactSubviews
{
// Do nothing, as subviews are managed by `insertReactSubview:atIndex:`
// Do nothing, as subviews are managed by `insertReactSubview:atIndex:`.
}

- (void)didSetProps:(NSArray<NSString *> *)changedProps
{
// If the accessory view is not linked to a text input via nativeID, assume it is
// a standalone component that should get focus whenever it is rendered
// a standalone component that should get focus whenever it is rendered.
if (![changedProps containsObject:@"nativeID"] && !self.nativeID) {
_contentShouldBeFirstResponder = YES;
_shouldBecomeFirstResponder = YES;
}
}

Expand Down
2 changes: 0 additions & 2 deletions Libraries/Text/TextInput/RCTInputAccessoryViewContent.h
Expand Up @@ -9,6 +9,4 @@

@interface RCTInputAccessoryViewContent : UIView

@property (nonatomic, readwrite, retain) UIView *contentView;

@end
58 changes: 26 additions & 32 deletions Libraries/Text/TextInput/RCTInputAccessoryViewContent.m
Expand Up @@ -9,65 +9,59 @@

#import <React/UIView+React.h>

@interface RCTInputAccessoryViewContent()

// Overriding `inputAccessoryView` to `readwrite`.
@property (nonatomic, readwrite, retain) UIView *inputAccessoryView;

@end

@implementation RCTInputAccessoryViewContent
{
UIView *_safeAreaContainer;
}

- (BOOL)canBecomeFirstResponder
- (instancetype)init
{
return true;
if (self = [super init]) {
_safeAreaContainer = [UIView new];
[self addSubview:_safeAreaContainer];
}
return self;
}

- (BOOL)becomeFirstResponder
- (void)didMoveToSuperview
{
const BOOL becameFirstResponder = [super becomeFirstResponder];

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
// Avoiding the home pill and notch (landscape mode) on iphoneX.
if (becameFirstResponder) {
if (@available(iOS 11.0, *)) {
[_contentView.bottomAnchor
constraintLessThanOrEqualToSystemSpacingBelowAnchor:_contentView.window.safeAreaLayoutGuide.bottomAnchor
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
// Avoid the home pill (in portrait mode) and notch (in landscape mode) on iPhoneX.
if (@available(iOS 11.0, *)) {
if (self.window) {
[_safeAreaContainer.bottomAnchor
constraintLessThanOrEqualToSystemSpacingBelowAnchor:self.window.safeAreaLayoutGuide.bottomAnchor
multiplier:1.0f].active = YES;
[_contentView.leftAnchor
constraintLessThanOrEqualToSystemSpacingAfterAnchor:_contentView.window.safeAreaLayoutGuide.leftAnchor
[_safeAreaContainer.leftAnchor
constraintGreaterThanOrEqualToSystemSpacingAfterAnchor:self.window.safeAreaLayoutGuide.leftAnchor
multiplier:1.0f].active = YES;
[_contentView.rightAnchor
constraintLessThanOrEqualToSystemSpacingAfterAnchor:_contentView.window.safeAreaLayoutGuide.rightAnchor
[_safeAreaContainer.rightAnchor
constraintLessThanOrEqualToSystemSpacingAfterAnchor:self.window.safeAreaLayoutGuide.rightAnchor
multiplier:1.0f].active = YES;
}
}
#endif
#endif

return becameFirstResponder;
}

- (UIView *)inputAccessoryView
- (void)setFrame:(CGRect)frame
{
if (!_inputAccessoryView) {
_inputAccessoryView = [UIView new];
_contentView = [UIView new];
[_inputAccessoryView addSubview:_contentView];
}
return _inputAccessoryView;
[super setFrame:frame];
[_safeAreaContainer setFrame:frame];
}

- (void)insertReactSubview:(UIView *)subview atIndex:(NSInteger)index
{
[super insertReactSubview:subview atIndex:index];
[_contentView insertSubview:subview atIndex:index];
[_safeAreaContainer insertSubview:subview atIndex:index];
}

- (void)removeReactSubview:(UIView *)subview
{
[super removeReactSubview:subview];
[subview removeFromSuperview];
if ([[_inputAccessoryView subviews] count] == 0 && [self isFirstResponder]) {
if ([[_safeAreaContainer subviews] count] == 0 && [self isFirstResponder]) {
[self resignFirstResponder];
}
}
Expand Down
2 changes: 1 addition & 1 deletion Libraries/Text/TextInput/RCTInputAccessoryViewManager.m
Expand Up @@ -23,6 +23,6 @@ - (UIView *)view
return [[RCTInputAccessoryView alloc] initWithBridge:self.bridge];
}

RCT_REMAP_VIEW_PROPERTY(backgroundColor, content.inputAccessoryView.backgroundColor, UIColor)
RCT_REMAP_VIEW_PROPERTY(backgroundColor, inputAccessoryView.backgroundColor, UIColor)

@end

0 comments on commit c136c54

Please sign in to comment.