ios15在隐藏导航栏时向后半滑动会留下顶部空白空间 - SwiftUI

Posted

技术标签:

【中文标题】ios15在隐藏导航栏时向后半滑动会留下顶部空白空间 - SwiftUI【英文标题】:ios15 half-swiping back while hiding the navigation bar leaves a top empty space - SwiftUI 【发布时间】:2021-12-16 10:01:21 【问题描述】:

我正在做一个有自定义导航栏的项目,这意味着我需要自己管理后退按钮和滑动后退手势。过去我没有遇到任何问题,但是现在当我尝试向后滑动并停止在手势中间(半滑动)时,屏幕显示顶部空白,好像导航栏显示没有标题(如果按下自定义后退按钮或手势完成,即完全滑动,则不会出现此问题。

出现空白后尝试向后滑动时也会显示错误:changing items while animating can result in a corrupted navigation bar

奇怪的是,问题只发生在 NavigationView 的第三个屏幕上。

我附上了一个展示问题的视频,显示半滑动 SecondView 不会产生任何顶部空间,但半滑动 ThirdView 会。

代码如下:

import SwiftUI

// https://***.com/questions/59921239/hide-navigation-bar-without-losing-swipe-back-gesture-in-swiftui
extension UINavigationController 
    override open func viewDidLoad() 
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = nil
    


struct ContentView: View 

    init() 
        print("ContentView")
    
    
    var body: some View 
        NavigationView 
            NavigationLink(destination: SecondView()) 
                Text("Go to second view")
            
            .navigationBarTitle("")
            .navigationBarHidden(true)
            .navigationBarBackButtonHidden(true)
        
    


struct SecondView: View 
    
    init() 
        print("SecondView")
    
    
    var body: some View 
        VStack 
            Text("Second view")

            VStack 
                NavigationLink(destination: ThirdView()) 
                    Text("Go to third view")
                
            
            .padding(.horizontal, 20)
            .padding(.top, 20)
            Spacer()
        
        .navigationBarTitle("")
        .navigationBarHidden(true)
        .navigationBarBackButtonHidden(true)
    


struct ThirdView: View 
    
    init() 
        print("ThirdView")
    
    
    var body: some View 
        VStack 
            Text("Third view")
            
            Spacer()
        
        .navigationBarTitle("")
        .navigationBarHidden(true)
        .navigationBarBackButtonHidden(true)
    

编辑:这只能在使用 iOS 15 时重现,在 iOS 14.5 中一切正常

【问题讨论】:

.navigationBarTitle 已弃用,请尝试将其替换为 .navigationTitle @eXCore 感谢您提供的信息,我将替换它:) 不过,它并没有解决问题。 【参考方案1】:

这是一些奇怪的骇客,但我能够通过在 NavigationView 上使用 .navigationViewStyle(.stack) 来“修复”它。

如果你有兴趣,顺便说一句,空白是导航栏和大导航标题。调试这类东西的一个有用的东西是“调试视图层次结构”按钮。

这绝对是一个 hack,但你还是可以尝试向 Apple 提交错误报告。

【讨论】:

以上是关于ios15在隐藏导航栏时向后半滑动会留下顶部空白空间 - SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

如何限制从顶部定位我的标签,但在隐藏导航栏时不让它移动(因为它会调整视图高度)?

隐藏状态栏时,我的导航栏在 iOS7 中向上移动

隐藏 uitoolbar 在顶部留下空隙

隐藏导航栏时如何启用滑动手势?

隐藏导航栏时隐藏状态栏 - SWIFT iOS8

在传递数据时向后滑动以关闭子 VC