
最初开始是遇到的坑是在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
}
网友评论