適配iOS11, Xcode 9遇到的問題

微許時光發表於2018-01-02

1: 計算 UITableView 的 contentSize

今天在 Xcode 9 GM 上,除錯專案中的活動列表時,發現 UITableView 計算的高度不正確.在 Xcode 8.3 上除錯, contentSize 沒有問題.

Xcode 8.3 上列印 tableview 的 contentSize, 如下:

po self.tableView.contentSize

(width = 300, height = 938)
複製程式碼

Xcode 9 GM 上列印 tableview 的 contentSize, 如下:

po self.tableView.contentSize

(width = 300, height = 661)
複製程式碼

蘋果開發者論壇給出的解釋:在 iOS 11 中,預設使用估算的高度,也就意味著 contentSize 是一個估算的高度,並非準確的高度.如果你不想用估算的高度,需要設定三個屬性,如下:

self.tableView.estimatedRowHeight = 0;

self.tableView.estimatedSectionHeaderHeight = 0;

self.tableView.estimatedSectionFooterHeight = 0;
複製程式碼

2:導航控制器(UINavigationController)中的"返回"(BackButton)按鈕座標下沉

在 iOS 11以前的版本,大家通過以下的方法,隱藏"返回"按鈕中的字型內容.

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60) forBarMetrics:UIBarMetricsDefault];
複製程式碼

然後,在 iOS 11中除錯,發現"返回"按鈕的座標下沉了.如下兩幅對比圖: iOS 11以前的版本:

normal.png
iOS 11的版本:
abnormal.png

解決方法:(2017-11-12修改,增加新的解決方案,廢棄以前的解決方案)

if(@available(iOS 11, *)) {
    //2017-11-12 新增 (手勢側滑返回速度很慢時,能夠看到"偏移出螢幕的標題")
    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-200, 0) forBarMetrics:UIBarMetricsDefault];

    //這種解決方案(下面的兩行程式碼),會影響全域性的 BarButtonItem 的 title text color, 比如: leftBarButtonItem, rightBarButtonItem,不推薦使用
    //[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
    //[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateHighlighted];
} else {
    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60) forBarMetrics:UIBarMetricsDefault];
}
複製程式碼

或者統一處理,不區分版本:

//2017-11-12 廢棄下面的解決方案
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateHighlighted];
複製程式碼

3:用Xcode 9向工程中新增資源的問題:

①:如果向工程中拖入其他程式碼檔案(例如: firstView.h, firstView.m),然後再次編輯 .m 檔案的時候,發現程式碼全是白色,並且沒有程式碼提示功能.其他檔案引用還會報錯! 解決方案:

TARGETS => Build Phases => Compile Sources 將新新增的 .m 檔案加入即可.
複製程式碼

②:如果向工程中拖入其他資原始檔(例如:happy.mp3, moreData.plist),載入資源的時候,返回的結果為 nil.

#列子:
po [[NSBundle bundleForClass:[self class]] URLForResource:@"happy.mp3" withExtension:nil];
nil
複製程式碼

解決方案:

TARGETS => Build Phases => Copy Bundle Resources 將新新增的 .mp3 檔案加入即可.
複製程式碼

此篇部落格用於蒐集適配 iOS 11, Xcode 9遇到的問題,歡迎補充和糾錯.(待續)

相關文章