5

我被一个非常简单的任务难住了,我想要一个 UIView 动画来缓入/缓出,但尽管使用了正确的动画选项,它总是线性的。

这是所有帐户都应该工作的代码,它设置在 UIViewControllerAnimatedTransitioning 类中,但我在以前的自定义 segue 类中遇到了同样的问题;

[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^(void) {

        self.dimView.alpha = 1.0;
        self.imageView.frame = self.destinationRect;

    } completion:^(BOOL finished) {

        [self.imageView removeFromSuperview];
        [self.dimView removeFromSuperview];

        [transitionContext completeTransition:YES];

     }];

但是,使用以下代码的弹簧动画可以工作,尽管我不想这样做。

[UIView animateWithDuration:0.8f delay:0 usingSpringWithDamping:0.7f initialSpringVelocity:2.0f options:UIViewAnimationOptionCurveEaseInOut animations:^(void) {

        self.dimView.alpha = 1.0;
        self.imageView.frame = self.destinationRect;

     } completion:^(BOOL finished){

        [self.imageView removeFromSuperview];
        [self.dimView removeFromSuperview];

        [transitionContext completeTransition:YES];

     }];

我在模拟器和 iPad2 测试设备上得到了相同的行为。难道我做错了什么?动画帧或 alpha 值是否存在问题?

4

3 回答 3

3

你可以试试这个。-

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.4f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop)];

self.dimView.alpha = 1.0;
self.imageView.frame = self.destinationRect;

[UIView commitAnimations];

- (void) animationDidStop {
    [self.imageView removeFromSuperview];
    [self.dimView removeFromSuperview];
    [transitionContext completeTransition:YES];
}

希望能帮助到你。

于 2013-10-02T11:08:02.460 回答
1

您可以使用以下内容:

[自我转换:左];//根据需要调用

enum animationFrom {
    top,
    bottom,
    left,
    right
};

- (void)transition:(NSUInteger)index {
    CATransition *tr=[CATransition  animation];
    tr.duration=0.45;
    tr.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    tr.type=kCATransitionPush;
    tr.delegate=self;
    switch (index) {
        case top:
            tr.subtype=kCATransitionFromBottom;
            break;
        case bottom:
            tr.subtype=kCATransitionFromTop;
            break;
        case left:
            tr.subtype=kCATransitionFromRight;
            break;
        case right:
            tr.subtype=kCATransitionFromLeft;
            break;
        default:
            break;
    }
    [self.view.layer addAnimation:tr forKey:nil];
}
于 2013-10-08T11:45:12.283 回答
1

默认的动画曲线选项是UIViewAnimationOptionCurveEaseInOut,所以你不需要指定这个。这是UIViewAnimationOptionCurveLinear你必须明确的。

你确定你的动画曲线是线性的吗?尝试同时设置两个视图的动画,动画持续时间设置为几秒钟。

于 2013-10-08T13:56:52.900 回答