UIView核心动画翻转动画
亲爱的核心动画/ iOS专家,UIView核心动画翻转动画
我想获得类似于下面的问题的效果。
Core animation animating the layer to flip horizontally
接受的答案似乎来形容正是我需要,但有这样的回答没有代码,我不能让我写工作的任何代码。 1)有1个主视图控制器/视图,并且在主视图的一部分上有2个重叠的UIView,只显示一个(1在前面',在'后面'有1个)
2)单独的UIControl/UIButton被按下,然后发生3D翻转过渡,将前部(可见)视图旋转到视野之外,同时将后部(隐藏)视图旋转到前面......就像看到扑克牌的反面一样。
3)能够继续按压UIControl在两个视图之间切换
4)只能与前视图上的控件进行交互(即按下前一层不会无意中触发后面的控件)恰好在水龙头下面)
我可能正在接近这个错误的方式让我知道。理想情况下,我想使用核心动画,而不是使用翻转事务构建的UIView,因为我希望动画是3D,并且还希望将此任务用作执行更复杂的CA事务的垫脚石。
目前,我可以正视图很好地翻转(只有一次),但后视图不显示。
干杯,
安迪
这里是我已经得到了代码:
MainViewController.h
@interface MainViewController : UIViewController
- (IBAction)changeViewTapped:(UITapGestureRecognizer *)recognizer;
@end
MainViewController.m
#import "MainViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface MainViewController()
@property (weak, nonatomic) IBOutlet UIView *detailView;
@property (weak, nonatomic) IBOutlet UIView *listView;
@property (nonatomic) CATransform3D rotationAndPerspectiveTransform;
@end
@implementation MainViewController
@synthesize detailView = _detailView;
@synthesize listView = _listView;
@synthesize rotationAndPerspectiveTransform = _rotationAndPerspectiveTransform;
- (void)viewDidLoad {
[super viewDidLoad];
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0/-500;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, M_PI, 0.0f, 1.0f, 0.0f);
self.rotationAndPerspectiveTransform = rotationAndPerspectiveTransform;
CALayer *listLayer = self.listView.layer;
listLayer.doubleSided = NO;
listLayer.transform = self.rotationAndPerspectiveTransform;
}
- (IBAction)changeViewTapped:(UITapGestureRecognizer *)recognizer {
CALayer *detailLayer = self.detailView.layer;
CALayer *listLayer = self.listView.layer;
detailLayer.doubleSided = NO;
listLayer.doubleSided = NO;
[UIView animateWithDuration:0.5 animations:^{
detailLayer.transform = self.rotationAndPerspectiveTransform;
listLayer.transform = self.rotationAndPerspectiveTransform;
} completion:^(BOOL finished){
// code to be executed when flip is completed
}];
}
@end
有关iOS中翻转动画的快速提示 - 在开始翻转动画之前,系统需要时间渲染后视图(将翻转的视图)。因此,如果您尝试更改该视图的内容,并以相同方法触发翻转动画,则会出现问题。
要解决这个问题,我已经受够了代码的成功是这样的:
- (void)flipView {
// Setup the view for the back side of the flip
[self performSelector:@selector(performFlip) withObject:nil afterDelay: 0.1];
}
- (void)performFlip {
[UIView transitionWithView: tileToFlip
duration: 0.5
options: UIViewAnimationOptionTransitionFlipFromLeft
animations:^{
// My flip specific code
}
completion:^(BOOL finished) {
}
];
}
概括地说,我在flipView
方法设置的一切行动,控制返回到iOS所以有时间来做它的渲染,然后在十分之一秒后启动flipTile
选择器来做实际的动画。
祝你好运!
- (void)perform
{
UIViewController *src = (UIViewController *) self.sourceViewController;
UIViewController *dst = (UIViewController *) self.destinationViewController;
[UIView beginAnimations:@"LeftFlip" context:nil];
[UIView setAnimationDuration:0.8];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:src.view.superview cache:YES];
[UIView commitAnimations];
[src presentViewController:dst animated:NO completion:nil];
}
不应该这是'[self performSelector:@selector(performFlip)withObject:nil afterDelay:0.1];'使用performFlip而不是flipTile? – DelightedD0D
好的。固定。 – Axeva
谢谢,它适合我。 –