2017-09-24 11 views
0

このコード:石工を使用するとフレームがすぐに取得できないのはなぜですか?

[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { 
    make.edges.mas_equalTo(UIEdgeInsetsMake(0, 0, 0, 0)); 
}]; 
NSLog(@"%@", self.scrollView); 

結果は:<UIScrollView: 0x7faad400cc00; frame = (0 0; 0 0)

しかし、このコード:

[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { 
    make.edges.mas_equalTo(UIEdgeInsetsMake(0, 0, 0, 0)); 
}]; 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    NSLog(@"%@", self.scrollView); 
}); 

結果は:<UIScrollView: 0x7ff8d1043200; frame = (0 0; 375 667);

なぜ私はすぐにフレームを取得することはできませんが、私は0.1秒後に得ることができますか?

答えて

1

Masonryは自動レイアウト用のラッパーであり、自動レイアウトは- (void)layoutSubviews;メソッドでフレームを計算し、それ以降はすべてのビューのフレームを取得できます。

石工の方法mas_makeConstraintsとそれに類似する設定だけです。

更新制約が必要な場合は、mas_remakeConstraints:の更新制約を呼び出す必要があります。ビューの更新フレームについては、次の表示サイクルで再計算に関するフラグsetNeedsLayoutを設定する必要があります。 layoutIfNeededメソッドを呼び出します。

0

ブロックのビューの制約/レイアウトを変更しているためです。ブロックが完全に何を理解している場合、あなたはあなたの質問に対する答えを知るでしょう。

プログラムは、あなたのコードの最初の行から実行、およびNSLog方法ラインを通過し、ブロック内のコードがNSLogラインの前に、またはNSLog行の後に最初に呼び出されますいずれかになります。あなたが言ったように、0.1秒後にフレームを取得することができます。これは、ブロック内のコードがNSLog行よりも遅く終了するためです。

+1

ブロックが他のコードのチャンクよりも「遅くなる」とは限りません。この場合、私はMasonryがそのブロックをすぐに実行するので、NSLog行の前に終了することを期待しています。 @Bimawaが示唆するように、フレームが直ちに正しくない理由は、@Bimawaが示唆するように、新しい制約をフレームに変換する前にレイアウト・パスが必要であり、これらのパスの1つを実行するには0.1秒で十分です。 – Tim

+0

私はちょうど私ができる最も単純な方法でOPに物を説明しました。 – Glenn

+0

ブロックとは何の関係もありません。 –

関連する問題