什么时候为 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) 调用,它会设置somelayerframe。有趣的是,当这种情况发生时,会调用第二个块,这表明同时设置了 boundsframe(这也是我所期望的)。

我在这里遗漏了什么吗?

【问题讨论】:

【参考方案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 转换为图层位置和边界属性

Swift mapview图层蒙版裁剪/移动视图。我究竟做错了什么?

gis中poi点和边界对不上

沿着图层的特定路径快速制作动画

图层和阴影上的圆角半径

CALayer