美文网首页
NavBar添加自定view 遇到的坑

NavBar添加自定view 遇到的坑

作者: 404ErrorCrash | 来源:发表于2018-12-10 14:56 被阅读23次
    测试页面

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

          本文链接:https://www.haomeiwen.com/subject/xnbrhqtx.html