Segue 动画无法完全正常工作

Posted

技术标签:

【中文标题】Segue 动画无法完全正常工作【英文标题】:Segue animation isn't fully working 【发布时间】:2017-09-19 20:19:48 【问题描述】:

所以我有 2 个视图控制器和一个导航控制器。当点击屏幕时,第一个 VC 切换到第 2 个 VC,并且有一个后退按钮可以让 segue 展开以返回到第一个 VC。

我不喜欢 segues 的垂直动画,所以(在一些帮助下)我创建了自定义的水平动画。

第一个 VC 非常适合动画从右向左滑动。但是一旦这样做了,第二个 VC 就不想放松了(第二个 VC 应该从左到右)。

我确实收到了这个警告..

警告:尝试在 TestApp.HomeViewController: 0x7fce20410030 上呈现 UINavigationController: 0x7fce2082b000,其视图不在窗口层次结构中!

另外,如果我从第一个 VC segue 中获取脚本,那么我可以通过适当的动画从第二个 VC 中放松。

这是转场的代码:

第一个 VC

@IBAction func performSegue(_ sender: Any) 

    if shouldPerformSegue(withIdentifier: "segue", sender: Any?.self) 

        performSegue(withIdentifier: "segue", sender: nil)
    


@IBAction func unwindToHomeView(segue: UIStoryboardSegue) 



override func unwind(for unwindSegue: UIStoryboardSegue, towardsViewController subsequentVC: UIViewController) 
    let segue = SegueFromLeft(identifier: unwindSegue.identifier, source: unwindSegue.source, destination: unwindSegue.destination)
    segue.perform()

从右到左的动画

    let dst = self.destination
    let src = self.source

    let containerView = src.view.superview

    dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)

    containerView?.addSubview(dst.view)

    UIView.animate(withDuration: 0.25, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: 
        dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
    , completion:  success in
        src.present(dst, animated: false, completion: nil)
    )

从左到右的动画

    let dst = self.destination
    let src = self.source

    src.view.superview?.insertSubview(dst.view, at: 0)

    UIView.animate(withDuration: 0.25, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: 
        src.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)
    , completion:  success in
        src.dismiss(animated: false, completion: nil)
    )

任何帮助将不胜感激。

【问题讨论】:

所以.. 我取消了动画。我的动画的解决方案相当简单。只需切换导航器的位置,并将其作为初始视图控制器就可以了。修复任何动画或推送问题。 不确定我是否应该放下我的解决方案,因为它并不能真正帮助回答我的具体问题。 【参考方案1】:

您可以简单地将 viewcontroller 推送到不需要显式处理左右动画的导航控制器。在 VC1 中,navigationController?.pushViewController(VC2, animated: true) 将简单地使用方便的后退按钮从右到左为 VC2 设置动画,该按钮可用于从左到右为 VC2 设置动画以显示 VC1。

【讨论】:

如果我在 VC2 中有一个自定义的后退按钮,那么我是否只使用 pop 功能? 如果您有自定义按钮需要触发弹出功能,它不会自动弹出VC。在按钮navigationController?.popViewController(animated: true) 的操作上,这将弹出当前的vc。 使用你的代码给了我一个错误,关于无法转换视图控制器类型的问题。所以我尝试了这个:let vcName = "Main"let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)self.navigationController?.pushViewController(viewController!, animated: true.. 我很确定我过去使用过类似的代码,但这仍然不起作用。 感谢您的帮助。您没有我使用的完整解决方案,但您确实引导我尝试了它,所以我会为您的答案投票。 您的解决方案可能对其他人有所帮助,因此请发布。【参考方案2】:

对于我的解决方案,我实际上取消了任何“自定义”动画,并主要通过将导航控制器作为初始控制器移动并附加到 VC1 来解决我的问题。

从那里我只是推到下一个视图(VC2),并使用 unwind segue 返回(到 VC1)。

推送基本代码:

let vcName = "Main"
let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)
self.navigationController?.pushViewController(viewController!, animated: true)

【讨论】:

以上是关于Segue 动画无法完全正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Xcode segue 有时会导致后屏

我将默认命令迁移到 PlistBuddy,它输出完全相同的 plist,但无法正常工作

下面的代码是每次单击按钮时显示随机颜色。但尽管已完全编译,但它无法正常工作。谢谢

使用Visual Studio 2015,2017,CMake 3.10完全无法正常工作

使用平移的 UIImageView 移动不完全平滑

动画后执行 Segue,但动画项目回到之前的位置