自定义 Segue 在显示目标视图控制器之前动画为黑色

Posted

技术标签:

【中文标题】自定义 Segue 在显示目标视图控制器之前动画为黑色【英文标题】:Custom Segue animates into black before displaying destination view controller 【发布时间】:2017-07-17 14:03:55 【问题描述】:

我正在使用自定义 segue 在两个视图控制器之间进行转换。这是我用于其中一种转换的转场:

class SegueFromRight: UIStoryboardSegue
    override func perform() 
        // Assign the source and destination views to local variables.
        let src = self.source.view as UIView!
        let dst = self.destination.view as UIView!

        // Get the screen width and height.
        let screenWidth = UIScreen.main.bounds.size.width
        let screenHeight = UIScreen.main.bounds.size.height

        // Specify the initial position of the destination view.
        dst?.frame = CGRect(0.0, screenHeight, screenWidth, screenHeight)

        // Access the app's key window and insert the destination view above the current (source) one.
        let window = UIApplication.shared.keyWindow
        window?.insertSubview(dst!, aboveSubview: src!)

        // Animate the transition.
        UIView.animate(withDuration: 0.4, animations:  () -> Void in
            src?.frame = (src?.frame.offsetBy(dx: -screenWidth, dy: 0.0))!
            dst?.frame = (dst?.frame.offsetBy(dx: -screenWidth, dy: 0.0))!

        )  (Finished) -> Void in
            self.source.present(self.destination as UIViewController,
                                                            animated: false,
                                                            completion: nil)
        

    

segue 完美运行,但动画不是我想要的。当它“推动”目标视图控制器时,它显示为黑色。动画完成后,它才转向实际的视图控制器。我猜那是因为只有在动画完成后才会加载新的视图控制器。但是我将如何去预加载新的视图控制器,让动画看起来很流畅? unwinding segue 不会显示黑色动画,因为目标视图控制器(之前的源视图控制器)当然已经加载了。

【问题讨论】:

别忘了调用'super.perform()' 【参考方案1】:

这可能是你的问题dst?.frame = CGRect(0.0, screenHeight, screenWidth, screenHeight)

试试这个dst?.frame = CGRect(screenWidth, 0.0, screenWidth, screenHeight)

您的原始行将目标视图设置为不在屏幕底部,而不是在屏幕右边缘。当您按屏幕宽度为视图设置动画时,目标位置会从屏幕正下方滑到下方和左侧。

【讨论】:

这就是问题所在。忽略改变框架的坐标。谢谢,就是找不到!

以上是关于自定义 Segue 在显示目标视图控制器之前动画为黑色的主要内容,如果未能解决你的问题,请参考以下文章

swift 4 - segue 动画完成后如何在目标视图控制器中运行代码?

带有自定义转场的自动布局

使用自定义 segue 动画将一个视图替换为另一个视图?

UIStoryboardSegue:动画期间不显示视图

使用情节提要逆转自定义 Segue

如何实现自定义segue动画?