ios - 使用 block 翻转UIImageView

标签 ios animation objective-c-blocks

我正在尝试使用块动画翻转UIImageView。许多网站(以及此处的答案)都建议这样做:

flipTile.image = frontImage;

[UIView transitionWithView: flipTile
                  duration: 2.5f
                   options: UIViewAnimationOptionTransitionFlipFromLeft
                animations:^(void) {
                    flipTile.image = backImage;
                }
                completion:^(BOOL finished) {
                }
 ];

不幸的是,这并没有给我我期望的结果。动画的上半部分我什么也没得到,然后backImage变成动画的下半部分的外观。就像frontImage是隐藏的或透明的-事实并非如此。

过渡中的某些事情使事情变得混乱了。我究竟做错了什么?

最佳答案

这是解决方案,如果将来其他任何人都可能遇到此问题:

简而言之,动画块在UIImageView的当前状态和animations部分中设置的状态之间切换。但是,由于在调用动画块之前设置了flipTile的图像,因此iOS渲染引擎没有机会在动画开始之前更新我的UIImageView。因此,我看到了一个从UIImageView(nil)当前状态到新状态(backImage)的动画。

为了解决该问题,我需要将控制权返回给iOS一秒钟,以允许渲染引擎开展业务,然后执行动画。

这是我的操作方式:

- (void)giveHint {
    /*
        other work here
    */

    flipTile.image = currentTileImage;

    [self performSelector:@selector(flipTile) withObject:nil afterDelay: 0.1];
}

- (void)flipTile {
    [UIView transitionWithView: flipTile
                      duration: 0.5
                       options: UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^{
                        flipTile.image = newTileImage;
                    }
                    completion:^(BOOL finished) {
                        /*
                            clean up
                        */
                    }
     ];
}

关于ios - 使用 block 翻转UIImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14675285/

相关文章:

javascript - HTML5 Canvas 意外的移动量

html - SVG 填充动画在 Firefox 和 Edge 上不起作用

ios - 用户从 UIActivityViewController 选择事件后执行上传 - 可能是 block 问题

ios - NSPredicate 按时间间隔获取日期

ios - 在哪里存储常量值?

iOS 和 FCM : Force Refresh Tokens

iphone - 如何从 block 中获取 NSString?

ios - 在自适应布局中为元素赋予宽度

android - 有没有办法覆盖Android中 View 的动画辅助功能设置

objective-c - 为什么 objc block 的赋值必须是 'copy' ,而不是 'assign' ?