AppleのViewProgrammingGuideを読むと、制約のために更新されていないことがわかります。だからいくつかの質問:
ここの多くの投稿では、新しい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のビューで必要なものをすべて初期化するのは良い習慣だと思いました。
だからこれは質問につながります...
ランタイムサイクルで-updateConstraintsが呼び出されるのはいつですか?また、ビューはそれらの制約を使用して境界を計算するのはいつですか?ビューは、-layoutSubviewsが実行されるまで、境界が何であるかを実際には認識していないことに気付きました。この前に、制約が設定されているだけの場合にUIViewが境界を認識している別の場所はありますか?
すべての質問について申し訳ありませんが、それらはすべてちょっとつながっているようです。見てくれてありがとう。