2013-02-06 48 views
2

我已经实现iOS中简单FlipView的意见:包含两个子视图,一次显示一个,当你点击它,它翻转他们的UIView。 我正在使用以下动画翻转。的UIView翻转变暗

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    @synchronized(self){ 
     if(!self.flipping){ 
      self.flipping = YES; 
      UIView *toView = self.currentView == self.primaryView ? self.secondaryView : self.primaryView;    
      [UIView transitionFromView:self.currentView toView:toView duration:self.speed options:UIViewAnimationOptionTransitionFlipFromLeft|UIViewAnimationOptionCurveEaseInOut completion:^(BOOL finished) { 
       [self.currentView removeFromSuperview]; 
       self.currentView = toView; 
       self.flipping = NO; 
      }];     
     } 
    } 
} 

非常直截了当,对吗?

但我是什么错误,虽然意见翻转,翻转的内容变暗。其中显示,在浅色背景下。

会有人知道一个解决方案具有完全相同的动画,但没有变暗(< =是,即使一个字?)

提前感谢!

PS:我针对iOS 5及以上版本。

回答

0

我成功了,获得灵感,我发现这里http://www.mycodestudio.com/blog/2011/01/10/coreanimation/代码(和他本人,采取了启发从http://www.mentalfaculty.com/mentalfaculty/Blog/Entries/2010/9/22_FLIPPIN_OUT_AT_NSVIEW.html

不管怎样,我做什么,两个视图之间旋转。

- (void)flip{ 
    @synchronized(self){ 
     if(!self.flipping){ 
      self.flipping = YES; 

      UIView *bottomView = self.currentView == self.primaryView ? self.secondaryView : self.primaryView; 
      CALayer *top = self.currentView.layer; 
      CALayer *bot = bottomView.layer; 

      CAAnimation *topAnimation = [self flipAnimationWithDuration:self.speed/2.0 forLayerBeginningOnTop:YES scaleFactor:1]; 
      CAAnimation *bottomAnimation = [self flipAnimationWithDuration:self.speed/2.0 forLayerBeginningOnTop:NO scaleFactor:1]; 

      CGFloat zDistance = 1500.0f; 
      CATransform3D perspective = CATransform3DIdentity; 
      perspective.m34 = -1./zDistance; 
      top.transform = perspective; 
      bot.transform = perspective; 

      topAnimation.delegate = self; 
      [CATransaction setCompletionBlock:^{ 
       [top removeAllAnimations]; 
       [self.currentView removeFromSuperview]; 
       self.currentView = bottomView; 
       [self addSubview:bottomView]; 

       [CATransaction setCompletionBlock:^{ 
        self.flipping = NO; 
        [bot removeAllAnimations]; 
       }]; 
       [CATransaction begin]; 

       [bot addAnimation:bottomAnimation forKey:@"flip"]; 

       [CATransaction commit]; 
      }]; 
      [CATransaction begin]; 
      [top addAnimation:topAnimation forKey:@"flip"]; 

      [CATransaction commit]; 
     } 
    } 
} 

-(CAAnimation *)flipAnimationWithDuration:(NSTimeInterval)aDuration forLayerBeginningOnTop:(BOOL)beginsOnTop scaleFactor:(CGFloat)scaleFactor 
{ 
    // Rotating halfway (pi radians) around the Y axis gives the appearance of flipping 
    CABasicAnimation *flipAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"]; 
    CGFloat startValue = beginsOnTop ? 0.0f : M_PI/2; 
    CGFloat endValue = beginsOnTop ? -M_PI/2 : 0.0f; 
    flipAnimation.fromValue = [NSNumber numberWithDouble:startValue]; 
    flipAnimation.toValue = [NSNumber numberWithDouble:endValue]; 

    // Shrinking the view makes it seem to move away from us, for a more natural effect 
    // Can also grow the view to make it move out of the screen 
    CABasicAnimation *shrinkAnimation = nil; 
    if (scaleFactor != 1.0) { 
     shrinkAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
     shrinkAnimation.toValue = [NSNumber numberWithFloat:scaleFactor]; 

     // We only have to animate the shrink in one direction, then use autoreverse to "grow" 
     shrinkAnimation.duration = aDuration * 0.5; 
     shrinkAnimation.autoreverses = YES; 
    } 

    // Combine the flipping and shrinking into one smooth animation 
    CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; 
    animationGroup.animations = [NSArray arrayWithObjects:flipAnimation, shrinkAnimation, nil]; 

    // As the edge gets closer to us, it appears to move faster. Simulate this in 2D with an easing function 
    animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:beginsOnTop?kCAMediaTimingFunctionEaseIn:kCAMediaTimingFunctionEaseOut]; 
    animationGroup.duration = aDuration; 

    // this really means keep the state of the object at whatever the anim ends at 
    // if you don't do this then it reverts back to the original state (e.g. brown layer) 
    animationGroup.fillMode = kCAFillModeForwards; 
    animationGroup.removedOnCompletion = NO; 

    return animationGroup; 
} 

这两个视图被命名为primaryView和secondaryView。您可以使用任何视图,(ImageView的,文本视图...)

0

我最近有类似症状的问题,我一遍又一遍地添加子视图再次别的地方在我的代码时,我犯了一定的作用。也许你正在做类似的事情?当你的触摸结束时,你是否在为翻转的内容做其他事情?你可能需要删除添加子视图,如果这是你的问题

+0

哼哼,这可能不是问题,因为我共享的所有,我在做的 - (无效)touchesEnded:(NSSet中*)触及withEvent:方法(的UIEvent *)事件... – Redwarp

+0

想知道,为什么要从超级视图中删除'self.currentView'?将'toView'引用到已从视图层次结构中删除的视图有什么用? – Ravi

+0

如果可能无用。我不确定。无论如何,我尝试过或者认为它不会改变一件事情...... – Redwarp