navigationItem问题记录

用来设置指定控制器导航条的样式

       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];

你可能感兴趣的:(navigationItem问题记录)