属性观察器为边界工作,但不为框架工作



我正在做这个项目,我在故事板上有一个场景。

场景是一个 TableViewController。

  • 表视图具有自定义原型单元格(链接到自定义单元格.swift)。

    • 在原型单元格中有一个标签和一个自定义UIView(链接到CustomView.swift)。这些元素具有相对于原型单元格的内容视图的布局约束。

现在,我希望在自定义视图上绘制的内容在视图大小更改时更改,以便在设备旋转时将其调整为新的单元格宽度。由于这些约束,在旋转设备后,当自定义单元格更改大小时,自定义视图的框架将更改。为了检测这一点,我在 CustomView 中添加了两个属性观察器.swift:

override var frame: CGRect {
    didSet {
        print("Frame was set!")
        updateDrawing()
    }
}
override var bounds: CGRect {
    didSet {
        print("Bounds were set!")
        updateDrawing()
    }
}

运行项目时,当我旋转设备时,第二个观察器工作正常。第一个观察者没有。我的问题是为什么第一个观察者没有检测到框架发生了变化?

.frame 是根据视图(和转换)的 .bounds 和 .center 计算的,因此它不会改变。为了对旋转做出反应,请覆盖以下内容(从 iOS8 开始):

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    coordinator.animateAlongsideTransition({ (coordinator) -> Void in
        // do your stuff here
        // here the frame has the new size
    }, completion: nil)
}

最新更新