2012-01-14 24 views
1

UIViewの上[self setNeedsDisplay]を呼び出すと [self.layer setNeedsDisplay]にならないようです。CALayerのsetNeedsDisplayを呼び出すUIView setNeedsDisplay?

- (void)setNeedsDisplay { 
    [super setNeedsDisplay]; 
    [self.layer setNeedsDisplay]; 
} 

はこれがトラブルに私を取得します:次のように私はsetNeedsDisplayをオーバーライドする場合、それは大丈夫ですか?おそらくもっと良い方法がありますか? は、それがトラブルにあなたを得るでしょう、なぜあなたは

+0

なぜあなたはこれが必要だと思いますか? –

+0

'[myView.layer setNeedsDisplay]'も呼ばなくても '[myView setNeedsDisplay]'メソッドを呼びたいと思います。私はUIViewサブクラス内に精巧なCALayer階層を設定しました。 – Ana

+0

なぜ '[CALayer setNeedsDisplay]'を呼び出す必要がありますか? '[UIView setNeedsDisplay]'を呼び出すと、実行ループの最後に '-drawRect:'がトリガされます。他に何をしようとしていますか? –

答えて

1

私は表示されませんありがとうございました。 setNeedsDisplay/setNeedsLayout表示/レイアウトを表示/レイアウトする必要があることを示すフラグです。次回は実行ループの周りで描画を行います。

私はかなり驚いていますが、ビュー上でそれを呼び出すと、レイヤー上で発生することはありません。なぜなら、結局のところUIViewとそれに関連付けられたCALayerは非常に緊密に統合されているからです。あなたはそれだけでビューにsetNeedsDisplayを呼び出すことによって、あなたのために働いていない発見している場合

だから全体的に、葉は、あなたの解決のために行きます。私はそれが何に悪影響を与えることができないのか分かりません。

+1

UIViewは、drawRect:が実装されている場合(メソッドが空で何もしない場合でも)、基になるCALayer上でのみsetNeedsDisplayを呼び出します。これはUIViewのsetNeedsDisplayに、そのレイヤーにも描画がいくつかあることを伝えます。レイヤーのsetNeedsDisplayを自動的に呼び出す別の方法は、レイヤーのフラグneedsDisplayOnBoundsChangeをtrueに設定することです。ビューの境界が変更されると(レイヤーの境界を自動的に変更する)setNeedsDisplayがトリガーされます。しかし、あなたの質問に答えるために、あなたがdrawRect:を上書きしなければ、あなたがやっていることはうまくいきます。そうでなければ、それは冗長です。 –

+0

ありがとう@ Mr.T、あなたのコメントは私の質問に答えました。別の回答として投稿する必要があります。 – titaniumdecoy

+0

ありがとう@titaniumdecoy。私は助けることができてうれしい! –

3

私は別の答えにコメントとして投稿ですが、これは他の人に役立つかもしれません。

drawRect:が実装されている場合(たとえメソッドが空で何もしない場合でも)、UIViewは基底のCALayerにのみsetNeedsDisplayを呼び出します。 UIViewのsetNeedsDisplayには、そのレイヤにも描画がいくつかあることがわかります。

層のsetNeedsDisplayが自動的に呼ばれるように取得するための別の方法は、setNeedsDisplayをトリガする、真の層の旗needsDisplayOnBoundsChangeを設定するときはいつでも(自動的層の境界を変更する)ビューの境界を変更。しかし、あなたの質問に答えるために、drawRect:を上書きしなければ、あなたがやっていることは問題ありません。そうでなければ、それは冗長です。

関連する問題