微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – AutoLayout动态.xib查看高度

我无法找到很多与AutoLayout的方式与个别的.xib文件

我有一个独立的.xib文件,它有3个视图 – 一个标题视图(包含两个标签),一个输入和一个页脚(包含两个按钮).看起来像这样:

标题视图中的标签具有约束,这些约束应影响标题视图的垂直大小,反过来影响整个视图的大小.子标题是带有0行的标签,这意味着它是多行和动态的.其他一切都有一个设置的高度,具有横向限制,以便监视和监视同级的顶级约束(或者在头部视图的情况下监视).

我遇到的问题是,当我在代码中加载这个.xib文件显示时,高度总是基于Xcode检查员定义的高度.是否可以根据宽度(影响动态标签高度,因此影响视图的其余部分)使整个视图的高度变为动态?

例如 – 如果我从.xib加载这个视图,并将其宽度设置为300,那么我该如何调整其高度以适应动态标签的新高度?我需要使用intrinsicContentSize方法来定义这个大小吗?

解决方法

经过多次实验和阅读,我找到了答案.在某种构造函数中加载.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;
}

我相信有办法改进这个,或者更好的方法来实现,但现在它至少是正确的大小!对于不应有用户定义的框架的视图非常有用.

原文地址:https://www.jb51.cc/iOS/329674.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐