如何防止在自定义segue中堆叠视图?

时间:2018-06-13 20:13:07

标签: ios swift segue

我编写了一个模拟"左推"的自定义segue。我获取了2个视图的屏幕截图,从右到左为它们设置动画,然后显示目标视图并删除重叠的屏幕截图。我担心这最终导致堆叠视图彼此叠加,在这种情况下应该避免。动画完成后,我无法弄清楚如何正确地解除底层视图。我尝试使用navigationController?.pushViewController代替present,但我的尝试没有成功。我怎么能解决这个问题?

我的自定义信息:

class SeguePushLeft: UIStoryboardSegue
{
    override func perform()
    {
        self.source.view.isUserInteractionEnabled = false
        self.destination.view.isUserInteractionEnabled = false

        let slideViewOut = UIImageView(image: source.view.capture()!)
        let slideViewIn = UIImageView(image: destination.view.capture()!)

        let screenWidth = source.view.frame.size.width

        self.source.view.addSubview(slideViewIn)
        self.source.view.addSubview(slideViewOut)

        slideViewIn.transform = CGAffineTransform(translationX: screenWidth, y: 0)

        UIView.animate(withDuration: 0.4,
                       delay: 0.0,
                       usingSpringWithDamping: 1,
                       initialSpringVelocity: 0,
                       options: UIViewAnimationOptions.curveEaseOut,
                       animations: {

                        slideViewIn.transform = CGAffineTransform.identity
                        slideViewOut.transform = CGAffineTransform(translationX: -screenWidth, y: 0)

        }, completion: { finished in

            DispatchQueue.main.async{

                (self.source as UIViewController).present((self.destination as UIViewController), animated: false, completion: {

                    self.source.view.isUserInteractionEnabled = true
                    self.destination.view.isUserInteractionEnabled = true

                    slideViewIn.removeFromSuperview()
                    slideViewOut.removeFromSuperview()
                })
            }
        })
    }
}

1 个答案:

答案 0 :(得分:0)

[请原谅我以前过于仓促的答案。我正在进入另一个而不是编辑第一个,因为所有的评论现在都是第一个。]

问题很简单:你做错了。您希望做的是present转换,但使用自定义动画。这是完全可行的,你当然可以用自定义的segue来做,但你做这件事的方式并不是你这样做的。您可以使用自定义过渡动画来完成此操作。有一种固定的实现方式,而不是你如何处理事情。您需要了解如何为演示文稿转换编写自定义过渡动画,并且您将全部设置。