59

iOS 6 自動レイアウトを使用して開発しています

ビューのフレーム幅を表示するメッセージを記録したいと思います。

画面に textView が表示されます。

しかし、幅と高さがゼロになります。何か不足していますか?

NSLog(@"textView    = %p", self.textView);
NSLog(@"height      = %f", self.textView.frame.size.height);
NSLog(@"width       = %f", self.textView.frame.size.width);

textView    = 0x882de00
height      = 0.000000
width       = 0.000000
4

9 に答える 9

155

実際、上記の答えはまったく正しくありません。私はそれらを追跡し、何度もゼロを取得しました。

トリックは、フレームに依存するコードをviewDidLayoutSubviewsメソッドに配置することです。

ビューがサブビューをレイアウトしたばかりであることをView Controllerに通知します。

このメソッドは複数回呼び出され、ViewController のライフサイクルの一部ではないことを忘れないでください。使用中は注意してください。

それが誰かに役立つことを願っています。

追加したかったのは、ランドスケープモードのない私のプログラムでは、自動レイアウトを使用しない方がはるかに簡単であることです...試してみましたが、= D

于 2013-01-03T21:11:14.557 に答える
59

これを呼び出すまでに、自動レイアウトにはビューをレイアウトする時間がなかったと思います。viewDidLoadビューがロードされた直後に呼び出され、ビューがビューコントローラーのビュー階層に配置され、最終的に(ビューのlayoutSubviewsメソッドで)レイアウトされるのはその後のみであるため、呼び出されるまでに自動レイアウトは発生しませんでした。

編集: この回答は、質問のシナリオが機能しない理由を指摘しています。@dreamzorの答えは、それを解決するためにコードを配置する場所を指摘しています。

于 2012-09-21T08:52:19.597 に答える
31

解決

  • そのコードを配置しますviewDidAppear

理由

  • viewDidLoad自動レイアウトが完了する前に発生します。そのため、xib で指定された autolayout によって位置はまだ設定されていません。
  • viewDidAppear自動レイアウトが完了した後に発生します。
于 2012-09-28T02:38:52.780 に答える
13

実際、コード内のコードの前にレイアウトの更新を強制viewDidLoadすることができました:

override func viewDidLoad() {
        super.viewDidLoad()

        println("bounds before \(self.previewContainer.bounds)");
        //on iPhone 6 plus -> prints bounds before (0.0,0.0,320.0,320.0)

        self.view.setNeedsLayout()
        self.view.layoutIfNeeded()

        println("bounds after \(self.previewContainer.bounds)");
        //on iPhone 6 plus -> prints bounds after (0.0,0.0,414.0,414.0)

        //Size dependent code works here
        self.create()
    }

更新:これはもう機能していないようです

于 2014-12-18T13:51:37.050 に答える
10

これは本当に奇妙な機能です。しかし、私は見つけました:

layoutsubviews メソッドを使用せずにフレームを取得する場合は、これを使用します。

dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"View frame: %@", NSStringFromCGRect(view.frame));
    });

これは本当に奇妙です!!!

于 2015-12-29T13:02:02.380 に答える
3

サイズは、最初のレイアウト パスの後にのみ確認できます。または、ビューの実際の幅を取得した後、以下のメソッドを呼び出すだけです。

[yourView layoutIfNeeded];
于 2017-07-08T10:39:32.770 に答える