隐藏导航栏会导致其下方和上方的空间

Posted

技术标签:

【中文标题】隐藏导航栏会导致其下方和上方的空间【英文标题】:Hiding Navigation Bar Causes Space Under It and Above View 【发布时间】:2018-03-22 00:37:43 【问题描述】:

问题

导航栏在滚动时会显示动画 (hidesBarsOnSwipe)。如果页面上有一个带有部分标题的表格,部分标题将贴在视图顶部并在用户滚动时跟随用户。当这两者一起使用时,当导航栏隐藏时,节标题和导航栏之间存在间隙,显示背景表格单元格。我希望部分标题跟随导航栏,因为它没有间隙地隐藏。

对于我的问题,使用节标题并不是绝对必要的。我只是想要一个贴在屏幕顶部并在用户滚动时跟随用户的栏。

我已经尝试了下面发布的示例的替代方法,它使用UITableViewController。调整插图会导致部分标题滑到状态栏下方。使用包含静态 UIView(用于节标题)和 UITableViewUIViewController 会导致同样的问题。

这个问题的合适解决方案是什么?

示例

状态栏的背景是灰色的,节标题的背景是红色的,以更好地突出导航栏和节标题之间的差距。随着表格慢慢向下滚动,从缝隙中窥视的黄色表格单元格变得明显。隐藏导航栏后,部分标题按预期在状态栏上重置。

用于上述动画的视图控制器:

class TableViewController: UITableViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        // Color status bar background.
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) 
            statusBar.backgroundColor = .lightGray
        
        UIApplication.shared.statusBarStyle = .default
    

    override func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 20
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        return tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
    

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
        let view = UIView()
        view.backgroundColor = .red
        return view
    

更新 1

从状态栏中删除背景颜色并不能解决我看到的问题。下面的 GIF 显示了状态栏处于原始透明状态时的行为。

TLYShyNavBar 有一个我想要实现的行为的 GIF(在下面添加)。这个项目没有维护,如果没有额外的操作就无法工作,但是有一个很好的例子来说明我期望的行为是什么样的。

更新 2

我知道这种行为不是错误/问题,而是 Apple 更喜欢它。为视图的背景着色是一个选项(参见下面的answer)。对于这种情况,有两种方法可以解决:

    为背景着色以匹配导航栏并移除导航栏的阴影以使视图无缝。

    self.navigationController?.navigationBar.shadowImage = UIImage() self.navigationController?.navigationBar.isTranslucent = false

    为背景着色以匹配红色条。

不幸的是,这种方法掩盖了间隙而不是消除它。它使其中一个条在动画期间出现变形,直到它们在两种情况下都完成过渡。

【问题讨论】:

@matt 删除状态栏的背景颜色并不能解决问题。我在更新中为我的问题添加了更多详细信息。 【参考方案1】:

问题是当有状态栏时,表格视图在全屏时不能很好地工作,因为单元格出现在状态栏后面,但部分标题却没有。所以不要那样做。

要使用表格视图控制器在没有导航栏但显示状态栏的情况下工作,请将表格视图控制器配置为嵌入式(自定义子)视图控制器,以便您负责表格视图的位置。将表格视图顶部固定到安全区域顶部。

这给出了你所追求的配置:

状态栏一目了然,后面可见父视图控制器的视图。表格视图本身,连同其部分标题和单元格,停在状态栏的底部;单元格不会出现在状态栏后面。因此,我们不会在您的插图中看到不匹配的情况。

这是一个 gif,显示结果是连贯的:

我为导航栏和主视图设置了不同的颜色,以便您可以区分它们,但想象它们是完全相同的颜色 - 那么这将是完全一致的。

【讨论】:

但是,请注意,在您展示的 TLYShyNavBar 截屏视频中,我不相信上面的内容是节标题;也许它是另一个视图,在表格视图之上。 我确实认为这可能是某人的解决方案,但并不是我所希望的,因为它会倾斜导航栏或栏下的视图。是的,ShyNavBar 库使用UIView,这是我可以接受的替代方案。 我在实现它以使导航栏在隐藏后返回时遇到了麻烦,但只有当表格视图绑定到安全区域而不是超级视图时。这个问题似乎已经被问过here 和here。 您要删除您的问题吗?我没关系。

以上是关于隐藏导航栏会导致其下方和上方的空间的主要内容,如果未能解决你的问题,请参考以下文章

隐藏导航栏将视图“向上”移动

如何在导航栏中舍入当前选项卡上方和下方的选项卡,除了当前选项卡之外,还隐藏导航栏

iOS侧滑返回到隐藏导航栏的VC,导航栏会闪现一次

屏幕键盘出现时iOS隐藏导航栏

响应式导航栏隐藏其下方的元素

Safari 导航栏