好的,我遇到了ios7的严重问题。我有一个代码,用户可以在其中拖动控件,并在拖动时使用处理过的图像更新界面。在iOS 6.1之前,这非常快,但现在非常慢。
这是我的代码的工作方式:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//get initial position
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
//calculates new position
applyEffects();
- (void)applyEffects {
UIGraphicsBeginImageContext();
//CGContextTranslateCTM, CGContextScaleCTM, CGContextDrawImage and stuff like that
UIImage *blendedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
preview.image = blendedImage; //preview is a UIImageView
现在的事情是,在登录后,我意识到每次我在屏幕上移动手指时都会调用applyEffects,但是视图被更新的次数很少,这就是为什么它看起来很慢的原因。
因此,关于“preview.image = blendedImage;”的任何想法不再更新视图了吗?我想念什么吗?
同样,这仅在iOS 7上发生。
先感谢您!
最佳答案
将我的applyEffects更改为:
dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
if (!running) {
running = true;
dispatch_async(myQueue, ^{
UIGraphicsBeginImageContext();
//CGContextTranslateCTM, CGContextScaleCTM, CGContextDrawImage and stuff like that
UIImage *blendedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^{
// Update the UI
preview.image = blendedImage;
running = false;
});
});
}
现在,它将创建一个单独的线程来应用效果,并在就绪时更新UI。这样,我不会阻塞UI触摸事件处理。
if(!running)是一个愚蠢的控件,使其一次只能运行一次。
理想的方法是丢弃所有代码并使用GPUImage重新实现,但这将需要更多时间,因此这是一个临时解决方案。
关于ios - iOS7的大幅降速:CGContextDrawImage或UIView setImage?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18935995/