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

Posted

技术标签:

【中文标题】如何在关闭视图控制器时获得淡出动画【英文标题】:How to get a fade out animation while dismissing a view controller 【发布时间】:2017-11-30 11:08:07 【问题描述】:

我的视图控制器中有一个图像视图。当识别到视图控制器下方的平移手势时,我想关闭视图控制器。虽然我已经实现了使用平移手势关闭视图控制器,但我试图弄清楚如何在关闭之前添加动画,就像在 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 希望淡出动画能够工作,但它不起作用,一旦应用平移手势,视图就会消失。

如何在视图消失时添加淡出,就像在照片应用程序中一样。

【问题讨论】:

您可以在主视图前取一个视图,然后根据需要将背景颜色设置为带有 alpha 的白色 我试过了,还是不行。 [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]; ]; ]; 您忘记了一行 [self layoutifneeded]。在完成部分之前写它 【参考方案1】:

试试这个:

@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。将这些代码添加到按钮单击事件中,这对我有用。

【讨论】:

这有效(但与我上面提到的代码相同)。我真正想要的是我想展示这个,就像苹果在他们的照片应用程序中显示动画一样,就像我们只是将视图控制器扔到前一个视图中一样。 我找到了这个教程你可以参考:follow it【参考方案2】:

Swift 4.2、iOS 11

这是一种使用扩展的优雅方式:

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)

【讨论】:

这很好用!我为 fadeTransition 函数添加了一个参数,该函数采用双精度。然后将参数传递给 transition.duration。然后您可以在任何地方更改持续时间!【参考方案3】:

如果您需要在呈现或关闭 ViewController 时添加动画,您应该使用 UIViewControllerAnimatedTransitioning,这里有一个类似的答案: How do I do a Fade/No transition between view controllers

如果你需要它是交互式的,你可以使用UIPercentDrivenInteractiveTransition,这是一个控制百分比过渡的类。

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

【讨论】:

以上是关于如何在关闭视图控制器时获得淡出动画的主要内容,如果未能解决你的问题,请参考以下文章

无法在没有动画的情况下呈现和关闭视图控制器并获得不平衡调用以开始/结束外观转换

单击特定网格视图单元格时淡出网格视图

如何隐藏启动图像而不将其淡出? [复制]

使用标签栏控制器离开视图时如何关闭视图

自动淡出到 tabview 控制器 [关闭]

如何控制两个 UIImage 的无动画之间的淡入淡出?