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

Xcode4 如何使Interface Builder在基于约束的布局中尊重自定义视图的固有内容大小?,xcode4,interface-builder,nslayoutconstraint,Xcode4,Interface Builder,Nslayoutconstraint,XCode 4.5中的Interface Builder尊重某些视图的intrinsicContentSize,例如NSButton,但我无法说服它在我自己的自定义子视图中尊重它。这会导致IB添加额外的约束,试图强制在IB中绘制布局,从而导致在程序运行时不使用内部大小 例如,考虑以窗口为中心的按钮,以窗口为中心的自定义视图… 您可以看到定制视图有四个约束,可能是因为IB不知道视图的intrinsicContentSize。您可以更改添加的额外约束,例如,您可以强制将其改为“宽度”和“高度”,但不

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

例如,考虑以窗口为中心的按钮,以窗口为中心的自定义视图…

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


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

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

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

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

这样IB将调整您的自定义视图的大小以适应占位符视图,而Autolayout将取决于您的视图在运行时对-CGSizeintrinsicContentSize的覆盖,以确定您的自定义视图的大小

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

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

我知道这是一个黑客行为,但希望它能帮助您。

在Interface Builder中设置一个占位符固有内容大小-如果您愿意,这是一个猜测

选择自定义视图。 显示尺寸检查器⌘移位5。 将“内部大小”下拉列表从“默认系统定义”更改为“占位符”。 输入对视图运行时宽度和高度的合理猜测。 这些约束在编译时被删除,这意味着它们对正在运行的应用程序没有影响,布局引擎将在运行时添加适当的约束,以尊重视图的intrinsicContentSize。

如何实际执行此操作,2019年 然而,有一个问题。Xcode有缺陷。有时,您可以通过以下方式重置它: 当然,上述方法在运行时可以完美地工作。但即使使用11+,它也无法在interface builder中正常工作

要使其循环,请尝试

通常的“刷新所有视图”

将一个无意义的约束附加到一个内部大小视图并将其删除。我注意到,如果你有很多,对一个这样做通常足以使Xcode循环,那么它们都可以工作

最后:

Xcode具有固有的大小占位符功能

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


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

您找到解决此问题的方法了吗?:注:2019年,现在有一个解决方案。回答如下,但不是最好的方法。如果它可以运行intrinsicContentSize方法并直接在Interface Builder中使用结果,就像它对IBDesignable所做的那样,那将是非常棒的。回答如下。Yo\u使用invalidateIntrinsicContentSize@Fattie我完全同意你的看法,现在有了占位符选项和autolayout/IB的巨大改进,这是完全没有必要的。但请记住,我早在2013年就回答了这个问题,当时这些问题都还不存在@马里亚姆克。也许你在上面的评论中写道,你的答案不再是最新的。对于我来说,添加@IBDesignable是获得Xcode以尊重内容大小的必要条件。@BalázsVincze,一个重要的观点,IBDesignable在当前的Xcode中基本上是无可救药地被破坏的:/我们遗憾地发现,它在任何非平凡的故事情节中都完全失败了-sadOhh,真遗憾。。。幸运的是,我在其中使用自定义视图的XIB确实微不足道。
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()
    }

}