如何检测swift ios xcode中何时更改UIView大小?

我正在使用UIScrollView中的CATiledLayer尝试一些东西。

不知何故,UIScrollView中UIView的大小变为大数。 我需要找出导致此resize的确切原因。

有没有办法检测UIView的大小(帧,边界)或UIScrollView的contentSize何时resize?

我试过了

override var frame: CGRect { didSet { println("frame changed"); } } 

在UIView子类中,

但它只在应用程序启动时调用一次,尽管后来调整了UIView的大小。

每当边界发生变化时,都会调用viewWillLayoutSubviews()viewDidLayoutSubviews() 。 在视图控制器中。

这里有一个答案:

https://stackoverflow.com/a/27590915/5160929

只需将其粘贴到方法体外:

 override var bounds: CGRect { didSet { // Do stuff here } } 

你也可以使用KVO:

你可以像这样设置一个KVO ,其中view是你想要观察帧变化的view

 self.addObserver(view, forKeyPath: "center", options: NSKeyValueObservingOptions.New, context: nil) 

您可以通过此通知获取更改:

 override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: NSDictionary!, context: CMutableVoidPointer) { } 

只要您正在观察的视图的帧发生更改,就会调用observeValueForKeyPath

还记得在视图即将被释放时删除观察者:

 view.removeObserver(self, forKeyPath:@"center") 

答案是正确的,虽然对于我的情况我在故事板中设置的约束导致UIView大小改变而不回调任何检测function。

第1步:viewWillLayoutSubviews

调用以通知视图控制器其视图即将布局其子视图

当视图边界发生变化时,视图会调整其子视图的位置。 在视图布局其子视图之前,视图控制器可以覆盖此方法以进行更改。 此方法的默认实现不执行任何操作。

第2步:viewDidLayoutSubviews

被调用以通知视图控制器其视图刚刚布置了其子视图。

当视图控制器视图的边界发生更改时,视图会调整其子视图的位置,然后系统会调用此方法。 但是,调用此方法并不表示已调整视图子视图的各个布局。 每个子视图负责调整自己的布局。

在视图布局其子视图后,您的视图控制器可以覆盖此方法以进行更改。 此方法的默认实现不执行任何操作。

每当更改UIView的边界时,都会调用上述方法