NavBar添加自定view 遇到的坑

测试页面

最初开始是遇到的坑是在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

    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。