在 SwiftUI 中滑动列表时隐藏导航栏

Posted

技术标签:

【中文标题】在 SwiftUI 中滑动列表时隐藏导航栏【英文标题】:Hide navigation bar on swipe of a list in SwiftUI 【发布时间】:2020-04-20 14:13:09 【问题描述】:

如何在 SwiftUI 中向上滑动时隐藏导航栏并在向下滑动时显示(例如在 facebook 上)?在 UKit 中有 navigationBar.hideBarsOnSwipe,但我似乎在 SwiftUI 中找不到这样的功能。我是否遗漏了什么,或者 swiftUI 中的滑动确实没有隐藏?

提前致谢!!

【问题讨论】:

SwiftUI 那时还很年轻,很多功能还不支持。我在Apple's documentation 中找不到与此相关的任何内容。也许与 UIKit 集成将是一个可以接受的选择。 【参考方案1】:

到目前为止,SwiftUI 中没有原生 API(1.0 和 2.0)。所以这是一个可能的工作解决方案,基于this answer中提供的NavigationConfigurator

使用 Xcode 12 / ios 14 测试

struct TestHideOnSwipe: View 

    var body: some View 
        NavigationView 
            List(0..<100)  i in
                Text("Item \(i)")
            
            .background(NavigationConfigurator  navigationConfigurator in
                navigationConfigurator.hidesBarsOnSwipe = true     // << here !!
            )
            .navigationBarTitle(Text("Demo"), displayMode: .inline)
        
    

【讨论】:

有用的扩展:extension View func navigationBarsHideOnSwipe(_ hidesBarsOnSwipe: Bool) -&gt; some View self.background(NavigationConfigurator $0.hidesBarsOnSwipe = hidesBarsOnSwipe ) 它确实隐藏了它,但不再显示它:(【参考方案2】:

您可以在导航控制器的属性检查器中获取此属性。

  func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) 

if(velocity.y>0) 
    //Code will work without the animation block.I am using animation block incase if you want to set any delay to it.
    UIView.animate(withDuration: 2.5, delay: 0, options: UIViewAnimationOptions(), animations:  
        self.navigationController?.setNavigationBarHidden(true, animated: true) 
        self.navigationController?.setToolbarHidden(true, animated: true)
        print("Hide")
    , completion: nil)

 else 
    UIView.animate(withDuration: 2.5, delay: 0, options: UIViewAnimationOptions(), animations:  
        self.navigationController?.setNavigationBarHidden(false, animated: true)
        self.navigationController?.setToolbarHidden(false, animated: true)
        print("Unhide")
    , completion: nil)    
  

如果您想以编程方式进行。 注意:如果您将任何数据从这个 VC 传递到另一个嵌入了 navigationController 的 VC。您可能需要取消隐藏 NavigationBar。

【讨论】:

嘿!感谢您的回答!但是我问如何在 SwiftUI 中做到这一点,而不是使用 UIKit :/

以上是关于在 SwiftUI 中滑动列表时隐藏导航栏的主要内容,如果未能解决你的问题,请参考以下文章

向后滑动失败时,SwiftUI 导航栏项目变得混乱

如何在 Xamarin Forms 中滚动时折叠(隐藏或向上滑动)导航栏(标题栏)?

在 Flutter 中的 Scroll 上隐藏底部导航栏

微信h5滑动隐藏底部导航栏

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

如何在 SwiftUI 的标签栏的特定视图中隐藏导航栏?