3

好的,我对 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 上。

先感谢您!

4

1 回答 1

2

将我的 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 重新实现它,但这需要更多时间,因此它是一个临时解决方案。

于 2013-09-22T15:12:55.070 回答