我正在编写无笔尖的视图,其中所有布局逻辑都使用自动布局。我发现自己必须在实例化的每个视图中关闭自动调整大小功能。我的代码杂乱无章:
calc()
理想情况下,我只是想
calc(var(--grid-item-width) * 1.6)
并一劳永逸地解决它,但是扩展不能覆盖存储的属性。
还有其他简单的方法可以永久关闭自动调整大小吗?
答案 0 :(得分:1)
这只是一个建议,因为它总是烦人,总是将其设置为false,只需为UIView
的所有共享设置设置一个函数,然后每次都调用它,
节省时间,并且比每次尝试设置值都要麻烦,
extension UIView {
func notTranslated() {
self.translatesAutoresizingMaskIntoConstraints = false
//Add any additional code.
}
}
//Usage
let view = UIView()
view.notTranslated()
您不能override
约束属性,因为UIView
可能在IB
根据apple将AutoresizingMaskIntoConstraints 转换。
默认情况下,以编程方式创建的任何视图的属性都设置为true。如果在Interface Builder中添加视图,则系统会自动将此属性设置为false。
想象一下,如果您可以override
来extension
,而如果存在其他UIView
却具有相反值True || false
,则会导致一些冲突,因此我的意见:
Apple这样做是为了防止与视图约束发生任何冲突,因此,如果您不想每次编写它,只需将其包装在一个函数中即可。
如果有人有其他信息,请不要犹豫。
更新:我找到了this很酷的答案,该答案也可能有用,请查看下面的代码。
class MyNibless: UIView {
//-----------------------------------------------------------------------------------------------------
//Constructors, Initializers, and UIView lifecycle
//-----------------------------------------------------------------------------------------------------
override init(frame: CGRect) {
super.init(frame: frame)
didLoad()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
didLoad()
}
convenience init() {
self.init(frame: CGRect.zero)
}
func didLoad() {
//Place your initialization code here
//I actually create & place constraints in here, instead of in
//updateConstraints
}
override func layoutSubviews() {
super.layoutSubviews()
//Custom manually positioning layout goes here (auto-layout pass has already run first pass)
}
override func updateConstraints() {
super.updateConstraints()
//Disable this if you are adding constraints manually
//or you're going to have a 'bad time'
//self.translatesAutoresizingMaskIntoConstraints = false
translatesAutoresizingMaskIntoConstraints = false
//Add custom constraint code here
}
}
var nibless: UIView = MyNibless()
//Usage
nibless.updateConstraints()
print(nibless.translatesAutoresizingMaskIntoConstraints) //false
因此只需将MyNibless
实例创建为UIView
,这也为自定义打开了很大的大门