0

cocoa を使用してカスタム ビュー アプリケーションを作成しました。そして後で(はい、それが悪いことはわかっています)、私は自問自答しました:これはココアタッチでもうまくいくでしょうか?もちろん、id はすぐには機能しませんでした。クラス名などを変更する必要がありました。さて、私はビューが必要なときはいつでもNSTimersetNeedsDisplay:メソッドを使用してビューを更新しました。ココアの下ではかなりうまくいきましたが、ココアタッチの下ではまったくうまくいきませんでした.

私はそれを自分自身に説明することはできません.実際には、どのコード行が誰かが問題を解決するのに役立つかわかりません. 多分ここにタイマーがあります:

[self setMyTimer: [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(myTarget:) userInfo:nil repeats:YES]];

そして、それはターゲットです:

- (void) myTarget:(NSTimer *)timer {
    [self setNeedsDisplay];
}

タイマーは 30 ミリ秒ごとに呼び出されます。NSLog で確認しました。

このdrawRect:方法では、実際にいくつかの図形を描画するだけで、他には何もしませんでした。何らかのclearRect:メソッドを呼び出す必要がある場合に備えて。私が言ったように、ココアの下ではうまくいきました。

4

2 に答える 2

3

drawRect:まず、ブレークポイントまたはログ ステートメントを使用して実行中かどうかを確認します。

次に、ビューが実際に画面上にあることを確認します。の値は[self superview]? ビューがどこにあるかを確認できるように、次のようなことも行う必要self.backgroundColor = [UIColor redColor];があります。

ビューを 30 ミリ秒ごとにダーティとマークしているからといって、30 ミリ秒ごとに描画されるわけではありません。通常はそうなるはずですが (約 30fps)、保証はありません。drawRect:呼び出される頻度に依存するべきではありません。あなたの質問から、期待したほど頻繁に描画しないというよりは、決して描画しないという意味だと思います。

于 2011-09-06T17:25:14.360 に答える
3

setNeedsDisplayのドキュメントからの(引数の欠如に注意してください)に関する議論は次のUIViewとおりです。

このメソッドを使用して、ビューのコンテンツを再描画する必要があることをシステムに通知できます。このメソッドはリクエストを記録し、すぐに制御をコードに戻します。ビューは、次の描画サイクルまで実際には再描画されません。その時点で、無効化されたすべてのビューが更新されます。

このメソッドを使用して、ビューのコンテンツまたは外観が変更された場合にのみビューを再描画するように要求する必要があります。ビューのジオメトリを変更しただけでは、通常、ビューは再描画されません。contentMode代わりに、ビューのプロパティの値に基づいて既存のコンテンツが調整され ます。既存のコンテンツを再表示すると、変更されていないコンテンツを再描画する必要がなくなるため、パフォーマンスが向上します。

対照的に、これはsetNeedsDisplay:のドキュメントからの(議論に注意してください)についての議論ですNSView

ビュー オブジェクトの描画に使用されるデータまたは状態が変化するたびに、ビューにsetNeedsDisplay:メッセージを送信する必要があります。NSView表示が必要としてマークされたオブジェクトは、アプリケーションのイベント ループを通過するたびに自動的に再表示されます。(イベント ループが発生する前に再表示する必要があるビュー オブジェクトは、もちろんすぐに適切な display... メソッドに送信できます。)

于 2011-09-06T17:10:22.767 に答える