为什么在自定义交叉溶解segue中视图控制器的主视图不对齐?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在自定义交叉溶解segue中视图控制器的主视图不对齐?相关的知识,希望对你有一定的参考价值。

我编写了一个自定义的UIStoryboardSegue子类来创建两个UIViewControllers之间的淡出/淡入,交叉溶解过渡。

视图控制器的主视图具有在每个视图中居中的按钮(标记为“视图控制器1”和“视图控制器2”,因此我假设当我将一个交叉溶解到另一个时 - 将它们设置为相同的超级视图和使他们的框架相同 - 按钮也将对齐。

class SwapSegue: UIStoryboardSegue {

    override func perform() {
        fade()
    }

    func fade() {
        destination.view.alpha = 0

        source.view.superview?.addSubview(destination.view)
        destination.view.frame = source.view.frame

        UIView.animate(withDuration: 1, delay: 0, options: .curveEaseInOut, animations: {
            self.destination.view.alpha = 1
        }, completion: { success in
            if var controllerStack = self.source.navigationController?.viewControllers {
                controllerStack[controllerStack.firstIndex(of: self.source)!] = self.destination
                self.source.navigationController?.setViewControllers(controllerStack, animated: false)
            } else {
                self.source.present(self.destination, animated: false, completion: nil)
            }
        })

    }
}

这几乎可以工作,但它不会在转换过程中正确定位目标视图,所以当segue的动画完成时,最后会有一个“pop”。对齐似乎大致偏离了导航栏的高度,所以我怀疑这是一个线索。

Swap pop

(注意:在这个循环GIF中你可以看到按钮按下“View Controller 1”,动画交叉淡入淡出,按钮未对齐,然后动画完成时最后的“pop”和目标视图控制器终于放好了。)

如何正确定位它以使其按照应有的方式对齐并且动画将是平滑的?

答案

我找到了解决方案。我不能100%确定为什么会这样,所以如果你能解释一下,请在下面的评论中这样做。

最初我通过自动布局将两个按钮置于视图控制器的主视图中心。

通过将子视图(我们称之为“内容视图”)添加到每个视图控制器的主视图,固定到其边缘,并使该视图中的每个按钮居中,过渡现在可以按预期工作。

Intermediate "content view"

enter image description here

以上是关于为什么在自定义交叉溶解segue中视图控制器的主视图不对齐?的主要内容,如果未能解决你的问题,请参考以下文章

展开后执行segue

IOS Segue 在自定义标签栏中不起作用

Segue 作为一种新观点

从 nib 文件在自定义视图中设置自定义委托

在选项卡之间切换时如何创建交叉溶解动画

以编程方式 Swift Segue