【问题标题】:Swift segue transition shadowSwift segue 过渡阴影
【发布时间】:2017-08-03 16:22:17
【问题描述】:

我正在使用故事板中的一些标准转场,它们每个都有相同的背景颜色。我遇到的问题是,当转场过渡接近完成时,整个帧周围会出现类似背景的暗阴影。

它非常微弱,但足以引起问题。有没有人遇到过这种情况?

【问题讨论】:

  • 是的。这是离开视图控制器动画消失的时候。使用推送和呈现。从底部模态显示控制器时不会。
  • 从视图的角度来看,就好像 segue 在离开视图控制器的顶部添加了一个阴影覆盖以实现美观。不知道如何删除它。
  • 是的,标准的推送/弹出似乎使您正在推送的视图和您正在弹出的视图变暗。如果您不喜欢这样,您可能必须定义自己的自定义导航控制器动画。
  • 我可以执行自定义 segue 还是也会变暗?
  • 是的,但是现在自定义动画的标准技术是自定义过渡,而不是自定义转场。

标签: ios swift storyboard segue


【解决方案1】:

标准的导航控制器推送/弹出动画会使您从中推送的视图和您要弹出的视图变暗。如果您不喜欢这样,您可以自定义过渡,使用仅滑动视图进出的动画,但不会使任何内容变暗:

// this is the view controller you are pushing from

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationController?.delegate = self
    }

}

// make the view controller conform to `UINavigationControllerDelegate`

extension ViewController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return PushPopAnimator(operation: operation)
    }
}

// The animation controller

class PushPopAnimator: NSObject, UIViewControllerAnimatedTransitioning {
    let operation: UINavigationControllerOperation

    init(operation: UINavigationControllerOperation) {
        self.operation = operation
        super.init()
    }

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let from = transitionContext.viewController(forKey: .from)!
        let to   = transitionContext.viewController(forKey: .to)!

        let rightTransform = CGAffineTransform(translationX: transitionContext.containerView.bounds.size.width, y: 0)
        if operation == .push {
            to.view.transform = rightTransform
            transitionContext.containerView.addSubview(to.view)
            UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: { 
                to.view.transform = .identity
            }, completion: { finished in
                transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
            })
        } else if operation == .pop {
            to.view.transform = .identity
            transitionContext.containerView.insertSubview(to.view, belowSubview: from.view)
            UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
                from.view.transform = rightTransform
            }, completion: { finished in
                from.view.transform = .identity
                transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
            })
        }
    }
}

有关使用视图控制器的自定义转换的信息,请参阅 WWDC 2013 视频Custom Transitions Using View Controllers

【讨论】:

  • 谢谢,已将您回答中的动画更改为任何需要它的人的默认segue。 segue 没有考虑到我有一个导航栏并将视图向上移动 64 点。有没有办法解决这个问题?
  • 是的,您可以将animate(withDuration: ...) 参数更改为您想要的任何参数。话虽如此,我拒绝了您的编辑,因为您在此过程中吹走了整个 PushPopAnimator 类定义,这将使不熟悉自定义转换的人很难理解这个答案。这已经够难了……;)
  • 不用担心。感谢您的帮助。
猜你喜欢
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多