我正在开发一个iPhone应用程序,我在其中实现了一个动画UIViewAnimationTransitionFlipFromLeft。这里我的应用程序在纵向模式下工作正常。它正在执行与指定相同的动画,即从左到右翻转。
但是当我在横向模式下执行此UIViewAnimationTransitionFlipFromLeft时,它不会从左向右旋转。而不是它从上到下旋转。这是非常关键的问题。你能帮帮我解决这个问题。
我用于iPhone应用程序旋转视图的代码如下:
CGContextRef context = UIGraphicsGetCurrentContext();
[UIView beginAnimations:nil context:context];
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:self.view.window cache:NO];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:1.0];
[UIView commitAnimations];
[self.navigationController pushViewController:objSecond animated:YES];
谢谢, 最好的祝福, Gurpritsingh Saini
答案 0 :(得分:15)
如果您使用的是iOS 4.0或更高版本,以下内容将完全符合您的要求(我只是测试了它以确保)
NewView *myNewView = [[NewView alloc] initWith.....];
[UIView transitionFromView:self.view toView:myNewView.view duration:1 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
//[self.navigationController pushViewController:myNewView animated:NO];
[myNewView release];
编辑:我正在改变上面的代码(没什么新东西,只是注释掉了导航控制器,因为它没有必要)。
所以有几种方法可以解决这个问题(就跟踪下一个视图而言),但这是我能想到的最简单的方法。你已经可以从视图1切换到2,所以我将解释如何从2到10(或者你需要多少)。
基本上,视图转换持续时间太长,viewDidLoad
无法接听电话以转到下一个视图。所以我们需要做的是设置一个定时器,等待并发送一个方法以便稍后切换。所以这是您在视图2(以及3和4等)中看到的代码。
- (void)viewDidLoad {
// this gets called before animation finishes, so wait;
self.navigationController.delegate = self;
// you will need to set the delegate so it can take control of the views to swap them;
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(switchView) userInfo:nil repeats:NO];
}
我只等待1秒,直到我调用switch方法,但是如果你在视图中加载了很多,你可能需要等待一段时间。 1.5秒应该绰绰有余,但你可以玩它来看看它的工作原理和不起作用。
接下来,您必须使用switchView
方法调用下一个视图。
- (void)switchView {
NextView *myNextView = [[NextView alloc] initWith ... ];
[UIView transitionFromView:self.view toView:nextView.view duration:1 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
[nextView release];
}
这对我来说非常合适。为了确保我获得新视图,我为每个视图分配了标签,并在每个视图的viewDidLoad
方法中添加了UILabel作为子视图,并且每个都显示了其视图的编号。所以希望这就是你所需要的。我相信你需要做更复杂的事情,但这会给你动画和逻辑,让你获得你想要的外观。 (在旁注中,viewDidAppear
在执行此操作时似乎没有被调用,因此如果您确实需要使用它,可能需要从viewDidLoad
手动调用它,否则它可以正常工作)
答案 1 :(得分:2)
您必须手动向视图添加转换;翻转转换总是像视图控制器处于纵向一样运行。
请注意+beginAnimations:context:
的上下文参数本身并不是CGContextRef
。您可能不希望在那里传递当前的图形上下文。改为通过NULL
。
答案 2 :(得分:1)
CGContextRef context = UIGraphicsGetCurrentContext();
[UIView beginAnimations:nil context:context];
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:self.view cache:NO];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:1.0];
[UIView commitAnimations];
我认为这会有用。
答案 3 :(得分:1)
试试这个:
CABasicAnimation *rotateAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
CGFloat startValue = 0.0;
CGFloat endValue = M_PI;
rotateAnimation.fromValue = [NSNumber numberWithDouble:startValue];
rotateAnimation.toValue = [NSNumber numberWithDouble:endValue];
rotateAnimation.duration = 1.5;
[self.view.layer addAnimation:rotateAnimation forKey:@"rotate"];
答案 4 :(得分:0)
slev接受的回答对我不起作用,在我的自定义Segue中尝试代码后,我遇到了各种各样的错误。我发现一种方法不仅可以工作,而且更精确,因为它不需要使用Timer。这是MySegue.m:
@implementation FlipRightSegue
- (id)initWithIdentifier:(NSString *)iden source:(UIViewController *)sour destination:(UIViewController *)dest
{
self = [super initWithIdentifier:iden source:sour destination:dest];
return self;
}
- (void)perform
{
UIViewController *src = [self sourceViewController];
UIViewController *dst = [self destinationViewController];
//[UIView transitionFromView:src.view toView:dst.view duration:1 options:UIViewAnimationOptionTransitionFlipFromRight completion:nil];
//[UIView commitAnimations];
[UIView transitionWithView:src.navigationController.view duration:0.8 options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{
[src.navigationController pushViewController:dst animated:NO];
}
completion:NULL];
}
@end
我还有第二节翻转到右边。 代码来自本网站:http://www.dailycode.info/Blog/post/2012/11/29/iOS-Custom-Flip-Segue-(portrait-and-landscape-layout)-xcode-4.aspx