踩坑小結

一. tableview的頂部有位移偏差

這裡寫圖片描述

我們知道cell是layout在UITableView的subview :UITableViewWrapperView上的,通過view Hierarchy可以看到有錯位的實際上是UITableViewWrapperView。

automaticallyAdjustsScrollViewInsets,當設定為YES時(預設YES),如果檢視裡面存在唯一一個UIScrollView或其子類View,那麼它會自動設定相應的內邊距,這樣可以讓scroll佔據整個檢視,又不會讓導航欄遮蓋。

當controller上的第一個子檢視不是scrollview以及其子類的時候,就會取消內邊距。此時原本全屏的scrollview設定的frame(0,0,self.view.frame.size.width,xx)就會從狀態列開始算起,如果應用有導航欄的話,那麼就會遮蓋住檢視的64個高度

解決方案:
1.

self.automaticallyAdjustsScrollViewInsets = NO;
//禁用掉自動設定的內邊距,自行控制controller上index為0的控制元件以及scrollview控制元件的位置

2.

self.edgesForExtendedLayout = UIRectEdgeNone;
//這種方式設定,不需要再重新設定index為0的控制元件的位置以及scrollview的位置,(0,0)預設的依然是從導航欄下面開始算起

參考資料

補充:
當升級到iOS 11的時候,發現UIScrollView 又出現莫名其妙的偏移了 可是明明設定了

automaticallyAdjustsScrollViewInsets

這是因為iOS 11為UIScrollView 新增了新的屬性contentInsetAdjustmentBehavior 這是一個列舉

找到UIScrollViewContentInsetAdjustmentNever 從來不自動調整和automaticallyAdjustsScrollViewInsets = NO 是一個功效 這樣就解決了iOS 11這個bug

        if (@available(iOS 11.0, *)) {
Scrollview.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
// Fallback on earlier versions
}

二. 真機編譯報錯:dyld: Library not loaded: @rpath/xxx.framework/…

同事在升級Xcode9之後,從git上pull最新專案程式碼,模擬器編譯執行正常,跑真機(iPhoneSE和iPhone7P)報錯如下

dyld: Library not loaded: @rpath/JSONModel.framework/JSONModel
Referenced from: /Users/Savita/Library/Developer/CoreSimulator/Devices/3E53CBD1-C475-465C-ADE5-84C2248E134F/data/Containers/Bundle/Application/E8A12E93-1820-401B-B687-87D8F752F812/ProjectName.app/Frameworks/CitrusPay.framework/CitrusPay Reason: image not found

嘗試:
pods update更新JSONModel,
Link Binary With Libraries重新新增framework,
Target->General->Embedded Binaries新增framework,
重新配置證書和描述檔案,
重啟Xcode,真機,mac
依然報錯。
最後通過刪除/Users/使用者名稱/Library/Developer/Xcode/DerivedData 路徑下的專案快取檔案,重啟xcode。
問題得以解決。
具體原因不是很清楚,應該跟Xcode版本升級,舊專案快取有關。