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

时间:2014-09-23 15:08:57

标签: ios objective-c xcode interface-builder autolayout

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

但是,在调试时,Interface Builder似乎为宽度添加了自己的运行时约束,它会覆盖内在宽度。我该如何防止这种情况?

1 个答案:

答案 0 :(得分:2)

首先,请确保通过指定无高度来正确实施intrinsicContentSize

- (CGSize)intrinsicContentSize
{
    return CGSizeMake(100.0f, UIViewNoIntrinsicMetric);
}

然后,如果你的视图的唯一约束是center-x,height和bottom-margin,那么IB应该提示一个模糊的布局,在文档大纲的右上角有一个小红色箭头(视图列表上的画布的左边。)

ambiguous constraints indicator ambiguous constraints details

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

然后,您必须指明的尺寸与从intrinsicContentSize返回的尺寸相同:

placeholder intrinsic size

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

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