2010-09-23 80 views
0

我有一个UIView,它在layoutSubviews方法中根据iPad的方向重新定位其子视图。在layoutSubviews方法中,我有一个CABasicAniamtion,它应该为子视图的重新定位创建动画。动画被设置为特定的持续时间,但该持续时间被忽略,重新定位立即发生。我知道动画正在触发,因为我看到了AnimationDidStart和AnimationDidStop方法被触发。我知道这与UIView的CALayers有关,但我无法在网上找到任何解释如何解决这个问题的方法。任何帮助,将不胜感激。旋转过程中忽略CABasicAnimation

if([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) 
    { 
     NSLog(@"Orientation: Portrait"); 

     //Hide icon 

     CABasicAnimation *iconAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
     iconAnimation.fromValue = [NSValue valueWithCGPoint:[iconImageView center]]; 
     iconAnimation.toValue = [NSValue valueWithCGPoint:iconThinPosition]; 
     iconAnimation.duration = 2.7f; 
     iconAnimation.autoreverses = NO; 
     iconAnimation.repeatCount = 1; 
     iconAnimation.delegate = self; 
     [iconImageView.layer addAnimation:iconAnimation forKey:@"position"]; 
     //[iconImageView setCenter:iconThinPosition]; 

     [iconImageView.layer setPosition:iconThinPosition]; 
     //[iconImageView setTransform: CGAffineTransformIdentity]; 

     CABasicAnimation *textAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
     textAnimation.fromValue = [NSValue valueWithCGPoint:[textImageView center]]; 
     textAnimation.toValue = [NSValue valueWithCGPoint:textThinPosition]; 
     textAnimation.duration = 2.7f; 
     textAnimation.autoreverses = NO; 
     textAnimation.repeatCount = 1; 
     textAnimation.delegate = self; 
     [textImageView.layer addAnimation:textAnimation forKey:@"position"];   
     [textImageView.layer setPosition:textThinPosition]; 

    } 
    else if([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight) 
    { 
     NSLog(@"Orientation: Landscape");   

     // Show Icon 
     CABasicAnimation *iconAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
     iconAnimation.fromValue = [NSValue valueWithCGPoint:[iconImageView center]]; 
     iconAnimation.toValue = [NSValue valueWithCGPoint:iconShownPosition]; 
     iconAnimation.duration = 2.7f; 
     iconAnimation.autoreverses = NO; 
     iconAnimation.repeatCount = 1; 
     iconAnimation.delegate = self; 
     [iconImageView.layer addAnimation:iconAnimation forKey:@"position"]; 
     [iconImageView.layer setPosition:iconShownPosition]; 

     CABasicAnimation *textAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
     textAnimation.fromValue = [NSValue valueWithCGPoint:[textImageView center]]; 
     textAnimation.toValue = [NSValue valueWithCGPoint:textShownPosition]; 
     textAnimation.duration = 2.7f; 
     textAnimation.autoreverses = NO; 
     textAnimation.repeatCount = 1; 
     textAnimation.delegate = self; 
     [textImageView.layer addAnimation:textAnimation forKey:@"position"]; 
     [textImageView.layer setPosition:textShownPosition]; 
    } 
} 

回答

1

我不知道它是否被忽略,因为已经有一个动画事务正在进行中,当你调用layoutSubviews时。你可以尝试确认的一件事是重写-didRotateFromInterfaceOrientation并从那里调用你的layoutSubviews。看看你的观点是否动画。

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
// [self layoutSubviews]; 
    // Give it a second to settle after the rotation and then call 
    // layoutSuviews explicitly. 
    [self performSelector:@selector(layoutSubviews) withObject:nil afterDelay:1.0f]; 
} 

另一个要考虑的是,因为你只在动画UIView的的层的位置,你可以使用UIView的动画,而不是明确的动画。例如:

if([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) 
    { 
     NSLog(@"Orientation: Portrait"); 

     //Hide icon 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:2.7f]; 
     [iconImageView setCenter:iconThinPosition]; 
     [textImageView setCenter:textThinPosition]; 
     [UIView commitAnimations]; 

    } 
    else if([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight) 
    { 
     NSLog(@"Orientation: Landscape");   

     // Show Icon 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:2.7f]; 
     [iconImageView setCenter:iconShownPosition]; 
     [textImageView setCenter:textShownPosition]; 
     [UIView commitAnimations]; 

    }