何时在Swift中为视图/图层设置边界和框架?

5

我在一个 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个回答

6
属性观察者在初始化时不会被调用。
willSet和didSet观察者只有在属性的值在初始化上下文之外被设置时才会被调用。
也许是视图在内部构建时,框架是在初始化后设置的,但边界没有被设置。
随后,当设置图层的框架时,内部方法还会更新边界。

1
谢谢!我应该更仔细地阅读文档。 - danqing
使用Swift 2 / iOS9,我发现在初始化上下文中调用了willSet / didSet,在我的情况下,当子类化UIView时,我看到它们从super.init(coder: aDecoder)内部被调用。实际上,我遇到了相反的问题,即使值发生变化,frame属性上的观察者在初始化之后似乎也没有被调用。 - Jarrod Smith
@JarrodSmith 我也遇到了同样的问题 - 你找到解决方法了吗? - swalkner
@swalkner 不好意思,最终我不得不采用另一种方法。 - Jarrod Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接