objective-c - 如何在切换 subview 的同时围绕 x 轴翻转 UIView

标签 objective-c ios cocoa-touch core-animation caanimation

以前有人问过这个问题,但方式略有不同,我无法按照我想要的方式得到任何答案,所以我希望有很棒的 Core Animation 技能的人可以帮助我。

我的 table 上有一套卡片。当用户向上或向下滑动时,卡片组会在表格中上下移动。在任何给定时间屏幕上都有 4 张牌可见,但只有第二张牌露出了它的脸。当用户滑动时,第二张卡片会翻转回其正面,而下一张卡片(取决于滑动方向)落在它的位置并显示其正面。

我已经像这样设置了我的卡片 View 类:

@interface WLCard : UIView {
    UIView *_frontView;
    UIView *_backView;
    BOOL flipped;
}

我尝试使用这段代码翻转卡片:

- (void) flipCard {
    [self.flipTimer invalidate];
    if (flipped){
        return;
    }

    id animationsBlock = ^{
            self.backView.alpha = 1.0f;
            self.frontView.alpha = 0.0f;
            [self bringSubviewToFront:self.frontView];
            flipped = YES;

            CALayer *layer = self.layer;
            CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
            rotationAndPerspectiveTransform.m34 = 1.0 / 500;
            rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, M_PI, 1.0f, 0.0f, 0.0f);
            layer.transform = rotationAndPerspectiveTransform;
    };
    [UIView animateWithDuration:0.25
                          delay:0.0
                        options: UIViewAnimationCurveEaseInOut
                     animations:animationsBlock
                     completion:nil];

}

这段代码有效,但它有以下问题,我似乎无法弄清楚:

  1. x 轴上只有一半的卡片是动画的。
  2. 一旦翻转,卡片的正面就会倒置并变成镜像。
  3. 一旦我翻转了卡片,我就无法让动画再次运行。换句话说,我可以根据需要多次运行动画 block ,但只有第一次会运行动画。随后我尝试制作动画时,只会在 subview 之间淡入和淡出。

此外,请记住,我需要能够与卡片的表面进行交互。即它上面有按钮。

如果有人遇到过这些问题,很高兴看到您的解决方案。更好的做法是向动画添加透视变换,以赋予其额外的真实感。

最佳答案

事实证明,这比我想象的要简单得多,而且我不必使用任何 CoreAnimation 库来实现效果。感谢@Aaron Hayman 提供线索。我使用了 transitionWithView:duration:options:animations:completion

我在容器 View 中的实现:

    [UIView transitionWithView:self 
                      duration:0.2 
                       options:UIViewAnimationOptionTransitionFlipFromBottom
                    animations: ^{
                            [self.backView removeFromSuperview];
                            [self addSubview:self.frontView];
                    }
                    completion:NULL];

诀窍是 UIViewAnimationOptionTransitionFlipFromBottom 选项。顺便说一下,Apple 在他们的文档中有这段代码。您还可以向 block 中添加其他动画,例如调整大小和移动。

关于objective-c - 如何在切换 subview 的同时围绕 x 轴翻转 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9656071/

相关文章:

ios - 关于哪些信息可以存储在 Info.plist 中的一些示例?

ios - 用全新的 Swift 应用程序替换 Objective-C iOS 应用程序,同时保留来自 NSUserDefaults 的值

ios - 如何在 map 上的两点之间绘制箭头? map 工具包

iOS 特殊字符,奇怪的问题

ios - AVPlayer播放音频时如何添加iPod EQ?

ios - 如何在自动布局打开时以编程方式更改 UIView 的位置

iphone - 更新到 Xcode 4.6 后出现超过 1000 个编译器错误

objective-c - 获取应用程序的 iTunes 图稿

php - 从 iOS POST 到 MySQL 数据库

ios - 标签栏图标像素化和切断