为了解决与以编程方式将子视图添加到滚动视图相关的自动布局问题,我在整个互联网上遇到了many个引用,在各种情况下都说要设置translatesAutoresizingMaskIntoConstraints = YES
或translatesAutoresizingMaskIntoConstraints = NO
,视具体情况而定。
然而,在Swift中,当我输入:
var view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
我收到了内嵌错误:Cannot assign to 'translatesAutoresizingMaskIntoConstraints' in 'view'
。为什么?因为,在检查时,您会发现它是无参数函数,而不是属性。
我已经通过子类化解决了这个问题,但是为了设置translatesAutoresizingMaskIntoConstraints
只需设置class CardView: UIView {
override func translatesAutoresizingMaskIntoConstraints() -> Bool {
return false
}
}
,我必须对每个视图进行子类化,这是一个很大的不便:
{{1}}
有没有人知道解决这个问题的方法,或者能否解释一般互联网理事会告诉你的内容与你在Swift中实际可以做的事情之间的差异?
答案 0 :(得分:21)
translatesAutoresizingMaskIntoConstraints实际上是UIView上的一个方法而不是属性。
语法有效,因为ObjC允许您使用点符号来调用方法(还有关于属性如何实际自动生成getter / setter方法的其他讨论)。
使用该方法而不是尝试使用ObjC中的属性表示法
view.setTranslatesAutoresizingMaskIntoConstraints(false)
答案 1 :(得分:3)
改为使用view.setTranslatesAutoresizingMaskIntoConstraints(false)
。
答案 2 :(得分:3)
Swift 2
view.translatesAutoresizingMaskIntoConstraints = false
答案 3 :(得分:0)
如果您在代码中创建任何视图,如文本视图,按钮,标签等。 您需要小心如何向它们添加自动布局约束。这样做的原因是iOS为您创建了与新视图的大小和位置匹配的约束,如果您尝试添加自己的约束,则这些约束将会发生冲突,您的应用将会中断。
让我们举一个uilabel的例子:
let titleLabel = UILabel()
titleLabel.translatesAutoresizingMaskIntoConstraints = false
同样在你的情况下:
let newView = UIView(frame: CGRectZero)
addSubview(newView)
newView.translatesAutoresizingMaskIntoConstraints = false