【发布时间】:2021-01-05 04:44:02
【问题描述】:
我经常发现自己在编写这些代码行:
myView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
myView.topAnchor.constraint(equalTo: myView.superview.topAnchor),
myView.bottomAnchor.constraint(equalTo: myView.superview.bottomAnchor),
myView.leadingAnchor.constraint(equalTo: myView.superview.leadingAnchor),
myView.trailingAnchor.constraint(equalTo: myView.superview.trailingAnchor)
])
所以我正在考虑写一个扩展。像这样的:
extension UIView {
func bindFrameToSuperviewBounds() {
self.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
self.topAnchor.constraint(equalTo: self.superview.topAnchor),
self.bottomAnchor.constraint(equalTo: self.superview.bottomAnchor),
self.leadingAnchor.constraint(equalTo: self.superview.leadingAnchor),
self.trailingAnchor.constraint(equalTo: self.superview.trailingAnchor)
])
}
}
我的问题:
-
也许像这样的一些内置功能(或技术)已经存在,我只是不知道(不过我已经用谷歌搜索了很多)
-
(理论上)这段代码不等同于:
myView.translatesAutoresizingMaskIntoConstraints = true myView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
理论上为什么?因为在实践中它绝对不是等价的。这种替代技术从未给我预期的结果。结果几乎是不可预测的。
回答cmets:
地点:
绿色(外部)矩形是一个 containerView (UIView)。
紫色(内部)矩形是我正在插入的 UIStackView。
如您所见,约束方法效果很好。
下一个是自动调整掩码方法的结果:
为什么会有三张图片?
因为每次新启动应用程序的结果都不同!
【问题讨论】:
-
要使非自动布局示例等效,您还必须添加
myView.frame = myView.superview.bounds。 -
第二个问题可能重复:stackoverflow.com/questions/36434947/…
-
@Rob 我已经尝试了所有这些属性的所有可以想象的组合,但我从未得到相同的结果。我刚刚又试了一次你的建议。没有。
-
@Sweeper 是的,它相关且有趣。但他们没有讨论如何实现对等。
-
这种技术 (a) 将子视图的
frame设置为其父视图的bounds; (b) 设置自动调整掩码,这正是我们在约束之前这样做的方式。我刚刚测试了它,它工作正常。您将需要创建一个MCVE 来显示问题。也许你有一些不相关的代码在事后改变了translatesAutoresizingMaskIntoConstraints或autoresizingMask。或者您还有其他一些相互冲突的约束。但是这种autoresizingMask技术是一种久经考验的真正技术......
标签: swift autolayout nslayoutconstraint