我有一个UIView,在layoutSubviews方法中,根据iPad的方向重新定位其子视图。在layoutSubviews方法中,我有一个CABasicAniamtion,它应该为子视图的重新定位设置动画。动画设置为特定持续时间,但忽略此持续时间并立即重新定位。我知道动画正在触发,因为我看到了AnimationDidStart和AnimationDidStop方法被触发。我知道这与UIView的CALayers有关,但我在网上找不到任何解释如何解决这个问题。任何帮助将不胜感激。
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];
}
}
答案 0 :(得分: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];
}