2011-02-28 88 views
4

考虑:UIView的垂直翻转动画

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
[UIView setAnimationDuration:.5]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:card cache:NO]; 
myPic = [UIImage UIImagenamed: @"mySecondImage.png"]; 
[UIView commitAnimations];[/CODE] 

哪个动画 'myPic' 向左与向右翻转。

我需要获得相同的动画,但垂直。从顶部翻转或从底部翻转。我环顾四周,没有人真的有建议的工作模式。

我想这一点,到目前为止,还没有运气:

float duration = .5; 
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"]; 
animation.fromValue = [NSNumber numberWithDouble:0.0f * M_PI]; 
animation.toValue = [NSNumber numberWithDouble:1.0f * M_PI]; 
animation.duration = duration; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeBoth; 
animation.repeatCount =1;; 
animation.beginTime = CACurrentMediaTime(); 
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
card.layer.anchorPoint = CGPointMake(0.5, 1.0); 
[card.layer addAnimation:animation forKey:@"rotationX"];[/CODE] 

任何输入? 在此先感谢。

+0

您应该编辑此问题以使用代码的“代码”布局,以便它实际上可读。 – PengOne 2011-02-28 16:12:28

+0

对不起。只是改变了它。 – Gizmodo 2011-02-28 16:14:47

+0

定义“没有运气”。当你运行这段代码时会发生什么? – occulus 2011-02-28 17:19:53

回答

7

我还需要从底部动画翻转。我已经编译了几个解决方案,这对我很有用

- (CATransform3D) makeRotationAndPerspectiveTransform:(CGFloat) angle { 
    CATransform3D transform = CATransform3DMakeRotation(angle, 1.0f, 0.0f, 0.0f); 
    transform.m34 = 1.0/-500; 
    return transform; 
} 

- (void) flipFromBottom { 

    //setup firstView to be visible 
    view1.layer.transform = CATransform3DMakeRotation(0, 1.0f, 0.0f, 0.0f); 
    view1.hidden = NO; 

    // setup secondView to be partialy rotated and invisible 
    view2.layer.transform = [self makeRotationAndPerspectiveTransform:M_PI/2]; 
    view2.hidden = YES; 

    // making sure that both views have the same position 
    view2.frame = view1.frame; 

    CFTimeInterval duration = 2.0; 

    [UIView animateWithDuration:duration/2 
          delay:0 
         options:UIViewAnimationCurveEaseIn 
        animations:^{ 
         view1.layer.transform = [self makeRotationAndPerspectiveTransform:-M_PI/2]; 
        } 
        completion:^(BOOL finished){ 
         view1.hidden = YES; 
         view2.hidden = NO; 
         [UIView animateWithDuration:duration /2 
               delay:0 
              options:UIViewAnimationCurveEaseOut 
              animations:^{ 
          view2.layer.transform = CATransform3DMakeRotation(0.0f, 1.0f, 0.0f, 0.0f); 
              } 
              completion:NULL]; 
        }]; 
} 
+0

这对我来说几乎适用。但是,启动UIView的上半部分以及进入视图的新UIView在动画开始时完全不可见。有没有我需要在这些视图上设置的定位点值,以便它们的上半部分不会被裁剪? – idStar 2012-04-12 21:16:58