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

bit*_*her 18 interface-builder xcode4 nslayoutconstraint

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

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

中心NSButton的IB约束

中心NSView的IB约束

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

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

rav*_*ron 28

在Interface Builder中设置占位符内在内容大小 - "猜测",如果你愿意的话.

  1. 选择自定义视图.
  2. 显示大小检查器(Shift5).
  3. 将"内部大小"下拉列表从"默认(系统定义)"更改为"占位符".
  4. 在视图的运行时宽度和高度上输入合理的猜测.

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


Fat*_*tie 11

如何实际做到这一点,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()
    }

}
Run Code Online (Sandbox Code Playgroud)

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

以上当然会在运行时完美地工作。但它随机无法在界面构建器中工作(即使是 11+)。

要使其循环,请尝试

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

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

  3. 最后:

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

在此处输入图片说明

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

在最坏的情况下,用通常的清理一切重新启动 Xcode 有时会使其工作。