iOS 11 發(fā)布以來,因為一直在忙其他的事情(總之是跟代碼無關(guān)的事情)這周終于空閑下來研究一下鼠证。
發(fā)現(xiàn)問題一
打開之前的一個項目峡竣,首頁就發(fā)現(xiàn)一個問題,導(dǎo)航條隱藏整個頁面上只有一個UITableView量九,然后出線了下面的一幕:
頁面并沒有直接頂?shù)巾敹耸赎强粘隽藸顟B(tài)欄的空白颂碧。因為界面使用的是 storyboard 查了官方文檔和各種資料發(fā)現(xiàn)可能是iOS11棄用了 automaticallyAdjustsScrollViewInsets 屬性,取而代之的是 UIScrollView 新增了 contentInsetAdjustmentBehavior 屬性类浪,這一切的罪魁禍?zhǔn)锥际切乱氲?safeArea 载城。
然后就是想辦法解決問題
首先想到的是在 storyboard 上把頂部的約束由 0 設(shè)置為 -20,過程中發(fā)現(xiàn) ViewConroller 的 Top Layout Guide 的 Y 變?yōu)?20 了费就,由于粗心之前一直沒有注意過 iOS 11 xcode 9 之前是多少诉瓦。再把約束設(shè)置為 -20 之后頁面顯示沒問題,但是在下拉刷新的時候發(fā)現(xiàn)一個小問題力细,就是下拉箭頭顯示在了頁面上睬澡,并沒有像之前一樣顯示在屏幕之外。到這時并沒有繼續(xù)去修改下拉控件眠蚂,而是感覺這種解決方法并不是最合理的煞聪。
于是繼續(xù)填坑。逝慧。米绕。感覺還應(yīng)該是 contentInset 上面的問題,然后查資料發(fā)現(xiàn)可以這樣設(shè)置
if #available(iOS 11.0, *) {
UIScrollView.appearance().contentInsetAdjustmentBehavior = .never
}
寫在 AppDelegate.swift 里面馋艺,運行模擬器,的確是解決了問題迈套。但是運行期間有一次發(fā)現(xiàn)在沒有隱藏導(dǎo)航條并且界面是 UIScrollView 或者 UITableView 的頁面進(jìn)入 3捐祠、4 級頁面回退的時候當(dāng)前頁面會有一個向上的回彈動畫,但是再次運行的時候發(fā)現(xiàn)有沒有了這樣的問題桑李。所以建議可以把上面的代碼放到隱藏導(dǎo)航條的頁面上踱蛀,把 UIScrollView.appearance() 設(shè)置為頁面的 UIScrollView 或者其子類即可。
發(fā)現(xiàn)問題二
導(dǎo)航上的圖片顯示過大了贵白。問題的原因大致是只要NavigationBar 使用了
initWithCustomView 這個方法,而 CustomView 的控件尺寸小于圖像實際尺寸的話, iOS 11 系統(tǒng)會自動將該控件設(shè)置為圖像的實際尺寸率拒,所以 NavigationBar 上面的圖像就會變形。找到原因就好處理了禁荒。
解決方法
第一種解決方法就是重新切圖猬膨,將圖片按照標(biāo)準(zhǔn)重新切圖,但是對于有的程序員不會的話這個方法就比較坑了呛伴,還得找 UI 設(shè)計的同事重新切圖勃痴。所以還是自己動手比較好。
所以第二種方法就是在原來的控件上添加一個父 View 热康,然后把 view 的背景設(shè)置為透明即可沛申。具體原理暫時還不知道。