如何检测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的边界时,都会调用上述方法