用来设置指定控制器导航条的样式
self.navigationItem.standardAppearance = naBarAppearance;
self.navigationItem.scrollEdgeAppearance = naBarAppearance;
self.navigationItem.compactAppearance = naBarAppearance
if #available(iOS 15.0, *) {
self.navigationItem.compactScrollEdgeAppearance = naBarAppearance
}
iOS13.7模拟器,xcode14.2测试下
问题1、viewWillAppear中设置不生效
解决:在viewDidLoad中设置
问题2、返回按钮图片设置后,pop之后会影响到其它控制器的backIndicatorImage,即使其它控制器重新设置backIndicatorImage也不会改变至于什么原因,暂且不知道。例如:下面的代码
let naBarAppearance = self.navigationItem.standardAppearance;
naBarAppearance?.backgroundColor = nil;
naBarAppearance?.shadowColor = .clear
naBarAppearance?.setBackIndicatorImage(UIImage(named: "nav_back")!.withRenderingMode(.alwaysOriginal), transitionMaskImage: UIImage(named: "nav_back")!.withRenderingMode(.alwaysOriginal))
self.navigationItem.standardAppearance = naBarAppearance;
self.navigationItem.scrollEdgeAppearance = naBarAppearance;
解决:理论上不应该出现这样的问题,也许是ios13的系统bug
实践发现viewWillDisappear中将navigationItem的standardAppearance 重置为nil就可以了,iOS14,ios16没有这样莫名的问题
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.navigationBar.isTranslucent = false
self.navigationItem.standardAppearance = nil
self.navigationItem.scrollEdgeAppearance = nil
}
以上两个问题也许是iOS13.7系统的bug,但安全起见为了设置都没问题,可以按照以下来。
override func viewDidLoad() {
super.viewDidLoad()
let naBarAppearance = UINavigationBarAppearance()
naBarAppearance.shadowColor = .clear
naBarAppearance.shadowImage = nil;
naBarAppearance.backgroundColor = nil;
//[UIColor clearColor];
naBarAppearance.backgroundImage = nil;
//naBarAppearance.titleTextAttributes = dic;
naBarAppearance.backgroundEffect = nil;
let buttonItemAppearance = UIBarButtonItemAppearance()
buttonItemAppearance.normal.titleTextAttributes = [.foregroundColor : UIColor.purple]
let image = UIImage(named: "back_white")
let newimage = image?.withRenderingMode(.alwaysOriginal)
naBarAppearance.setBackIndicatorImage(newimage, transitionMaskImage: newimage)
naBarAppearance.titlePositionAdjustment = UIOffset(horizontal: 30, vertical: 0)
naBarAppearance.backButtonAppearance = buttonItemAppearance
self.navigationController?.navigationBar.isTranslucent = true
self.navigationItem.standardAppearance = naBarAppearance;
self.navigationItem.scrollEdgeAppearance = naBarAppearance;
self.navigationItem.compactAppearance = naBarAppearance
if #available(iOS 15.0, *) {
self.navigationItem.compactScrollEdgeAppearance = naBarAppearance
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationItem.standardAppearance = nil
self.navigationItem.scrollEdgeAppearance = nil
}
三、返回按钮的最小大小是44*44pt(iOS13-iOS16都这样,是系统行为)
系统返回按钮一般是返回箭头+标题,ios11之后一般情况下大小是自适应的,
当你设置titleView时,宽度设置的可能比较大,这样返回按钮大小被挤压的只有4444,这时可能图片+标题的大小超过44,就会造成标题宽度变得很小,被hidden,看不见了。这时当你从此控制器pop出去,之后所有的返回按钮都是4444,返回文字被隐藏成了全局的行为。
四、延时设置导航栏的标题,不显示
在项目中,可能你的标题需要通过网络请求才能确定,这时你直接设置 self.navigationItem.title =titleStr;也许你会大失所望,这时不要着急,给.navigationBar标记(setNeedsLayout)下
self.navigationItem.title =titleStr;
[self.navigationController.navigationBar setNeedsLayout];
网友评论