【问题标题】:Navigation Bar is Black during Custom Unwind Segue自定义展开 Segue 期间导航栏为黑色
【发布时间】:2018-06-14 21:20:40
【问题描述】:

我自定义了UIStoryboardSegue,但是当它展开时,它似乎导致我的UINavigationBar 变黑,然后又恢复到正确的颜色。请参阅下面的 GIF。

我的自定义 segue 只是让新的 ViewController 从顶部下来,然后回到顶部。

这里是UIStoryboardSegue 代码:

import UIKit

class SlideDownSegue: UIStoryboardSegue {

var duration: Double = 0.5

override func perform() {

    let screenHeight = UIScreen.main.bounds.size.height
    let toVC = self.destination
    let fromVC = self.source

    toVC.view.transform = CGAffineTransform(translationX: 0, y: -screenHeight)
    UIApplication.shared.keyWindow?.insertSubview(toVC.view, aboveSubview: fromVC.view)

    UIView.animate(withDuration: duration, delay: 0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
        toVC.view.transform = CGAffineTransform.identity
    }, completion: {
        success in
        fromVC.present(toVC, animated: false, completion: nil)
    })
}
}

class UnwindSlideDownSegue: UIStoryboardSegue {

override func perform() {

    let screenHeight = UIScreen.main.bounds.size.height
    let toVC = self.destination
    let fromVC = self.source.parent!

    fromVC.view.superview?.insertSubview(toVC.view, at: 0)

    UIView.animate(withDuration: 0.5, delay: 0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
        fromVC.view.transform = CGAffineTransform(translationX: 0, y: -screenHeight - 100)
    }, completion: {
        success in
        fromVC.dismiss(animated: false, completion: nil)
    })
}
}

如果我通过转到屏幕底部让展开执行它刚刚离开的默认位置,但保留我的自定义以显示新视图,UINavigationBar 保持它的正确颜色,只有当我使用我的代码时用于在动画期间使 UINavigationBar 变黑的放松。

任何提示将不胜感激。

---编辑---

我玩了一下,如果我进入 AppDelegate 并将UINavigationBar.appearance().isTranslucent = false 更改为true,我会得到一个白色背景,但它只是看起来导航栏突然出现了。我想知道是否由于某种原因被卸载,然后在视图控制器处于活动状态后重新加载。

---编辑 2---

我可以通过 hack 来修复它。在AppDelegate 里面func application(... didFinishLaunchingWithOptions ...) 我添加了self.window?.backgroundColor = UIColor.{your color} 但所做的只是让黑色部分现在出现我的颜色,导航栏由于某种原因在segue期间仍然消失。

【问题讨论】:

  • 尝试设置导航控制器视图的背景颜色以匹配。既然你这样做了,你可以添加另一个 gif 吗?

标签: uinavigationbar ios11 swift4 uistoryboardsegue xcode9


【解决方案1】:

这是使用snapshotView(afterScreenUpdates:) 的绝佳机会。这就是UIKit 执行许多库存转换的方式(即使在UINavigationController 中),这是执行自定义转换的绝佳方式,特别是如果您想应用效果。拍摄目标的快照(将有一个完整的导航栏),将其插入源正下方,执行动画,关闭源以便目标​​准备就绪,最后删除您甚至不会注意到的快照,因为它将准确地反映目的地。

【讨论】:

  • 这听起来很有趣,我将研究它是如何工作的以及如何做到这一点。谢谢。
  • 我想你没有可以给我的示例代码,对吗?
  • gist.github.com/iabuseservers/c1bb48682b65d7d431454b02ba8d12c5 我为使用snapshotView() 的自定义模态演示制作了一个动画。 Segues,presents,shows,它们基本上都是一样的,snapshotView的原则绝对不会改变。希望对您有所帮助。
  • 该要点的另一个很酷的事情是如何使用CATransaction 作为UIView.animate() 的包装器,以便能够添加自定义计时功能(也称为缓动)。您不必使用像easeIneaseInOut 这样的库存曲线,您可以使用控制点制作自己的曲线。 let timingFunction = CAMediaTimingFunction(controlPoints: 0.25, 0.75, 0.25, 1) 和创建它们的好工具是 netcetera.org/camtf-playground.html
  • 顺便说一句,如果你想自己看这个,推到一个带有文本字段和键盘的视图控制器并打开它,这样文本字段中的光标就会闪烁。然后用平移手势弹出那个视图控制器,这样你就可以把它放在那里,你会看到光标停止闪烁(因为它是一个快照)。当你放手时,快照被移除,光标再次开始闪烁。我认为UINavigationControllertofrom 视图控制器上都使用了快照。
【解决方案2】:

如果您想要一个简单的技巧,请尝试将背景颜色设置为window in AppDelegate's didFinishLaunchingWithOptions 到导航栏的颜色,它适用于我:) 像这样 window?.backgroundColor = myColor

【讨论】:

  • 感谢您的建议,但这就是我在编辑 2 部分中所做的工作,我只是希望导航栏的真正解决方案。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 2012-09-17
相关资源
最近更新 更多