移除导航栏和工具栏的边框

Posted

技术标签:

【中文标题】移除导航栏和工具栏的边框【英文标题】:Remove border for Navigation Bar and Toolbar 【发布时间】:2019-04-14 16:44:45 【问题描述】:

我在删除 UISearchBar、UINavigationBar 和 UIToolBar 的边框阴影时遇到问题。所以,基本上我有一个视图控制器,我在其中嵌入了一个 UISearchController,下面是一个具有 UISegmentedControl 的 UIToolbar。问题是,即使在使用外观()委托单独删除 UINavigationBar、UISearchBar、UIToolbar 的边框阴影后,边框仍然会显示在 UISearchBar 和 UIToolBar 之间。

当我进入下一个屏幕时,我观察到 UINavigationBar 没有边框阴影,因此,可以肯定正在显示的边框不是 UINavigationBar。

我还发现一个奇怪的事情,当我从 UINavigationBar 隐藏 UISearchController 时,UINavigationBar 和 UIToolBar 之间没有边界。当我隐藏 UIToolBar 时,UINavigationBar 之后也没有边框。

extension AppDelegate 

    private func appearanceSetup() 
        UINavigationBar.appearance().barTintColor = .appBlueColor
        UINavigationBar.appearance().shadowImage = UIImage()
        UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
        UITextField.appearance().tintColor = .appBlueColor
        UISearchBar.appearance().setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
        UISearchBar.appearance().barTintColor = .appBlueColor
        UISearchBar.appearance().backgroundImage = UIImage()
        UIToolbar.appearance().setShadowImage(UIImage(), forToolbarPosition: .any)
        UIToolbar.appearance().barTintColor = .appBlueColor
        UIToolbar.appearance().layer.borderWidth = 1
        UIToolbar.appearance().layer.borderColor = UIColor.appBlueColor.cgColor
    

class HomeViewController: UIViewController 
   private let searchController: UISearchController = 
        let searchController = UISearchController(searchResultsController: nil)
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = "Search"
        searchController.searchBar.tintColor = .white
        searchController.searchBar.barTintColor = .appBlueColor
        return searchController
    ()
    override func viewDidLoad() 
        super.viewDidLoad()
        navigationItem.searchController = searchController
    

【问题讨论】:

好问题。提供指向 SMALL 示例应用程序的链接可能会很好,我们可以在其中查看问题/尝试查看 这是我刚刚创建的demo,请克隆看看。 gitlab.com/rjt3662/borderissue 谢谢 【参考方案1】:
self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")

试试这个代码,希望它能解决你的问题

【讨论】:

非常感谢@Habin。不知道导航栏的这种属性。我想知道这个属性是如何被揭示的,因为它们在开发者文档中不可用? 不客气@RajatMishra。你的问题解决了吗?如果解决了,请投票并打勾,以便其他人找到答案。 我的问题解决了,我已经投票了。但它的说法是“声望低于 15 人的投票被记录,但不改变公开显示的帖子分数。” 我的意思是您已经对您的问题进行了投票,但是用户如何知道哪个答案对您的问题是正确的,所以这就是为什么我要告诉您在正确答案中投票并打勾。谢谢。 知道了。谢谢!【参考方案2】:

一旦我遇到了类似的问题,appeareance 并没有解决我的问题。所以我开始定制组件。我为UINavigationBar 做了这个并且它起作用了,虽然我的UINavigationBar 被放入了情节提要中,没有在代码中,但它仍然最有效。试试这个并告诉我:

class CustomNavigationBar: UINavigationBar

    override init(frame: CGRect) 
        super.init(frame: frame)
        setBackgroundImage(UIImage(), for: .default)
        shadowImage = UIImage()
        backgroundColor = <Your UIView.backgoundColor of type: UIColor>
        tintColor = UIColor.white
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        setBackgroundImage(UIImage(), for: .default)
        shadowImage = UIImage()
        backgroundColor = <Your UIView.backgoundColor of type: UIColor>
        tintColor = UIColor.white
    

我不知道您对UISearchController 的处理方法是什么,但我在 searchBar 中也遇到了同样的问题,所以我在代码中添加了 searchBar 并使用了委托。占位符出现两次,因为 ios 的版本,只有一个在 iOS 10 或 iOS 10+ 以下无法正常工作。取决于哪一个会被删除

    override func viewDidLoad() 
        super.viewDidLoad()

        setup()
        installRefresh()
    

    private func setup() 
        let searchBar = UISearchBar()
        searchBar.scopeButtonTitles = [placeholdetText] // The String for the place holder
        searchBar.searchBarStyle = .default
        searchBar.barTintColor = view.backgroundColor 
        searchBar.placeholder = placeholdetText + ".."
        searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
        searchBar.backgroundColor = UIColor.clear
        searchBar.delegate = self

        // Extra UI Setup
   

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
        if searchText.isEmpty
        
            // The filters objects it's what i show after the search, and the 
            // general objects it's all the objects
            filtersObjects = generalObjects
        
        else
        
           //... Al the code tu filter from the searchText 
        
          // Refresh the UI
    

【讨论】:

感谢您回来。我使用 UISearchController 的方法是独立的。我的意思是 UISearchController 下面的 UISegmentedControl 需要显示,无论 UISearchController 是什么。因此,使用 UISearchBar().scopeButtonTitles 不会成功,因为范围按钮仅在 UISearchController 处于活动状态时显示。 好的,感谢您抽出宝贵的时间来写信。我会给你一些关于你的问题的观点。祝你好运【参考方案3】:
override func viewDidLoad() 
        super.viewDidLoad()

        //MARK:- for default navigation bar

        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
        self.navigationItem.backBarButtonItem?.tintColor = UIColor.white

        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:.default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.layoutIfNeeded()

    

【讨论】:

如果您正在回答问题,请尝试对您的回答进行简短描述。参考这里,***.com/help/how-to-answer【参考方案4】:

覆盖 func viewDidLoad() super.viewDidLoad()

    //MARK:- for default navigation bar

    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
    self.navigationItem.backBarButtonItem?.tintColor = UIColor.white

    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.layoutIfNeeded()


【讨论】:

以上是关于移除导航栏和工具栏的边框的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地动画推送带有透明导航栏和工具栏的视图控制器?

iOS 7 UITableView 使用透明的导航栏和工具栏

如何在 IB 中设置导航栏和工具栏背景图像

SFSafariViewController 在导航栏和底部工具栏中是不是始终具有相同的 UI 元素?

使用导航栏和工具栏布局 TableView

在以 Uinavigationcontroller 作为视图的 Popovercontroller 中更改导航栏和工具栏的色调