我是iOS版面的新手,我尝试以编程方式居中自定义视图(实际上是一个扩展RCTRootView
的React Native UIView
,如果这样做的话相关的)具有内在大小的动态内容(在javascript版本中定义)。
我已经看到覆盖intrinsicallySizedContent
的解决方案,但这似乎只与自动布局有关,而RN并未使用。我能够衡量RCTRootView
内容大小的唯一方法是将其添加到视图中,并等待layoutSubViews
的多次传递,直至其{{1}有一个大小。这导致我做了以下努力:
我将frame
包裹在另一个RCTRootView
中并尝试覆盖UIView
,一旦我拥有反应原生内容的大小,就设置我的包装框的大小。
我的包装器已创建并添加到layoutSubViews
的导航栏中,如下所示:
UIViewController
包装器的实现方式如下:
RCTBridge *bridge = ((RCTRootView*)self.view).bridge;
RCTRootView *reactView = [[RCTRootView alloc] initWithBridge:bridge moduleName:navBarCustomView initialProperties:initialProps];
RCCCustomTitleView *titleView = [[TitleWrapperView alloc] initWithFrame:self.navigationController.navigationBar.bounds subView:reactView];
self.navigationItem.titleView = titleView;
self.navigationItem.titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
这适用于iOS 11+,但不适用于iOS 10.3,当按下包含自定义导航(红色框)的屏幕时,导航过渡会将#import "TitleWrapperView.h"
#import <React/RCTRootView.h>
@interface TitleWrapperView ()
@property (nonatomic, strong) RCTRootView *subView;
@end
@implementation TitleWrapperView // Extends UIView
-(instancetype)initWithFrame:(CGRect)frame subView:(RCTRootView*)subView {
self = [super initWithFrame:frame];
if (self) {
self.subView = subView;
self.subView.sizeFlexibility = RCTRootViewSizeFlexibilityWidthAndHeight;
self.clipsToBounds = true;
// Prevent the wrapper from being so large initially as to squash the '< Back' button down to '<'
self.frame = CGRectZero;
[self addSubview:subView];
}
return self;
}
-(void)layoutSubviews {
[super layoutSubviews];
CGRect contentViewFrame = self.subView.contentView.frame;
if (contentViewFrame.size.width > 0) {
// Once we have a measurement for the sub-view's content, set the wrapper's frame
if (self.frame.size.width != contentViewFrame.size.width) {
self.frame = contentViewFrame;
}
}
}
@end
向左上方移动,而不是进入中心(最终位置,这是正确的),因为我希望:
可能有一种方法可以克服上面的iOS 10故障(我很乐意听到它),但我相当肯定必须有更好的方法。是否可以允许任意复杂的视图在将其添加到父级之前进行自我测量并进行测量?我还尝试在导航栏中调用我的包装器中覆盖titleView
,并使用sizeThatFits
请求我RCTRootView
的大小,但我得[subView sizeThatFits: myLargeContainer]
回来。
我感到茫然 - 任何指针都表示赞赏。