【发布时间】:2019-12-29 03:23:16
【问题描述】:
我正在尝试创建一系列使用自定义 segues 协同工作的页面。这些 segues 工作正常,直到我让它们按某个系列执行。从 VC1 我通过默认的模态转场进入 VC2(它会在原始转场上弹出)。然后,我从 VC2 转到 VC3,使用自定义水平 segue(下面的代码)。最后,我使用自定义展开水平转场从 VC3 回到 VC1。问题是当我回到 VC1 时,却出现了 VC2。我检查了 ViewDidLoad 在它出现时并没有在 VC2 中执行,但是在触发时我仍然可以与之交互。对于正在发生的事情,我最好的猜测是 VC2 覆盖了 VC1,所以当我回到 VC1 时,VC2 会显示在它上面。即使这是问题所在,我也不知道如何解决。代码如下:
水平转场:
class HorizontalSegue: UIStoryboardSegue {
override func perform() {
let src = self.source as UIViewController
let dst = self.destination as UIViewController
src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)
UIView.animate(withDuration: 0.2, delay: 0.0, options: [.curveEaseOut], animations: {
dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
},
completion: { finished in
src.present(dst, animated: false, completion: nil)
})
}
}
展开水平转场:
class UnwindHorizontalSegue: UIStoryboardSegue {
override func perform() {
let src = self.source as UIViewController
let dst = self.destination as UIViewController
src.view.superview?.insertSubview(dst.view, belowSubview: src.view)
src.view.transform = CGAffineTransform(translationX: 0, y: 0)
UIView.animate(withDuration: 0.2, delay: 0.0, options: [.curveEaseIn], animations: {
src.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)
},
completion: { finished in
src.dismiss(animated: false, completion: nil)
})
}
}
【问题讨论】:
-
“我的最佳猜测” 为什么猜测? View Debugger 会告诉你具体的情况。
-
而且无论如何你所做的一切都是非法的。您可以像这样移动视图控制器视图。如果目标是自定义演示动画,那么有一种正确的方法可以做到这一点,而您正在做的不是它。而且您的自定义 segue 结构也是错误的。
-
@matt 好吧,告诉我我在做什么是错误的,这本身并没有多大帮助。什么是“正确的做法”?
-
如何为呈现/关闭的视图控制器编写自定义过渡动画有很好的文档记录,并且在这里和其他地方已经解释了很多次,包括我。这不是重点。关键是你让自己陷入了一个不连贯的视图控制器情况,现在你意识到了。
-
@matt 实际上,我确实是通过一个相对赞成的堆栈溢出帖子来解决这个问题的。我做错了什么?我确实想知道我做错了什么。
标签: swift xcode uiviewcontroller segue uistoryboardsegue