Interface Builder 运行时自动布局约束阻止视图占用固有大小,我该如何解决这个问题?

Posted

技术标签:

【中文标题】Interface Builder 运行时自动布局约束阻止视图占用固有大小,我该如何解决这个问题?【英文标题】:Interface Builder runtime autolayout constraints preventing view from occupying intrinsic size, how do I fix this? 【发布时间】:2014-09-23 15:08:57 【问题描述】:

我有一个自定义的UIView 子类,它有一个intrinsicContentSize。视图在 IB 中声明,具有 3 个约束,center-x、height 和 bottom margin。当应用程序运行时,我希望视图占用的宽度等于固有宽度。

但是,在调试时,Interface Builder 似乎为宽度添加了自己的运行时约束,从而覆盖了固有宽度。如何防止这种情况发生?

【问题讨论】:

【参考方案1】:

首先,确保您正确实现了intrinsicContentSize,不指定高度:

- (CGSize)intrinsicContentSize

    return CGSizeMake(100.0f, UIViewNoIntrinsicMetric);

然后,如果您的视图的唯一约束是 center-x、height 和 bottom-margin,IB 应该在文档大纲的右上角(视图列表画布的左侧)。

为了让 IB 满意,并防止它在构建应用程序时添加缺少的约束,您必须告诉它视图具有自定义的内在内容大小。为此,请选择视图,选择右侧的 Size Inspector 面板,然后在最底部将 Intrinsic Size 从“默认(系统定义)”更改为“占位符”。

然后您必须指定与从intrinsicContentSize 返回的大小相同的大小:

这告诉 IB 将在运行时定义一个内在的内容大小,并且在设计时它应该使用这些值。

请注意,如果您在方法实现中指定了UIViewNoIntrinsicMetric,则应在 IB 中选中“无”。 此外,您在此处键入的值对运行时没有影响。这只是设计时 IB 的一个指标。

【讨论】:

以上是关于Interface Builder 运行时自动布局约束阻止视图占用固有大小,我该如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode Interface builder 中的 Nib 视图不应用自动布局约束

Interface Builder 约束问题

在 Interface Builder 中删除自动布局(约束)

Interface Builder 中的相对自动布局约束

与在 Interface Builder 中使用自动布局相比,SnapKit 有啥优势?

Interface Builder 中的自动布局根据外部视图的宽度/高度更改布局