web-dev-qa-db-ja.com

Swift ios xcodeでUIViewのサイズが変更されたことを検出する方法は?

UIScrollView内でCATiledLayerを試してみます。

どういうわけか、UIScrollView内のUIViewのサイズが大きな数に変更されます。このサイズ変更の原因を正確に調べる必要があります。

UIViewのサイズ(フレーム、境界のいずれか)またはUIScrollViewのcontentSizeがサイズ変更されたときに検出する方法はありますか?

私は試した

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

uIViewサブクラス内、

ただし、UIViewのサイズは後で変更されますが、アプリの起動時に1回だけ呼び出されます。

19
Joon. P

viewWillLayoutSubviews()およびviewDidLayoutSubviews()は、境界が変更されるたびに呼び出されます。 View Controllerで。

35
simons

ここに答えがあります:

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

これをメソッド本体の外側に貼り付けるだけです:

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

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")
5
Lefteris

答えは正しいですが、私の場合、ストーリーボードで設定した制約により、検出機能をコールバックせずにUIViewサイズが変更されました。

2
Joon. P

ステップ1:viewWillLayoutSubviews

ビューがサブビューをレイアウトしようとしていることをView Controllerに通知するために呼び出されます

ビューの境界が変更されると、ビューはそのサブビューの位置を調整します。ビューがサブビューをレイアウトする前に、View Controllerでこのメソッドをオーバーライドして変更を加えることができます。このメソッドのデフォルト実装は何もしません。

ステップ2:viewDidLayoutSubviews

ビューがサブビューをレイアウトしたことをView Controllerに通知するために呼び出されます。

ビューコントローラーのビューの境界が変更されると、ビューはそのサブビューの位置を調整し、システムがこのメソッドを呼び出します。ただし、呼び出されるこのメソッドは、ビューのサブビューの個々のレイアウトが調整されたことを示すものではありません。各サブビューは、独自のレイアウトを調整します。

ビューがサブビューをレイアウトした後、View Controllerはこのメソッドをオーバーライドして変更を加えることができます。このメソッドのデフォルト実装は何もしません。

上記のメソッドはIViewの境界が変更されるたびに呼び出されます

1
user3182143