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