寫在前面
在ios11中,navigationbar的 leftItem 都會多出來一個奇怪的白邊,這個白邊很不容易修改,從前的設置方法失效了
之前看到有篇文章是修改layoutMargins的方案來做的 連接
這個方案設置雖然簡單,但是有一個問題,就是當你push,pop以后,位置就變了,也就是說,layoutMargins就失效了,而且需要遍歷,采用ContentView的字符串
另外有一個方案是采用自定義NavigationBar的方案來做的 連接
也算是簡單暴力
我這里采用另一個方案來做,而且比較簡單,也就是自定義view的方案的來做
思路
UIBarButtonItem.init(customView: view)這種方式如果直接將Button放進去,那么你設置的frame的位置是無效的
那么我這里采用另一個取巧的方案去做
眾所周知,ios中的控件擺放是可以超出父控件距離的,也就是說,我使用一個UIView包裹真正用于顯示的View,然后將子View的x設置偏移也就可以解決了
實現(xiàn)
import UIKit
extension UIViewController{
func setNavigatorLeftItem(customView:UIView) {
var view:UIView
if #available(iOS 11, *){
let padding:CGFloat = 20
let frame = customView.frame
view = UIView(frame: CGRect(x: 0, y: 0, width: frame.width + padding, height: frame.height))
customView.frame = customView.frame.offsetBy(dx: -padding, dy: 0)
view.addSubview(customView)
}else{
view = customView
}
let item = UIBarButtonItem.init(customView: view)
self.navigationItem.leftBarButtonItem = item
}
}
沒錯,代碼就這么簡單,沒有別的代碼
當然也可以extension NavigationItem或者NavigationBar,這個看自己的需求或者習慣了
調(diào)用
import UIKit
class CommonViewController : UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
let button = ImageButton.init(type: .custom)
button.rectPerfect = 0.8
button.image = ImageConst.Image.main_user_center.toUIImage()
let (_,height) = self.getNavigatorBarSize().getWidthAndSize()
let w = height / 102 * 120
let h = height
button.frame = CGRect(x: 5 ,y: 0,width: w,height: h)
self.setNavigatorLeftItem(customView: button) //調(diào)用extension的代碼
}
}
截圖

屏幕快照 2018-03-09 下午5.47.55.png
說明
這里比較懶,只定義了左邊的item,右部的item同理,只是使用rightItem就可以了,padding 變成+ 而不是 - 就可以了
還可以抽象一個enum定義left right,然后根據(jù)left right 定義padding的正負,畢竟具體的實現(xiàn)都好說