我无法找到很多与AutoLayout的方式与个别的.xib文件…
我有一个独立的.xib文件,它有3个视图 – 一个标题视图(包含两个标签),一个输入和一个页脚(包含两个按钮).看起来像这样:
标题视图中的标签具有约束,这些约束应影响标题视图的垂直大小,反过来影响整个视图的大小.子标题是带有0行的标签,这意味着它是多行和动态的.其他一切都有一个设置的高度,具有横向限制,以便监视和监视同级的顶级约束(或者在头部视图的情况下监视).
我遇到的问题是,当我在代码中加载这个.xib文件以显示时,高度总是基于Xcode检查员定义的高度.是否可以根据宽度(影响动态标签高度,因此影响视图的其余部分)使整个视图的高度变为动态?
例如 – 如果我从.xib加载这个视图,并将其宽度设置为300,那么我该如何调整其高度以适应动态标签的新高度?我需要使用intrinsicContentSize方法来定义这个大小吗?
解决方法
@H_403_13@ 经过多次实验和阅读,我找到了答案.在某种构造函数中加载.xib(在我的例子中是一个类级别的方法),你必须确保调用[view setTranslatesAutoresizingMaskIntoConstraints:NO];例如,我已经完成了以下操作:+ (InputView *)inputViewWithHeader:(NSString *)header subHeader:(NSString *)subHeader inputValidation:(ValidationBlock)validation { InputView *inputView = [[[NSBundle mainBundle] loadNibNamed:@"InputView" owner:self options:nil] lastObject]; if ([inputView isKindOfClass:[InputView class]]) { [inputView setTranslatesAutoresizingMaskIntoConstraints:NO]; [inputView configureWithHeader:header subHeader:subHeader inputValidation:validation]; [inputView layoutIfNeeded]; [inputView invalidateIntrinsicContentSize]; return inputView; } return nil; }
那么有必要重写layoutSubviews和intrinsicContentSize.覆盖的layoutSubviews允许我设置我的标签的preferredMaxLayoutWidth,而覆盖innerContentSize允许我根据约束和子视图来计算大小!这是我的实现:
- (void)layoutSubviews { [super layoutSubviews]; self.subHeaderLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds); [super layoutSubviews]; } - (CGSize)intrinsicContentSize { CGFloat height = self.headerView.bounds.size.height; height += self.headerInputSpacer.constant; height += self.inputField.bounds.size.height; height += self.inputButtonSpacer.constant; height += self.buttonView.bounds.size.height; CGSize size = CGSizeMake([UIScreen mainScreen].bounds.size.width - 20,height); return size; }