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

? ? }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。