AutoLayout Dynamic .xib查看高度

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)

然后,有必要覆盖layoutSubviewsintrinsicContentSize.覆盖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)

我确信有很多方法可以改善这种情况,或者更好的方法来实现它,但是现在它的尺寸至少是正确的!对于不应具有用户定义帧的视图非常有用.