最近公司項目在開發商城階段,用的h5,所以原生開發人員就有了大把的時間,我想趁著這段時間,整理點前段時間的開發用到的東西。
關于iOS11
1.導航欄的高度
在iOS11導航欄多了一個LargeTitileView,專門顯示大字標題用的,整個導航欄的高度達到了96p,這不包括狀態欄的高度,也就是說,整個app頂部達到了116p,其中statusbar:20,title=44,largetitle=52,不過默認是64p;然后,iPhoneX的高度會更高,如果不顯示大標題,頂部的高度也達到了88,statusbar:44,title:44,如果顯示大字標題,還要再加largetitle:52,總高度達到了140。也就是說,iPhoneX的厲害高度為24P。如下圖:
2.導航欄邊距的變化
在我們項目中,剛開始產品是把右導航欄的barButton跟下面的某一個控件對齊的,后來升級了iOS11之后就怎么也不對齊了,后來發現是,邊距變了,具體變化如下:
(1)如果只是設置了titleView,沒有設置barbutton,把titleview的寬度設置為屏幕寬度,則titleview距離屏幕的邊距,iOS11之前,在iPhone6p上是20p,在iPhone6p之前是16p;iOS11之后,在iPhone6p上是12p,在iPhone6p之前是8p。
(2)如果只是設置了barbutton,沒有設置titleview,則在iOS11里,barButton距離屏幕的邊距是20p和16p;在iOS11之前,barButton距離屏幕的邊距也是20p和16p。
(3)如果同時設置了titleView和barButton,則在iOS11之前,titleview和barbutton之間的間距是6p,在iOS11上titleview和barbutton之間無間距,如下圖:
3.App如何實現導航欄左右按鈕邊距為0
在iOS11之前,可以設置一個width為負的navigationBarButton,將按鈕擠到邊緣,變相實現了0邊距的導航欄按鈕,但是,這種方法在iOS11中失效了,原因在于_UIButtonBarStackView,這個在iOS9之后出來的,用來相對布局的組件,限制了子view的布局,那怎么做呢?方法如下:
(1) 在viewWillAppera里面,把_UIButtonBarStackView取出來,設置他的x坐標。
(2)設置titleView,然后將button添加在titleview上面,根據不同的邊距做偏移。
在方法(1)中,遇到了問題,在viewDidLoad,viewWillAppera,viewWillLayoutSubviews,viewDidLayoutSubviews里面都取不到_UIButtonBarStackView,只有在viewDidAppear里才能取到值,這樣就會在頁面顯示之后才開始移動navigationBarButton,顯然這樣不太好,暫時pass。
在方法(2)中,點擊區域的問題,因為左右navigationBarButton的點擊區域是超出父view的,所以,點擊不到。那么,我們需要重寫一下titleview的hitTest方法就好。so???但是了解過iOS11圖層關系的就知道,titleView會被添加在_UITAMICAdaptorView上面,然而重點是,這個view也有邊距,所以,單單重寫titleView的hitTest方法還不夠,那怎么解決呢?我的方法是寫一個view的類別,hook所有view的hitTest方法,在里面判斷是否是iOS11以上,是否是_UITAMICAdaptorView類,如果滿足條件,就可以了。
另外,我最開始做項目的時候,用了一個比較奇怪的方法,直接在navigationBar上在左右各添加一個button,位置可以自己調整到邊距為0。這樣寫的問題是,這個button會永遠存在于導航欄上,所以我就在viewWillDisappear方法里將這個button隱藏,在viewWillAppear方法里面,將這個button取消隱藏,這個也能解決。(沒有經過各個版本手機的測試,僅僅拱參考)
4.一些坑
a.automaticallyAdjustsScrollViewInsets?
在iOS11之前,如果想要scrollView不偏移64,則需要設置automaticallyAdjustsScrollViewInsets=NO,但是這個屬性在iOS11直接被放棄了
b.tableview默認使用self-sizing
這個配合estimatedRowHeight、estimatedSectionFooterHeight、estimatedSectionFooterHeight使用,可以預估高度。之前,設置header或者footer高度為0,需要設置height=0.1,才會起作用,如果直接設置0,則會使用默認高度。iOS11由于自動使用預估高度,所以,忽略了設置的高度,使原來的高度增大了。只要把這幾個屬性設置為0就可以解決了。
c.iPhoneX底部tabbar的高度改變
iPhoneX不止多了劉海,底部還多了一個半圓角的矩形,使得tabbar多出了34p的高度,不過不管導航欄和tabbar一般系統會自動適配safeArea。
暫時目前遇到了這么多坑,后面遇到的話,會繼續補充。