好的,我遇到了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/

10-10 21:30