NavBar添加自定view 遇到的坑

NavBar添加自定view 遇到的坑_第1张图片
测试页面

最初开始是遇到的坑是在iOS9真机Crash,这个tips加在navbar上并且使用autolayout,导致在ios9上removeFromSuperview时直接crash,9以上版本没有问题,猜测是做了某种保护,查文档后才知道navbar天生就不支持用autolayout,解决方案有三种

1、不使用autolayout利用api坐标系转换算出控件originX,originY。

 2、加在window上,前提条件不支持右滑返回,还有下拉刷新的时候导航栏不随之滚动。

3、使用autolayout,removeFromSuperview之前调用removeConstrains。


计算frame方案:主要是利用 override func viewDidAppear(_animated:Bool) 这个方法计算出城导航栏在子控件相对坐标,从而设置控件frame。

贴一下关键代码,通用方法,适用navBar多个ButtonItem,如果就一个写死frame就好,也不用把初始化方法放在 override func viewDidAppear(_animated:Bool) 这个方法中去了

    private func setupTipsView() {

        guard let navBarItemView = navigationItem.rightBarButtonItem?.customView else {

            return

        }

        let alertText ="测试字段"

        let viewWidth =ceil(alertText.boundingRect(with:CGSize(width:CGFloat(MAXFLOAT), height:30), options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font:UIFont.we_numFont(11)], context:nil).size.width) +30

        let superView = navigationController.view

        let transferFrame = navBarItemView.convert(navBarItemView.bounds, to: superView) //利用坐标系转换得出子控件相对坐标

        let xOrigin:CGFloat= transferFrame.maxX- viewWidth //获取控件X轴坐标

        let yOrigin:CGFloat= transferFrame.origin.y- (UIDevice.current.we_iPhoneX() ?20:-3)

        rightTipsView.frame=CGRect(x: xOrigin, y: yOrigin, width: viewWidth, height:30)

        navigator.navigationBar.addSubview(rightTipsView)

        rightTipsView.alertLabel.text = alertText

    }

你可能感兴趣的:(NavBar添加自定view 遇到的坑)