23

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

例如,考虑在窗口中居中的按钮,以及在窗口中居中的自定义视图……</p>

居中 NSButton 的 IB 约束

居中 NSView 的 IB 约束

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

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

4

3 回答 3

34

在 Interface Builder 中设置占位符内在内容大小——“猜测”,如果你愿意的话。

  1. 选择您的自定义视图。
  2. 显示尺寸检查器 (⌘</kbd>Shift5).
  3. 将“固有大小”下拉菜单从“默认(系统定义)”更改为“占位符”。
  4. 在视图的运行时宽度和高度输入合理的猜测。

这些约束在编译时被删除,这意味着它们不会影响您正在运行的应用程序,并且布局引擎将在运行时添加适当的约束以尊重您视图的intrinsicContentSize.

于 2014-08-29T19:03:47.940 回答
12

如何实际做到这一点,2019

import UIKit

@IBDesignable class TagPerson: ShadowRoundedImageView {

    override var intrinsicContentSize: CGSize {
        var s = super.intrinsicContentSize
        s.height = 40
        s.width = 40
        return s
    }

    override func prepareForInterfaceBuilder() {
        invalidateIntrinsicContentSize()
    }

}

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

上述内容当然会在运行时完美运行。但它随机无法在界面生成器中工作(即使是 11+)。

要使其循环,请尝试

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

  2. 将无意义的约束附加和删除到您的固有尺寸视图之一。(我注意到如果你有很多,对一个执行此操作通常足以使 Xcode 循环,然后它们都可以工作。)

  3. 最后:

Xcode 具有“固有大小占位符”功能。

在此处输入图像描述

选择一个或多个内在尺寸元素。来回切换奇怪的占位符几次。通常这会使其循环,然后视图将正常工作。

在最坏的情况下,使用通常的 clean-everything 重新启动 Xcode 有时会使其正常工作。

于 2019-09-03T17:58:05.033 回答
2

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

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

在此处输入图像描述

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

在此处输入图像描述

这样,IB 将调整您的自定义视图的大小以适合占位符视图,并且自动布局将取决于您的视图- (CGSize)intrinsicContentSize在运行时的覆盖来确定您的自定义视图的大小。

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

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

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

于 2013-04-17T09:33:38.367 回答