【问题标题】:iPhone run animation while moving object on the screen smoothlyiPhone在平滑移动屏幕上的对象时运行动画
【发布时间】:2013-07-11 05:58:12
【问题描述】:

目前我在屏幕上有一个图像,每 5 秒换出另一个图像,并且正在使用动画来执行此操作。

同时在屏幕上我有用户可以拾取和拖动的对象(使用平移手势)。在动画的 0.5 持续时间内,如果我在一个对象周围移动,UI 会出现断断续续的现象。例如,我有一个刷子,我拿起它并在屏幕上移动。 5 秒计时器结束,背景图像更新。而这会在动画发生时更新画笔口吃。我移动了加载 UI 线程的图像并使用 NSData 强制它加载。

有没有一种方法可以在更改图像的动画运行时防止这种卡顿。这是我交换图​​像的方法。

// Dispatch to the queue, and do not wait for it to complete
// Grab image in background thread in order to not block UI as much as possible
dispatch_async(imageGrabbingQueue, ^{

    curPos++;
    if (curPos> (self.values.count - 1)) curPos= 0;

    NSDictionary *curValue = self.values[curPos];
    NSString *imageName = curValue [KEY_IMAGE_NAME];

    // This may cause lazy loading later and stutter UI, convert to DataObject and force it into memory for faster processing
    UIImage *imageHolder = [UIImage imageNamed:imageName];

    // Load the image into NSData and recreate the image with the data.
    NSData *imageData = UIImagePNGRepresentation(imageHolder);
    UIImage *newImage = [[UIImage alloc] initWithData:imageData];

    dispatch_async(dispatch_get_main_queue(), ^{
        [UIView transitionWithView:self.view duration:.5 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionAllowAnimatedContent
                        animations:^{
                            [self.image setImage:newImage ];

                            // Temp clause to show ad logo
                            if (curPos != 0) [self.imagePromotion setAlpha:1.0];
                            else [self.imagePromotion setAlpha:0];

                        }
                        completion:nil];
    });
});

谢谢, 德曼

【问题讨论】:

    标签: iphone animation


    【解决方案1】:

    iPhone 上的图像处理库并不神奇,它们确实需要 CPU 时间来实际解码图像。这很可能是您遇到的问题。调用 UIImage imageNamed 可能会缓存图像,但始终可以刷新缓存,因此不会强制系统将图像保留在内存中。您调用 initWithData 的代码毫无意义,因为它仍然必须将 PNG 解压缩到内存中,这就是导致速度减慢的部分。您可以做的是将图像渲染为解码像素,然后将其保存到文件中。然后,内存映射文件并将映射的内存包装在核心图形图像中。这将避免可能导致减速的“解码和渲染”步骤。但是,其他任何事情都可能不会真正达到您的预期。哦,你不应该将解码后的字节保存在内存中,因为图像数据通常很大,会占用设备内存中的太多空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多