我正在重新编码我们可以拖动图像的主屏幕。
我有一个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];
}
答案 0 :(得分:4)
可能的原因:
[self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil];
您正在从后台主题更新您的用户界面。 永远不要这样做,如果您需要对UI做一些事情,请在主线程中执行。
此外,我发现您的代码存在问题:
您正在呼叫setNeedsDisplay
中的drawRect:
,它会再次呼叫drawRect:
。
(如果您需要更新视图通话[self setNeedsDisplay];
,请勿直接致电drawRect:
。)
答案 1 :(得分:1)
我猜必须在主线程上调用setNeedsDisplay:
。大多数UI方法不适用于后台线程。
如果您将渲染方法放入您的问题中,我们可以看看它们是否可以改进?
如果您只想重新绘制部分显示内容,请尝试仅设置setNeedsDisplayInRect:
答案 2 :(得分:1)
您永远不应该调用任何在后台线程中更新UI的方法。始终从主线程更新UI。如果在调用setNeedsDisplay方法时调用drawrect,那么在那里讨论你的代码就不需要那行了。