0

画像をドラッグできるメイン画面を再コーディングしています。

オブジェクトのドラッグを遅くするsetneedsdisplayメソッドがあります。

しかし、バックグラウンドスレッドで同じメソッドを呼び出すと、問題は解決しますが、アプリがクラッシュします。

また、drawRect:メソッドを何度も呼び出さずにビデオを録画する他のオプションがある場合はどうなりますか?

- (void) drawRect:(CGRect)rect {
    NSDate* start = [NSDate date];
    CGContextRef context = [self createBitmapContextOfSize:self.frame.size];


    CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, self.frame.size.height);
    CGContextConcatCTM(context, flipVertical);

    [self.layer renderInContext:context];

    CGImageRef cgImage = CGBitmapContextCreateImage(context);
    UIImage* background = [UIImage imageWithCGImage: cgImage];
    CGImageRelease(cgImage);

    self.currentScreen = background;

    if (_recording) {
        float millisElapsed = [[NSDate date] timeIntervalSinceDate:startedAt] * 1000.0;
        [self writeVideoFrameAtTime:CMTimeMake((int)millisElapsed, 1000)];

    }

    float processingSeconds = [[NSDate date] timeIntervalSinceDate:start];
     delayRemaining = (1.0 / self.frameRate) - processingSeconds;



    //CGContextRelease(context);

    //redraw at the specified framerate
    //[self performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:delayRemaining > 0.0 ? delayRemaining : 0.01];

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

}
4

3 に答える 3

4

考えられる原因:

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

バックグラウンド スレッドから UI を更新しています。UI で何かをする必要がある場合は、メイン スレッドで実行してください。

また、あなたのコードに問題が見つかりました:

あなたはsetNeedsDisplayから を呼び出してdrawRect:います。それはdrawRect:再び を呼び出します。

(ビュー呼び出しを更新する必要があり、直接呼び出さ[self setNeedsDisplay];ない場合。)drawRect:

于 2013-02-08T11:57:04.743 に答える
1

バックグラウンド スレッドで UI を更新するメソッドを呼び出さないでください。常にメイン スレッドから UI を更新します。setNeedsDisplay メソッドが呼び出されたときに drawrect が呼び出されるので、コードについて話す場合、その行は必要ありません。

于 2013-02-08T12:18:23.370 に答える
1

setNeedsDisplay:その場合、メインスレッドで呼び出す必要があると思います。ほとんどの UI メソッドは、バックグラウンド スレッドでは機能しません。

レンダー メソッドを質問に入れると、それらを改善できるかどうかがわかりますか?

setNeedsDisplayInRect:表示の一部だけを再描画したい場合は、設定のみを試してみてください。

于 2013-02-08T11:59:09.253 に答える