0

私のアプリにはオブジェクトのドラッグとビデオ録画があります。ScreenCaptureアプリでビューを使用しています。メイン画面のスクリーンショットを撮って動画を作っています。

drawRect()ビューのメソッドで次のコードを使用するScreenCaptureと、iOS 6 ではドラッグが遅くなり、iOS 5 では正常に動作します。

[self performSelector:@selector(setNeedsDisplay) withObject:nil
      afterDelay:delayRemaining > 0.0 ? delayRemaining : 0.01];

そして、そのコード行を次のコードに置き換えると、ドラッグは正常に機能しますが、アクセスが悪くなります:

[self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil];

これの理由は何ですか?

4

3 に答える 3

1

メインスレッドでのみ UI メソッドを呼び出す必要があるため、それを行うことはできません。

ビューが遅い場合は、メイン スレッドでの描画を高速化するバックグラウンド スレッドで高価なことを行うように手配する必要があります。

とにかく、呼び出している実際のメソッドは何もしません。ビューを再描画するようにマークするだけです。この作業はdrawRectメソッドで行う必要があります。

于 2013-02-11T12:42:19.993 に答える
1

そのため、drawRect メソッドは mainThread でのみ機能します。Apple のドキュメントによると、UIKit はメインスレッドのみで動作するとのことです。したがって、メインスレッドでNeedsLayoutを設定する必要があります

于 2013-02-11T13:08:24.143 に答える
0

更新中の UIKit コントロールは、メイン スレッドで呼び出されるべきではありません。UIKit クラスはスレッドセーフではないためです。

ScreenCaptureView クラスを使用しました。この場合、バックグラウンドで別のメソッドを呼び出し、そのメソッドで以下のように drawRect コードを使用できます。

[self performSelectorInBackground:@selector(callCodeInsideDrawRect) withObject:nil];



-(void)callCodeInsideDrawRect
{
 //any code which is required to be called in background (drawRectCode)
 //in ur case draw rect block

}
于 2013-02-11T12:54:15.530 に答える