以前有人问过这个问题,但方式略有不同,我无法按照我想要的方式得到任何答案,所以我希望有很棒的 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];
}
这段代码有效,但它有以下问题,我似乎无法弄清楚:
- x 轴上只有一半的卡片是动画的。
- 一旦翻转,卡片的正面就会倒置并变成镜像。
- 一旦我翻转了卡片,我就无法让动画再次运行。换句话说,我可以根据需要多次运行动画 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/