在横向模式下使用UIView动画转换FlipFromLeft的iPhone Flip动画

时间:2011-04-18 13:39:23

标签: iphone uiview core-animation uiviewanimation uiviewanimationtransition

我正在开发一个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

5 个答案:

答案 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