我可以使用以下代码行成功删除导航栏下方的阴影。
self.navigationController?.navigationBar.shadowImage = UIImage()
但是当我添加搜索控制器时,阴影再次出现。
self.navigationItem.searchController = UISearchController(searchResultsController: nil)
我尝试了以下操作,但导致了意外行为。
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.barTintColor = .white
self.navigationController?.navigationBar.isTranslucent = false
如果连接了搜索控制器,如何删除导航栏下的阴影?
答案 0 :(得分:2)
我也没有找到好的解决方案...
现在我将以这种方式隐藏它:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let imageView = navigationItem.searchController?.searchBar.superview?.subviews.first?.subviews.first as? UIImageView {
imageView.isHidden = true
}
}
答案 1 :(得分:1)
这是我使用的解决方案
创建一个扩展UINavigationController
实例的单独类,将其称为BaseNavigationController
。这是您的课程
如果使用情节提要,请为情节提要中的UINavigationController场景分配BaseNavigationController
UINavigationController.init(rootViewController: someViewControllerInstance)
,然后只需使用BaseNavigationController.init(rootViewController: someViewControllerInstance)
该类的示例如下所示:
open class BaseNavigationController:UINavigationController {
override open func viewDidLoad() {
super.viewDidLoad()
setNavigationBar()
setNavBarBorder(false)
}
func setNavigationBar(color:UIColor?=UIColor.white, tint:UIColor?=UIColor.darkGray){
let appearance = UIBarButtonItem.appearance()
appearance.setBackButtonTitlePositionAdjustment(UIOffset.init(horizontal: 0.0, vertical: 0), for: .default)
self.navigationBar.barTintColor = color!
self.navigationBar.isTranslucent = false
self.navigationBar.tintColor = tint!
self.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: tint! ]
}
func setTitleColor(_ color:UIColor?=UIColor.darkGray){
}
func setNavBarBorder(_ enable:Bool) {
self.navigationBar.setBackgroundImage((enable ? nil : UIImage()), for: UIBarMetrics.default)
self.navigationBar.shadowImage = (enable ? nil : UIImage())
self.navigationBar.setValue(true, forKey: "hidesShadow")
}
}
现在,有趣的部分是,如果您要处理不明确的布局,则可能需要在viewWillLayoutSubviews
中执行此操作,否则请将这段代码放入viewWillAppear
中
的viewController实例。
(self.navigationController as? BaseNavigationController)?. setNavBarBorder(false)
对于某些版本的iOS,有趣的代码位于self.navigationBar.setValue(true, forKey: "hidesShadow")
中。
答案 2 :(得分:0)
答案 3 :(得分:0)
我对此问题的贡献不大。当然,这不是正确的方法,但是它适用于不透明的导航栏。这个想法是在阴影的顶部添加一个视图。
let searchBar = searchController.searchBar
let maskView = UIView(frame: .zero)
maskView.backgroundColor = .white // or any color you want
searchBar.addSubview(maskView)
//We need to use constraint so the mask view follow the search bar animation
maskView.translatesAutoresizingMaskIntoConstraints = false
let views = ["maskView": maskView]
searchBar.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-(0)-[maskView]-(0)-|",
options: NSLayoutConstraint.FormatOptions.alignAllCenterY,
metrics: nil,
views: views))
searchBar.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[maskView(1)]-(-1)-|",
options: NSLayoutConstraint.FormatOptions.alignAllCenterX,
metrics: nil,
views: views))