如何在关闭视图控制器时获得淡出动画

4

我的视图控制器中有一个图像视图。当向下滑动手势被识别时,我想要关闭视图控制器。虽然我已经实现了通过手势关闭视图控制器,但我正在尝试弄清楚如何在关闭前添加动画,就像iPhone中的照片应用程序一样。

 -(void)addPanGesture{

    UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dismissViewGes:)];
    gestureRecognizer.delegate = self;
    [self.view addGestureRecognizer:gestureRecognizer];


}



-(void)dismissViewGes:(UIPanGestureRecognizer *)gesture {


    CGPoint velocity = [gesture velocityInView:self.view];


    if(velocity.y > 0)
    {



        CATransition *transition = [[CATransition alloc]init];
        transition.duration = 2;
        [transition setValue:[NSNumber numberWithFloat:0.5f] forKey:kCATransitionFade];
        transition.subtype = kCATransitionFromTop;
        [self.view.layer addAnimation:transition forKey:nil];

        [[NetWrapper shared] addRemovedController:self];
        [self dismissViewControllerAnimated:NO completion:nil];


    }

}

我尝试添加CATransition,希望淡出动画能够起作用,但它并没有起作用,视图在应用滑动手势后立即关闭。
如何在视图关闭时添加淡出效果,就像照片应用程序中一样。

Photo viewer. I have this right now and when i use Pan gesture on this view it gets dismissed. But i want to add an animation so that it gets dismissed as in the second picture

This is the animation I want to achieve


你可以在主视图前面创建一个视图,然后将其背景颜色设置为所需的透明度白色。 - Jitendra Modi
我尝试了,甚至那也不起作用。 [UIView animateWithDuration:2.0f animations:^{ [self.view setAlpha:0.5]; } completion:^(BOOL finished) { [UIView animateWithDuration:0.3f animations:^{ [self.view setAlpha:0.1]; } completion:^(BOOL finished) { //[[NetWrapper shared] addRemovedController:self]; [self dismissViewControllerAnimated:NO completion:nil]; }]; }]; - SriTeja Chilakamarri
你忘记了一行[self layoutIfNeeded]。在完成部分之前写上它。 - Jitendra Modi
3个回答

7

试试这个:

@IBAction func clickDismiss(_ sender: Any) {
    let transition: CATransition = CATransition()
    transition.duration = 0.5
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.type = kCATransitionFade
    transition.subtype = kCATransitionFromBottom
    self.view.window!.layer.add(transition, forKey: nil)
    self.dismiss(animated: false, completion: nil)
}

我创建了一个SubViewController并在上面添加了一个UIButton。将以下代码添加到按钮的点击事件中,这个方法对我有效。


1
这个可以运行(但与我上面提到的代码相同)。实际上我想要的是像苹果在他们的照片应用程序中展示动画一样,就像我们只是将视图控制器抛到前一个视图中。 - SriTeja Chilakamarri
我找到了这个教程,你可以参考一下:跟着它走 - 成文权

5

Swift 4.2,iOS 11

这里有一种优雅的方法,使用扩展(extension):

extension CATransition {
    func fadeTransition() -> CATransition {
        let transition = CATransition()
        transition.duration = 0.4
        transition.type = CATransitionType.fade
        transition.subtype = CATransitionSubtype.fromRight

        return transition
    }
}

那么,您只需在函数中或在UIViewController的动作按钮内编写以下三行代码:

private func dismissVC() {
    let transition = CATransition().fadeTransition()
    navigationController?.view.layer.add(transition, forKey: kCATransition)
    navigationController?.popViewController(animated: false)
}

2
这个很棒!我为fadeTransition函数添加了一个接受double类型参数的参数。然后将该参数传递给transition.duration。这样你就可以随时更改持续时间了! - pcnick13

0

如果您需要在呈现或取消视图控制器时添加动画,应使用UIViewControllerAnimatedTransitioning,这里有一个类似的答案: 如何在视图控制器之间进行淡入/淡出转换

如果您需要交互式操作,则可以使用UIPercentDrivenInteractiveTransition,它是一种以百分比控制转换的类。

关于所有这些,苹果提供了一个很棒的样例代码: https://developer.apple.com/library/content/samplecode/CustomTransitions/Introduction/Intro.html 它有点旧,但很简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接