NavigationView 顶部的额外空间

Posted

技术标签:

【中文标题】NavigationView 顶部的额外空间【英文标题】:NavigationView Extra Space at Top 【发布时间】:2020-11-13 10:58:16 【问题描述】:

我已将 NavigationBar 添加到我的共享扩展中。添加 NavigationView 后,顶部会出现一个额外的空间(下图)。

其他答案建议删除 NavigationView.. 没有它,导航栏不会显示。

如何在保留 NavigationBar 的同时删除此空间?

class ShareViewController: UIViewController     
    override func viewWillAppear(_ animated: Bool) 
        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.shadowImage = UIImage()
        navigationController?.navigationBar.isTranslucent = true
    
    
    override func viewDidLoad() 
        super.viewDidLoad()
        
        self.view.backgroundColor = .white

        let vc = UIHostingController(rootView: TempView())

        self.addChild(vc)
        self.view.addSubview(vc.view)
        vc.didMove(toParent: self)
        vc.view.translatesAutoresizingMaskIntoConstraints = false
        
        vc.view.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
        vc.view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
        vc.view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
        vc.view.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
        vc.view.heightAnchor.constraint(equalTo: self.view.heightAnchor).isActive = true
        vc.view.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
        vc.view.backgroundColor = UIColor.clear        
    

import SwiftUI

struct TempView : View 
    var body: some View 
        NavigationView 
            VStack 
                Text("Ok")
                Spacer()
            
            .navigationBarTitle("Title", displayMode: .inline)
            .edgesIgnoringSafeArea(.top)
            .navigationBarItems(
              leading:
                Text("Close"),
              trailing:
                Text("Next")
            )
        
    


【问题讨论】:

如果你使用 SwiftUI NavigationView 你不应该通过 UIKit 设置 UINavigationBar,它们不会被合并。相反,要么只使用 NavigationView,要么尝试在显示 NavigationView 之前修改 UINavigationBar.appearance()。 @Asperi 感谢您的快速回复。有趣的是,如果我清除 viewWillAppear 并添加 navigationController?.navigationBar.height = true 那么 SwiftUI NavigationView 栏适当地没有空间。但是,如果我链接到另一个视图,那么很遗憾该栏不会出现。 【参考方案1】:

对不起,我的阅读不匹配,您正在尝试在扩展中使用 swiftui?我会推荐使用 ViewControllers。无论如何尝试删除导航视图

struct TempView : View 

var body: some View 
    // NavigationView 
        VStack 
            Text("Ok")
            Spacer()
        
        .navigationBarTitle("Title", displayMode: .inline)
        .edgesIgnoringSafeArea(.top)
        .navigationBarItems(
          leading:
            Text("Close"),
          trailing:
            Text("Next")
        )
    
// 

【讨论】:

感谢您的评论,如果您取出 NavigationView 栏不显示.. 因为您要添加两个。一个是您在 viewWillAppear 中配置的第一个导航控制器,另一个是导航视图中的导航控制器。我建议您在视图控制器中添加关闭和下一步按钮的功能,请阅读此链接,如果成功,请给我一个有效的答案。 diamantidis.github.io/2020/01/11/share-extension-custom-ui 感谢您的链接,我想尝试弄清楚如何使用 SwiftUI 执行此操作。我注释掉 viewWillAppear 配置一个空格仍然是这样的:imgur.com/a/31xVBem 我不确定我的观点是否正确。您正在向视图中添加 2 个导航控制器,一个是视图控制器上的一个,另一个是导航视图。您只是在 viewWillAppear 中配置它。 再次感谢您澄清和分享该链接。我会标记你的回答,因为它有效。对于其他人,我现在可行的解决方案是隐藏 UIKit 导航栏,然后使用 SwiftUI NavigationView 和默认 NavigationLink(即没有编程选择和 EmptyView() 实现)

以上是关于NavigationView 顶部的额外空间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中删除“表单”的顶部空间?

如何使用 SwiftUI 消除嵌套 NavigationView 中的空间

标签从顶部底部有额外的空间?

UISearchController 的 UITableView 顶部的额外空间

使用 SwiftUI 解锁后状态栏消失

UITableView 在“下拉刷新”期间顶部有额外空间