我们可以将具有自动布局的 XIB 加载为以编程方式创建的没有自动布局的视图的子视图,并使用父视图调整子视图的大小吗?

Posted

技术标签:

【中文标题】我们可以将具有自动布局的 XIB 加载为以编程方式创建的没有自动布局的视图的子视图,并使用父视图调整子视图的大小吗?【英文标题】:Can we load an XIB with auto layout as a subview of a view created programmatically without auto layout and have the subview resize with parent view? 【发布时间】:2015-06-29 13:19:42 【问题描述】:

背景:

刚开始学习和使用自动布局。所以我可能会在约束方面出错。 同时支持 ios7 和 iOS8,所以还没有尝试过尺寸等级。

场景: 我有一个以编程方式创建的超级视图,它出现在应用程序的所有屏幕中。现在我尝试加载一个 XIB 并将其作为子视图分配给这个超级视图。它在 iPhone 中看起来不错(因为 XIB 是按照 iPhone 尺寸设计的)。但在 iPad 中,使用相同的 XIB,子视图保持 iPhone 的尺寸。

这个设置有什么方法可以在 iPad 上工作,让 XIB 调整大小以填充屏幕而不在子视图和父视图之间设置约束?

如果您认为有帮助,我会发布现有的限制条件。

【问题讨论】:

您可以通过在添加子视图时设置子视图的框架或以编程方式向子视图添加约束来实现。 Tejvansh Singh Chhabra 的评论实际上是正确的答案,我认为。 @TejvanshSinghChhabra 非常感谢。有效!就像在添加子视图时设置框架一样简单,这对我的情况有所帮助。您可以发布相同的答案,我会接受。 @darshanr,我添加了我的评论作为答案。您现在可以接受并投票。所以,其他人可以知道真正的答案.. :) 【参考方案1】:

您可以通过在添加子视图时设置子视图的框架或以编程方式向子视图添加约束来实现它。

享受.. :)

【讨论】:

【参考方案2】:

您应该在以编程方式创建视图后从 xib 中为视图添加约束。将其视为主视图的常规子视图。所以

    从 xib 创建您的视图

    UIView *someView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([YOUR_VIEW_CLASS_NAME class]) owner:self options:nil] lastObject];

    将其添加为子视图

    [yourSuperview addSubview: someView];

    为上、下、左、右添加约束

NSDictionary *views = @@"someView":self.background;

[yourSuperview addConstraints:[NSLayoutConstraint
                      constraintsWithVisualFormat:@"H:|[someView]|"
                      options:0
                      metrics:nil
                      views:views]];

[yourSuperview addConstraints:[NSLayoutConstraint
                      constraintsWithVisualFormat:@"V:|[someView]|"
                      options:0
                      metrics:nil
                      views:views]];
    通过[someView setNeedsLayout];呼叫更新

【讨论】:

以上是关于我们可以将具有自动布局的 XIB 加载为以编程方式创建的没有自动布局的视图的子视图,并使用父视图调整子视图的大小吗?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 从 xib 加载的 UITableViewCell - 自动布局和高度不正确

以编程方式在 xib 上使用自动布局创建的两个文本字段之间添加 uiview

使用自动布局以编程方式创建视图层次结构

具有自动布局约束的 UITableViewCell 子类大小不正确

从 xib 获取特定的视图控制器?

从 Xib 加载视图在自动布局后调整框架子视图的大小