1

AppleのViewProgrammingGuideを読むと、制約のために更新されていないことがわかります。だからいくつかの質問:

  1. ここの多くの投稿では、新しいUIViewを初期化するとき、またはCGRectZeroまたは同等のものに設定するときに-initWithFrameを使用しないことについて説明しています。では、これをどのように処理しますか?:

    -(id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self){
    
        //Set up rounded rectangle ivar
        CGRect frame = [self bounds];
        CGFloat radius = frame.size.height / 2;
        _rectPath = [UIBezierPath bezierPathWithRoundedRect:frame cornerRadius:radius];
        } 
    }
    

    次に、描画コードをdrawRect:に配置します。フレームがないと正しく初期化できないことがわかりました。(明らかに、私はこのUIViewを初期化し、すぐに制約を設定していますが、フレームはすぐには設定していません)。制約がまだ計算されていないため、このコードセットのフレーム=(0,0,0,0)。

    このコードをinitに配置しない場合、どこに配置しますか?また、initのビューで必要なものをすべて初期化するのは良い習慣だと思いました。

    だからこれは質問につながります...

  2. ランタイムサイクルで-updateConstraintsが呼び出されるのはいつですか?また、ビューはそれらの制約を使用して境界を計算するのはいつですか?ビューは、-layoutSubviewsが実行されるまで、境界が何であるかを実際には認識していないことに気付きました。この前に、制約が設定されているだけの場合にUIViewが境界を認識している別の場所はありますか?

すべての質問について申し訳ありませんが、それらはすべてちょっとつながっているようです。見てくれてありがとう。

4

1 に答える 1

1

フレームに関する問題は、自動レイアウトとは関係ありません。ビューのサイズは常に変化します。オブジェクトのインスタンス化時と同じになることはほとんどありません。最初にビューを作成するときではなく、drawRectに現在のサイズに合わせてパスのサイズを作成/計算する必要があります。

設定する必要がある唯一のオブジェクトinitは、クラスの残りの部分が特定の状態で存在することに依存するプロパティおよび/または ivar です。

于 2013-02-03T22:22:55.213 に答える