【问题标题】:iPhone Flip Animation using UIViewAnimationTransitionFlipFromLeft in landscape modeiPhone 在横向模式下使用 UIViewAnimationTransitionFlipFromLeft 翻转动画
【发布时间】:2011-04-18 13:39:22
【问题描述】:

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

谢谢, 最好的祝福, 古普里辛格·赛尼

【问题讨论】:

  • 您确定您的应用程序支持横向吗?根据您的描述,无论您如何握住设备(横向或纵向),您的应用都会在纵向模式下执行 FlipFromLeft
  • 您好,我的应用程序支持 iPhone 中可用的所有四种方向。在纵向模式下,它可以正常地从左到右翻转动画。但是在 ladscape 模式下,它不是从左到右翻转,而是从上到下翻转。你能帮我解决这个问题吗?
  • 你能正确地重新格式化你的代码吗?你干嘛……self.view.window.transform = CGAffineTransformMakeRotation(M_PI * 0.50)
  • 哦,对不起,那是错误的。我只是在测试这个但没有奏效。你能帮我么。我非常需要它。
  • 一点:在上面的代码中,您使用的是旧的 UIView 方法 beginAnimations:context:。 context 参数不是 CGContextRef。这是您用来跟踪哪个动画是哪个动画的关键。它应该是一个NSString。我希望传入 CGContextRef 会导致编译器警告,并且可能会导致内存管理问题,因为 CGContextRef 是核心基础对象,而不是 NSObject。

标签: iphone uiview core-animation uiviewanimation uiviewanimationtransition


【解决方案1】:

如果您使用的是 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 手动调用它,否则它可以正常工作)

【讨论】:

  • 您好 Slev,感谢您在此处发布此答案。这真的很有帮助。但是沿着“pushViewController”,我还需要从下一个控制器执行“Popviewcontroller”,我在那里尝试过,但现在可以工作了。而这里只有当我将一个视图推到另一个视图时它才有效。但是在我的应用程序中,我有两个控制器的层次结构,最高级别为 n。因此,不可能使用它来跟踪第二个视图控制器。
  • FirstView: (Button Next -Clicked) [UIView beginAnimations:nil context:NULL]; [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView:self.view.window cache:NO]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationDuration:1.0]; [UIView 提交动画]; [self.navigationController pushViewController:objCategory Animation:YES]; SecondView: (ViewWillAppear) [self.navigationController pushViewController:objCategory2View Animation:YES];现在请帮我解决这个问题。
  • 我想我可能有一个可能的解决方案,但我将编辑我的原始答案并添加,以便更容易阅读(以及输入)
  • 你好 Slev,我检查了这段代码,但没有在我身边工作。你能给我一些相同的工作参考吗?
  • 其中哪一部分不适合您?这样我就可以尝试为您提供代码以更好地满足您的需求。我之所以这么说,是因为我上面的代码对我有用(无论是从视图中去还是从视图中),所以如果你能让我知道哪个部分不起作用(或者你需要用它做什么),我会乐于助人
【解决方案2】:

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

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

【讨论】:

  • 你好,我删除了当前的图形上下文并设置了 NULL 但和以前一样。它就像在纵向模式下一样工作。根据从左到右的要求,不在横向工作。你能帮帮我吗?
  • 你有什么转换参考吗?
【解决方案3】:

试试这个:

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】:
    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];
    

    我认为这会成功。

    【讨论】:

    • 仅供参考 - 缩进 4 个空格(或使用 {} 按钮)来格式化代码 - 更多帮助 here
    • 你好,它不工作,顺便说一句,这是我在这里发布的相同代码。您能否提供完美的解决方案。感谢您的建议。
    【解决方案5】:

    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

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多