public weak var boundsDelegate:viewboundsObservation?
意志力{
边界委托?.boundswillchange(自我)
迪塞特{
}
意志力{
print(“frame willset frame:\(frame),bounds:\(bounds)”)
边界委托?.boundswillchange(自我)
}
迪塞特{
print(“frame didset frame:\(frame),bounds:\(bounds)”)
边界委托?.boundsdidchange(自我)
}
}
}
在我的示例代码中,如果旋转设备,您将看到在一种情况下,当我观察根视图时(viewcontrollersself.view——以蓝色显示),我将永远不会收到关于boundschange的通知,尽管它实际发生了更改。与此相反的是子视图——我从未收到关于framechange的通知,尽管它已经更改了。

我正在Xcode9.3上测试这个项目,iOS11.4sdk用于iPad Air和iPad Pro等设备。我还没有尝试过使用iOS 12测试版。
here)我遇到了一个非常奇怪的差异:didSet
willSet
将根据放置位置不同触发
,我只会得到
事件来自
变化。
子视图迪塞特
事件来自
变化。
hereviewDidLayoutSubviews()
提到heredoc)。
意志力
视图
边界
框架
this question但它只涉及初始化阶段,也没有提到观察子视图的情况。
要看到这一点,请查看¨my sample project
观察者也一样,甚至
有时不召集观察员。最后,我找到了它们工作方式不同的关键设置:视图在视图层次结构中的位置,如上所述。
框架
边界
这是我的
public weak var boundsDelegate: ViewBoundsObserving?
public override var bounds: CGRect {
willSet {
print("BOUNDS willSet bounds: \(bounds), frame: \(frame)")
boundsDelegate?.boundsWillChange(self)
}
didSet {
print("BOUNDS didSet bounds: \(bounds), frame: \(frame)")
boundsDelegate?.boundsDidChange(self)
}
}
public override var frame: CGRect {
willSet {
print("FRAME willSet frame: \(frame), bounds: \(bounds)")
boundsDelegate?.boundsWillChange(self)
}
didSet {
print("FRAME didSet frame: \(frame), bounds: \(bounds)")
boundsDelegate?.boundsDidChange(self)
}
}
}
在我的示例代码中,如果旋转设备,在我观察根视图的情况下,您将看到(ViewController
self.view
--蓝色),我永远不会得到通知
改变,尽管它实际上已经改变了。与之相反的是一个子视图——我从来没有得到过通知
改变,尽管改变了。

我正在Xcode9.3上测试这个项目,iOS11.4sdk用于iPad Air和iPad Pro等设备。我还没有尝试过iOS 12测试版。
迪塞特
意志力
视图
对于
迪塞特
是否也触发(对于子视图)?反之亦然(对于根视图)?
- 如果有的话,有什么方法可以确保我可以随时观察
A的变化