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 做一些事情,请在主线程中做。

我还在您的代码中发现了一个问题:

setNeedsDisplaydrawRect:那里调用它会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 回答