Ios 使用级联自动布局将UIView嵌入到另一个UIView中 我的目标是:

Ios 使用级联自动布局将UIView嵌入到另一个UIView中 我的目标是:,ios,uiview,autolayout,xib,subview,Ios,Uiview,Autolayout,Xib,Subview,我试图找到一个常规方法,如何将我在Interface Builder中创建的视图添加到我在Interface Builder中创建的父视图中,同时让它们的布局约束决定它们各自父视图的大小 关键思想是获得具有可变大小的级联视图。视图应首先通过解析其布局约束来确定其自身的大小。完成后,从superview的角度来看,它有一个固定的大小,因此现在superview可以通过解析自己的布局约束等来确定其大小 我的做法: 我在Xcode中创建了一个新的XIB文件,并在Interface Builder中打

我试图找到一个常规方法,如何将我在Interface Builder中创建的视图添加到我在Interface Builder中创建的父视图中,同时让它们的布局约束决定它们各自父视图的大小

关键思想是获得具有可变大小的级联视图。视图应首先通过解析其布局约束来确定其自身的大小。完成后,从superview的角度来看,它有一个固定的大小,因此现在superview可以通过解析自己的布局约束等来确定其大小


我的做法: 我在Xcode中创建了一个新的XIB文件,并在Interface Builder中打开它。接下来,我将另一个
UIView
从对象库拖动到XIB的视图,以便将其添加为子视图。使用布局约束,我将子视图的所有四边固定到其superview的边上:

现在我创建了另一个XIB文件,它应该是子视图。我将
ui标签
ui按钮
拖到它的视图中。我为按钮提供了固定高度约束,并添加了更多约束以将标签和按钮固定到视图的边缘:

现在是我还没能解决的棘手问题:

我无法找到任何方法仅使用Interface Builder将第二个XIB文件的视图添加到第一个XIB的子视图中(这可能吗?),因此我通过编写一些代码来尝试。我创建了一个
UIView
自定义类,并在Interface Builder中相应地设置了类值。在自定义类中,我添加了以下方法:

- (void)awakeFromNib {
    UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"DynamicSubView" owner:self options:nil] objectAtIndex:0];
    [self.subView addSubview:view];
    view.translatesAutoresizingMaskIntoConstraints = NO;        
    [self addConstraintsForView:view];
}

- (void)addConstraintsForView:(UIView *)view {
    [self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.subView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0]];
    [self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.subView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0]];
    [self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.subView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]];
    [self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.subView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0]];
}
方法
addLayoutConstraintsForView:
将约束从第二个XIB添加到视图,该XIB将其所有四条边固定到子视图的边上。现在,子视图应该根据其包含的视图动态调整大小。然而,它似乎不起作用。有什么好主意或好方法来解决这个问题吗


备注:此处最上面的视图是一个
UITableViewCell
。我想让它自己布局,并使用介绍的方法将其高度传递给它的
tableView

只是想一想:添加约束后,调用
[view setNeedsLayout]有意义吗和/或
[查看设置需要支持日期约束]?不幸的是,两个方法调用都没有任何效果。我猜它们被系统隐式调用了。。。但不确定。谢谢你的主意!我刚刚看到,我想调用父视图上的方法,可能是它的祖父母-可能分别是
self.subView
self.view
。这会对行为产生任何影响吗?只是想一想:添加约束后,调用
[view setNeedsLayout]有意义吗和/或
[查看设置需要支持日期约束]?不幸的是,两个方法调用都没有任何效果。我猜它们被系统隐式调用了。。。但不确定。谢谢你的主意!我刚刚看到,我想调用父视图上的方法,可能是它的祖父母-可能分别是
self.subView
self.view
。这会对行为产生影响吗?