什么时候为 Swift 中的视图/图层设置边界和框架?
Posted
技术标签:
【中文标题】什么时候为 Swift 中的视图/图层设置边界和框架?【英文标题】:When is bounds and frame set for views/layers in Swift? 【发布时间】:2014-06-12 04:41:22 【问题描述】:我在 UIView
子类中有这样的东西:
override var bounds : CGRect
didSet
somelayer.frame = bounds
在对应的somelayer
,我有这个:
override var bounds: CGRect
didSet
someFunction()
现在如果使用super.init(frame: someFrame)
初始化视图,则不会调用第一个块。这似乎表明bounds
属性未与frame
一起设置。
如果我将第一个块更改为override var frame
,那么它将被super.init(frame: someFrame)
调用,它会设置somelayer
的frame
。有趣的是,当这种情况发生时,会调用第二个块,这表明同时设置了 bounds
和 frame
(这也是我所期望的)。
我在这里遗漏了什么吗?
【问题讨论】:
【参考方案1】:Property Observers 在初始化期间不会被调用。
第一个属性时不会调用 willSet 和 didSet 观察者 初始化。它们仅在设置属性值时调用 在初始化上下文之外。
也许是内部构造视图的方式,框架是在初始化后设置的,但边界不是。
那么稍后,在设置layer的frame的时候,bounds也是通过内部方法更新的。
【讨论】:
谢谢!我应该更小心地使用 RTFM。 使用 Swift 2 / ios9 我看到 willSet / didSet 在初始化上下文中被调用,在我的情况下,当子类化 UIView 时,我看到它们是从 super.init(coder: aDecoder) 内部调用的初始化?(编码器 aDecoder:NSCoder)。实际上我遇到了相反的问题,即使值发生了变化,frame
属性上的观察者似乎也没有在 初始化之后被调用。
@JarrodSmith 我也面临同样的问题 - 你找到解决方案了吗?
@swalkner 不,我最终不得不使用不同的方法。以上是关于什么时候为 Swift 中的视图/图层设置边界和框架?的主要内容,如果未能解决你的问题,请参考以下文章
将 UIScrollView contentOffset 和 contentSize 转换为图层位置和边界属性