【问题标题】:UINavigationController weird transparency behaviour when presenting呈现时 UINavigationController 奇怪的透明度行为
【发布时间】:2019-12-03 05:19:57
【问题描述】:

我在使用透明导航控制器时遇到了一个奇怪的故障。当在导航控制器的顶部显示带有UIImage 的视图控制器时:首先将其背景模糊的一半呈现为深色部分,另一半呈现清晰的部分;在很短的时间后,它会变成一个完全黑暗的背景。如gif所示:

显示的UIImage 大部分是白色的,边框非常接近纯白色。所以灰色没有多大意义(意义越少,变化越快)。

我确实在 Storyboard 中为呈现的视图控制器禁用了 extend edges under top bar。所以图像不会隐藏在导航控制器后面。启用此选项后,故障不会出现,但我不想隐藏部分图像。

禁用透明度,解决了我的问题,但我希望能够保持透明效果。

编辑:我确实注意到“灰色效果”也使导航控制器不透明。但只有那个视图,当返回时,又是透明的。

Xcode 11、Swift 5、iOS 13.2、iPhone XS。


非常感谢您的帮助。

【问题讨论】:

  • 我会检查你的 navigationController 视图的背景颜色。看起来它是透明的(这是默认设置)可能会有所帮助
  • @DavidLintin 在视图上设置颜色可以缓解问题,但故障仍然存在......您的意思是这样吗?

标签: swift user-interface uinavigationcontroller uinavigationbar ios13


【解决方案1】:

我终于找到了问题。

我不希望UIScrollView 在顶部弹跳,所以我使用了以下代码:

extension ProblematicViewController: UIScrollViewDelegate {
    /// Prevent bounce at top
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.contentOffset.y < 0 {
            scrollView.contentOffset.y = 0
        }
    }
}

这意味着 ViewController 的 Adjust Scroll View Insets 被覆盖(我认为)。所以我的滚动视图确实位于UINavigationController 之下,为了防止这种情况发生,我确实禁用了Extend Edges: Under Top Bars,因此包含UIScrollView 的根UIView 没有被UINavigationController 覆盖。因此,透明效果永远不会发生,因为视图从未位于顶部栏下方。 More about Adjust Scroll View Insets on this post(帮我找到问题)。

删除这些行并启用Adjust Scroll View InsetsExtend Edges: Under Top Bars,解决了故障问题,但UIViewController 没有我想要的“防止弹跳”行为。

这有点解释了 UINavigationController 的奇怪行为,因为 SO 必须计算透明度,但很奇怪,透明度效果是在 ProblematicViewController 完全呈现时计算的,而不是在 viewDidLoad()或之前的另一个视图的生命周期会显示给用户,因此过渡是平滑的,即使效果背后没有任何东西。

【讨论】:

  • 你修好了它很好。但这个答案绝不是从问题中的信息中得出的。
  • @matt 我没有得到反对意见。这是由Extend Edges: Under Top Bars 被禁用(在问题中)引起的,只是通过禁用它而发生。不回答为什么会发生故障的问题,因此不是公认的答案。我的回答包含所有关于我为什么认为它这样做的信息,只是如果有人遇到同样的问题,这不是解决方案,也许是一种解决方法。如果您(或某人)回答只是“看起来UINavigationController 后面没有任何内容,请在后面添加一些内容以便计算效果”会有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2018-05-04
  • 2011-12-05
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多