7

私はに苦労していsetNeedsDisplayます。drawRect:ビューの範囲内にある場合は、呼び出されたビューとその下の階層の呼び出しをトリガーすることになっていると思いましたが、そうではありません。これが私の設定です:

アプリケーションデリゲートから、基本的に画面全体をカバーする正方形のサイズのビューを作成します。このビューはと呼ばれTrollCalendarViewます。TrollCalendarViewコンパスによってトリガーされる回転を除いて、発生することはあまりありません。

の中心の周りに7面の配置で配置された2D描画オブジェクトを含むことを目的としたTrollCalendarViewcalledの7つのサブビューがあります。したがって、iPadを回転させると、これらの7つのビューは、常に基本的な方向を向くように回転します。PlatformViewTrollCalendarView

各サブビューには、PlatformViewと呼ばれる3つのサブビューが含まれていますTower。各タワーには、で実装された2D描画オブジェクトが含まれていdrawRect:ます。

したがって、要約TrollCalendarViewすると、空drawRect:の、サブビューPlatformView、およびPlatformview-> Towerがあり、それぞれにdrawRect実装があります。さらに、TowerはPlatformの範囲内にあり、PlatformはTrollCalendarViewの範囲内にあります。

TrollCalendarViewスワイプレコグナイザーを追加しました。スワイプが発生すると、プロパティが更新され、呼び出します[self setNeedsDisplay]が、何も起こらないようです。drawRect:これらの各ビューのメソッドにNSLogエントリを追加すると、TrollCalendarView drawRect:メソッドのみが呼び出されます。皮肉なことに、それはdrawRectメソッドが空になる1つのビューです。

xibファイルはありません。

drawRect他のサブビューのメソッドが呼び出されるようにするには、何をする必要がありますか?これに影響を与える可能性のあるすべてのニュアンスを説明するドキュメントがどこかにありますか?

4

2 に答える 2

9

setNeedsDisplay に苦労しています。ビューの境界内にある場合、呼び出されたビューとその下の階層に対して drawRect の呼び出しをトリガーすることになっていると思いました

いいえ、そうではありません。そのアイデアはどこから得たのですか?

-setNeedsDisplay:送信先のビューにのみ適用されます。他のビューを無効にする必要がある場合は、-setNeedsDisplay:それらに送信するコードも追加する必要があります。それだけです。

于 2012-07-14T04:26:02.510 に答える
5

これはフレームワークの最適化だと思います。サブビューを再度描画する必要がない場合、これはパフォーマンスの大幅な改善です。アニメート可能なものはほとんど drawrect (移動、スケーリングなど) を必要としないことに注意してください。

すべてのサブビューを再描画する必要がある (単純に移動するのではなく) ことがわかっている場合は、メイン ビューで setNeedsDisplay をオーバーライドして、次のようにします。

-(void) setNeedsDisplay {
    [self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)];
    [super setNeedsDisplay];
}

これをテストしたところ、すべてのサブビューも再描画されます。サブビューを何らかの方法でフィルタリングし、実際に再描画が必要なサブビューにのみ送信するようにすると、効率カルマ ポイントが得られることに注意してください。:-)

于 2012-07-14T04:31:14.897 に答える