13

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

4

5 回答 5

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如果您确实需要使用它可能需要手动调用它,否则它工作正常)

于 2011-05-21T21:17:28.287 回答
2

您必须手动向视图添加转换;翻转转换总是像视图控制器处于纵向一样运行。

请注意,上下文参数本身+beginAnimations:context:并不意味着CGContextRef。您可能不想在那里传递当前的图形上下文。NULL而是通过。

于 2011-04-19T12:16:10.077 回答
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];

我认为这会奏效。

于 2011-05-19T07:21:04.537 回答
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"];
于 2011-05-23T11:40:48.790 回答
0

slev 接受的答案对我不起作用,在我的自定义 Segue 中尝试代码后,我遇到了各种错误。我发现了一种方法,它不仅有效而且更精确,因为它不需要使用计时器。这是 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

于 2013-07-08T00:13:32.940 回答