在基于约束的布局中,如何使Interface Builder尊重自定义视图的内在内容大小?

时间:2012-12-05 16:16:16

标签: xcode4 interface-builder nslayoutconstraint

XCode 4.5中的Interface Builder尊重某些视图的intrinsicContentSize,例如: NSButton,但我无法说服它在我自己的自定义子视图中尊重它。这会导致IB添加额外的约束,试图强制在IB中绘制布局,这会导致在程序运行时不使用内在大小。

例如,考虑一个以窗口为中心的按钮,以及一个以窗口为中心的自定义视图......

IB constraints for centered NSButton

IB constraints for centered NSView

您可以看到自定义视图有四个约束,大概是因为IB不知道视图的intrinsicContentSize。您可以更改添加的额外约束,例如您可以将其强制为宽度和高度,但不能删除它们。

我现在通过搜索和删除awakeFromNib中的额外约束来解决这个问题,但必须有更好的方法来做到这一点。

3 个答案:

答案 0 :(得分:27)

设置占位符内在内容大小 - a" guess,"如果你愿意 - 在Interface Builder中。

  1. 选择自定义视图。
  2. 显示尺寸检查器( Shift 5 )。
  3. 更改"内在大小"从"默认(系统定义)"下拉到"占位符。"
  4. 在您的视图的运行时宽度和高度上输入合理的猜测。
  5. 这些约束在编译时被删除,这意味着它们对您正在运行的应用程序没有任何影响,并且布局引擎将在运行时添加适当的约束以尊重您的视图intrinsicContentSize

答案 1 :(得分:4)

如何实际执行此操作,2019年

fastboot devices

但是,有问题。 Xcode是越野车。您有时可以通过以下方式重置它:

以上内容当然可以在运行时完美地运行。但是它随机无法在界面生成器中运行(即使在10.3中也是如此)。

要使其循环,请尝试

  1. 通常的“刷新所有视图”

  2. 为您的固有尺寸视图之一附加和删除无意义的约束。 (我已经注意到,如果您有很多,对一个代码执行一次通常足以使Xcode循环,那么它们都可以工作。)

  3. 最后:

Xcode具有“内在尺寸占位符” 功能。

enter image description here

选择一个或多个固有大小元素。前后几次切换离奇的占位符。通常,它会循环运行,然后视图才能正常工作。

在最坏的情况下,使用通常的所有清理方法重新启动Xcode通常会使其正常工作。

答案 2 :(得分:1)

好的,这里的要点是让Xcode在IB中使用自定义视图的 intrinsicContentSize

这可以通过在IB中的自定义视图中添加占位符视图来实现,具有固定的宽度和高度(您也可以水平和垂直居中)

enter image description here

然后选择您的自定义视图,然后点击IB中的编辑菜单“尺寸以适合内容”。 此时,所有额外的大小定义约束都将是可删除的,只留下定位约束。

enter image description here

这样,IB会根据占位符视图调整自定义视图的大小,而Autolayout将取决于您的视图在运行时覆盖- (CGSize)intrinsicContentSize以确定自定义视图的大小。

最后一步是删除占位符视图,以允许您的视图正确显示其内容和大小:

   - (void)viewDidLoad
    {
        [super viewDidLoad];
        [_placeholderView removeFromSuperview];
    }

我知道这是一个黑客,但希望它可以帮助你。