UIScrollView内でCATiledLayerを試してみます。
どういうわけか、UIScrollView内のUIViewのサイズが大きな数に変更されます。このサイズ変更の原因を正確に調べる必要があります。
UIViewのサイズ(フレーム、境界のいずれか)またはUIScrollViewのcontentSizeがサイズ変更されたときに検出する方法はありますか?
私は試した
override var frame: CGRect {
didSet {
println("frame changed");
}
}
uIViewサブクラス内、
ただし、UIViewのサイズは後で変更されますが、アプリの起動時に1回だけ呼び出されます。
viewWillLayoutSubviews()
およびviewDidLayoutSubviews()
は、境界が変更されるたびに呼び出されます。 View Controllerで。
ここに答えがあります:
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サイズが変更されました。
ステップ1:viewWillLayoutSubviews
ビューがサブビューをレイアウトしようとしていることをView Controllerに通知するために呼び出されます
ビューの境界が変更されると、ビューはそのサブビューの位置を調整します。ビューがサブビューをレイアウトする前に、View Controllerでこのメソッドをオーバーライドして変更を加えることができます。このメソッドのデフォルト実装は何もしません。
ステップ2:viewDidLayoutSubviews
ビューがサブビューをレイアウトしたことをView Controllerに通知するために呼び出されます。
ビューコントローラーのビューの境界が変更されると、ビューはそのサブビューの位置を調整し、システムがこのメソッドを呼び出します。ただし、呼び出されるこのメソッドは、ビューのサブビューの個々のレイアウトが調整されたことを示すものではありません。各サブビューは、独自のレイアウトを調整します。
ビューがサブビューをレイアウトした後、View Controllerはこのメソッドをオーバーライドして変更を加えることができます。このメソッドのデフォルト実装は何もしません。
上記のメソッドはIViewの境界が変更されるたびに呼び出されます