移除导航栏和工具栏的边框
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 使用透明的导航栏和工具栏
SFSafariViewController 在导航栏和底部工具栏中是不是始终具有相同的 UI 元素?
在以 Uinavigationcontroller 作为视图的 Popovercontroller 中更改导航栏和工具栏的色调