在Xcode 4.5中设置translatesAutoresizingMaskIntoConstraints的位置

38
我需要将translatesAutoresizingMaskIntoConstraints设置为NO。默认情况下,它被设置为YES(以帮助大多数应用程序从struts和springs过渡到新的自动布局)。
在Xcode中是否有任何地方可以将默认值从YES更改为NO
还是说我必须手动为每个视图进行设置?
4个回答

22

我晚了回答这个问题,但在Xcode 5和6中仍然缺少提到的选项,因此该问题仍然有意义。

实际上,我们可以通过在Storyboard(Interface Builder)中添加用户定义的运行时属性来设置视图/控件/对象的任何属性值,如以下屏幕截图所示。

并且这也适用于translatesAutoresizingMaskIntoConstraints。 因此,这个问题可以解决。

enter image description here


这是一个很棒的解决方案,但我认为它会导致XCode 6.3 beta 2中的“冻结”。当我将其移除后,我的视图正常加载。但是如果保留它,在升级到beta 2后,应用程序会崩溃。 - Steve N
2
这在 XCode 9 和 iOS 11 中运行正常,对于寻找更新解决方案的任何人来说,这应该是现在被接受的答案。 - JasonD

17
这是一个很好的问题 - 我自己也试图找到答案。不幸的是,看起来没有“快速解决方案”。目前,苹果公司认为基于约束的布局是选择性的 - 甚至在 UIView 类参考文档中指定了一个部分:

选择加入基于约束的布局

但这种选择并不是全局的。我认为这是因为如果你仅仅把弹簧和支架转换成约束条件,有些 UI 元素会崩溃,或者你会得到大量无法满足的约束条件错误。
我能想到一个可能的解决方案 - 我自己没有尝试过,但你可以在UIView上创建一个类别,将所有 UIView 对象设置为返回 - (BOOL)translatesAutoresizingMaskIntoConstraints 的值为 NO。虽然我不知道这会导致什么问题,但它将全局地将translatesAutoresizingMaskIntoConstraints 设置为NO
如果你想了解更多关于类别的信息,请查看这个很好的类别介绍

如何使用分类将所有UIView对象设置为不返回任何内容?分类方法仅适用于实例。 - Boon
4
这个答案已经被接受了,但它是否有效呢?我认为这种方法可能会出现问题。 - Douglas Hill
category方法会覆盖原始方法,@Boon,并且每个实例都使用新的实现。除非原始方法本身是在类别中实现的。 - jscs

5

2
好的发现。请注意,UICollectionViewCell的contentView是一个例外。 - Reuben Scratton

5

当您需要更改子视图的大小或位置时,请在设置子视图的框架之前使用(BOOL)translatesAutoresizingMaskIntoConstraints方法。

[self.benchmarkButton removeFromSuperview];
[self.benchmarkButton setTranslatesAutoresizingMaskIntoConstraints:YES];
[self.benchmarkButton setFrame:CGRectMake(20, self.benchmarkButton.frame.origin.y+40, 260, 30)];
[self.benchmarksView addSubview:self.benchmarkButton];

这样你的子视图就不会受到约束的影响,因为它是Xcode 4.3及以上版本中的默认(自动布局)。谢谢。


不错,但我猜想这样做可能会导致冲突,而不是考虑如何与现有的约束条件一起工作。 - Danyal Aytekin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接