ano*_*234 13 objective-c ios autolayout
我无法通过单独的.xib文件找到AutoLayout的方式...
我有一个独立的.xib文件,有3个视图 - 标题视图(包含两个标签),一个输入和一个页脚(包含两个按钮).它看起来像这样:

标题视图中的标签具有约束,这些约束应该影响标题视图的垂直大小,进而影响整个视图的大小.子标题是一个带有0行的标签,这意味着它是多行和动态的.其他所有东西都有一个设置高度,水平约束到superview和顶部约束兄弟(或标题视图中的superview).
我遇到的问题是,当我在代码中加载此.xib文件进行显示时,根据Xcode检查器中定义的内容,高度始终是静态的.是否可以根据宽度使整个视图的高度动态变化(这会影响动态标签高度,从而影响视图的其余部分)?
例如 - 如果我从.xib加载此视图并将其宽度设置为300,那么我如何调整其高度以适应动态标签的新高度?我是否需要使用该intrinsicContentSize方法来定义此大小?
ano*_*234 15
经过大量的实验和阅读,我找到了答案.在某种构造函数中加载.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;
}
Run Code Online (Sandbox Code Playgroud)
然后,有必要覆盖layoutSubviews和intrinsicContentSize.覆盖layoutSubviews允许我设置preferredMaxLayoutWidth我的标签,而覆盖intrinsicContentSize允许我根据约束和子视图计算大小!这是我的实现:
- (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;
}
Run Code Online (Sandbox Code Playgroud)
我确信有很多方法可以改善这种情况,或者更好的方法来实现它,但是现在它的尺寸至少是正确的!对于不应具有用户定义帧的视图非常有用.
| 归档时间: |
|
| 查看次数: |
9257 次 |
| 最近记录: |