XCode 4.5中的Interface Builder尊重某些视图的intrinsicContentSize,例如: NSButton,但我无法说服它在我自己的自定义子视图中尊重它。这会导致IB添加额外的约束,试图强制在IB中绘制布局,这会导致在程序运行时不使用内在大小。
例如,考虑一个以窗口为中心的按钮,以及一个以窗口为中心的自定义视图......
您可以看到自定义视图有四个约束,大概是因为IB不知道视图的intrinsicContentSize。您可以更改添加的额外约束,例如您可以将其强制为宽度和高度,但不能删除它们。
我现在通过搜索和删除awakeFromNib中的额外约束来解决这个问题,但必须有更好的方法来做到这一点。
答案 0 :(得分:27)
设置占位符内在内容大小 - a" guess,"如果你愿意 - 在Interface Builder中。
这些约束在编译时被删除,这意味着它们对您正在运行的应用程序没有任何影响,并且布局引擎将在运行时添加适当的约束以尊重您的视图intrinsicContentSize
。
答案 1 :(得分:4)
fastboot devices
以上内容当然可以在运行时完美地运行。但是它随机无法在界面生成器中运行(即使在10.3中也是如此)。
要使其循环,请尝试
通常的“刷新所有视图”
为您的固有尺寸视图之一附加和删除无意义的约束。 (我已经注意到,如果您有很多,对一个代码执行一次通常足以使Xcode循环,那么它们都可以工作。)
最后:
Xcode具有“内在尺寸占位符” 功能。
选择一个或多个固有大小元素。前后几次切换离奇的占位符。通常,它会循环运行,然后视图才能正常工作。
在最坏的情况下,使用通常的所有清理方法重新启动Xcode通常会使其正常工作。
答案 2 :(得分:1)
好的,这里的要点是让Xcode在IB中使用自定义视图的 intrinsicContentSize 。
这可以通过在IB中的自定义视图中添加占位符视图来实现,具有固定的宽度和高度(您也可以水平和垂直居中)
然后选择您的自定义视图,然后点击IB中的编辑菜单“尺寸以适合内容”。 此时,所有额外的大小定义约束都将是可删除的,只留下定位约束。
这样,IB会根据占位符视图调整自定义视图的大小,而Autolayout将取决于您的视图在运行时覆盖- (CGSize)intrinsicContentSize
以确定自定义视图的大小。
最后一步是删除占位符视图,以允许您的视图正确显示其内容和大小:
- (void)viewDidLoad
{
[super viewDidLoad];
[_placeholderView removeFromSuperview];
}
我知道这是一个黑客,但希望它可以帮助你。