【发布时间】:2016-05-02 01:53:24
【问题描述】:
在 AutoLayout 中,我们可以根据约束排列多个视图,例如,如果我有一个 UILabel 和一个 UIImageView 定位在一行中,我可以这样做:
UILable *label = [UILabel new];
UIImageView *imageView = [UIImageView new];
[self.view addSubview:label];
[self.view addSubview:imageView];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.bottom.top.equalTo(self.view);
make.right.equalTo(imageView.mas_left);
}];
[imageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.bottom.top.equalTo(self.view);
}];
现在,如果我想保持label的内容不被压缩,传统的AutoLayout方式是设置label的contentCompressionResistancePriority更高,那么布局系统将保持label的内容不被压缩,如果水平轴剩余空间不够,imageView 的宽度会被压缩。所有这一切都基于content size,或intrinsicContentSize。
继续,我将在 JS 中重新实现一个原生自定义视图,它使用intrinsicContentSize 属性来计算它是否应该完全显示其内容。自定义视图的目标是水平并排显示多个标签,在我的原生实现中,我将检查layoutSubviews方法中每个子视图的边界是否超出其超级视图:
-(void)layoutSubviews {
[super layoutSubviews];
CGFloat width = 0;
bool update = NO;
for(UIView * subview in self.subviews) {
if(subview.frame.origin.x + subview.width > self.width) {
subview.hidden = YES;
update = YES;
} else {
subview.hidden = NO;
width = subview.origin.x + subview.width;
}
}
if(update) {
self.fitSize = CGSizeMake(width, self.fitSize.height);
[self invalidateIntrinsicContentSize]; //in intrinsicContentSize method, return self.fitSize
}
}
现在 AutoLayout 知道视图的实际大小,它将基于视图的实际大小进行布局。我也想使用 react native 来实现这一点,但是我发现我无法设置两个组件之间的关系,例如我使用基于约束的 AutoLayout 也无法覆盖 intrinsicContentSize 方法来计算我想要的视图的实际大小,是这个用例有什么解决方案吗?
【问题讨论】:
标签: ios flexbox react-native