iPhone X的適配工作
1喇澡、閃屏(啟動頁)適配
目前Xcode9.0已結(jié)可以更新了迅栅,更新了Xcode的朋友在iPhone X的模擬器下運行APP,發(fā)現(xiàn)屏幕未充滿 ps:啟動頁使用LaunchImage的情況
晴玖,這種情況大家也基本都知道读存,這是缺少啟動圖的原因。
解決辦法:
LaunchImage 中添加一個和 iPhone X 相關(guān)的啟動圖片
圖片尺寸:1125 * 2436
Contents.json 中代碼如下
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "2436h",
"filename" : "1125_2436.png",
"minimum-system-version" : "11.0",
"orientation" : "portrait",
"scale" : "3x"
}
2呕屎、安全區(qū)域問題Safe Area
iPhone X 取消了 Home鍵让簿,實現(xiàn)了高屏占比,所以默認 View 的區(qū)域是全屏幕
屏幕四周有圓角秀睛、頂部有“劉憾保”、底部有手勢區(qū)域
所以頂部導(dǎo)航欄就變?yōu)榱?4+44=88(iPhone X之前的都為20+44=64)
解決方法:
//導(dǎo)航欄高度
let NavigationBarHeight = statusBarHeight + CGFloat(44.0)
//時間欄的高度
let statusBarHeight = iPhoneX ? CGFloat(34) : CGFloat(20)
ps:關(guān)于iPhone X的底部適配琅催,目前還沒找到好的適配方式居凶,因為使用的第三方的自動布局庫,現(xiàn)在還沒有更好的方式藤抡,所以暫時擱置了侠碧,持續(xù)更新中。缠黍。弄兜。
iOS 11的適配工作
1、UITableview UICollectionView MJRefresh下拉刷新錯亂
如果有一些文本位于UI滾動視圖的內(nèi)部,并包含在導(dǎo)航控制器中替饿,現(xiàn)在一般navigationContollers會傳入一個contentInset給其最頂層的viewController的scrollView语泽,在iOS11中進行了一個很大的改變,不再通過scrollView的contentInset屬性了视卢,而是新增了一個屬性:adjustedContentInset踱卵。
contentInsetAdjustmentBehavior屬性有以下幾個枚舉值
typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
UIScrollViewContentInsetAdjustmentAutomatic,
UIScrollViewContentInsetAdjustmentScrollableAxes,
UIScrollViewContentInsetAdjustmentNever,
UIScrollViewContentInsetAdjustmentAlways,
}
@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior;
@property(nonatomic, readonly) UIEdgeInsets adjustedContentInset;
//adjustedContentInset值被改變的delegate
- (void)adjustedContentInsetDidChange;
- (void)scrollViewDidChangeAdjustedContentInset:(UIScrollView *)scrollView;
1据过、 automatic 和scrollableAxes一樣,scrollView會自動計算和適應(yīng)頂部和底部的內(nèi)邊距并且在scrollView 不可滾動時,也會設(shè)置內(nèi)邊距.
2惋砂、 scrollableAxes 自動計算內(nèi)邊距.
3、 never不計算內(nèi)邊距
4绳锅、 always 根據(jù)safeAreaInsets 計算內(nèi)邊距
在我們項目中寫tableview的時候可以加下面的代碼來解決此問題
解決辦法:如果還想保持和之前版本一樣的布局效果西饵,則設(shè)置:
if (@available(iOS 11.0, *)) {
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
_scrollview.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
2、定位相關(guān)
問題描述:無法定位鳞芙,而且程序在安裝后第一次訪問定位權(quán)限時眷柔,無定位權(quán)限提示對話框彈出。
原因:iOS11 定位相關(guān)的權(quán)限做了更改原朝,在iOS11上使用了新的定位權(quán)限key驯嘱。
解決方案:
如果原來申請的權(quán)限是始終允許NSLocationAlwaysUsageDescription,那么需要在保留原來的key的基礎(chǔ)上增加NSLocationWhenInUseUsageDescription和NSLocationAlwaysAndWhenInUsageDescription竿拆。
3宙拉、系統(tǒng)相冊相關(guān)
問題描述:iOS11上讀寫相冊的照片時發(fā)生崩潰。
原因:由于相冊相關(guān)權(quán)限的key發(fā)生了變化丙笋。用戶在沒有權(quán)限的情況下谢澈,訪問相冊導(dǎo)致崩潰。
解決方案:
iOS11之前相冊對應(yīng)的key是NSPhotoLibraryUsageDescription御板,iOS11對應(yīng)的Key是NSPhotoLibraryAddUsageDescription锥忿。同定位的Key一樣,由于key沒有兼容性怠肋,所以需要保留原key以兼容iOS10及之前版本敬鬓。
4、第三方庫WKWebViewJavascriptBridge
問題描述:在WKWebView的回調(diào)函數(shù)中崩潰:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
原因:WKWebViewJavascriptBridge內(nèi)部邏輯問題
解決方案:WKWebViewJavascriptBridge最新的6.0.2上仍然沒有解決這個問題笙各,可以參考github issue#272
只能手動修改源文件钉答,將WKWebViewJavascriptBridge.m 的L153的if改為 else if
更改前后的圖片:
5、滑動刪除會蹦杈抢?(轉(zhuǎn)数尿,目前還沒試驗,mark下)
在iOS8之后,蘋果官方增加了UITableVIew的右滑操作接口惶楼,即新增了一個代理方法(tableView: editActionsForRowAtIndexPath:)和一個類(UITableViewRowAction)右蹦,代理方法返回的是一個數(shù)組诊杆,我們可以在這個代理方法中定義所需要的操作按鈕(刪除、置頂?shù)?何陆,這些按鈕的類就是UITableViewRowAction晨汹。這個類只能定義按鈕的顯示文字、背景色贷盲、和按鈕事件淘这。并且返回數(shù)組的第一個元素在UITableViewCell的最右側(cè)顯示,最后一個元素在最左側(cè)顯示巩剖。從iOS 11開始有了一些改變慨灭,首先是可以給這些按鈕添加圖片了,然后是如果實現(xiàn)了以下兩個iOS 11新增的代理方法球及,將會取代(tableView: editActionsForRowAtIndexPath:)代理方法:
// Swipe actions
// These methods supersede -editActionsForRowAtIndexPath: if implemented
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath
這兩個代理方法返回的是UISwipeActionsConfiguration類型的對象,創(chuàng)建該對象及賦值可看下面的代碼片段:
- ( UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {
//刪除
UIContextualAction *deleteRowAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:@"delete" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
[self.titleArr removeObjectAtIndex:indexPath.row];
completionHandler (YES);
}];
deleteRowAction.image = [UIImage imageNamed:@"icon_del"];
deleteRowAction.backgroundColor = [UIColor blueColor];
UISwipeActionsConfiguration *config = [UISwipeActionsConfiguration configurationWithActions:@[deleteRowAction]];
return config;
}
創(chuàng)建UIContextualAction對象時呻疹,UIContextualActionStyle有兩種類型吃引,如果是置頂、已讀等按鈕就使用UIContextualActionStyleNormal類型刽锤,delete操作按鈕可使用UIContextualActionStyleDestructive類型镊尺,當使用該類型時,如果是右滑操作并思,一直向右滑動某個cell庐氮,會直接執(zhí)行刪除操作,不用再點擊刪除按鈕宋彼,這也是一個好玩的更新弄砍。
滑動操作這里還有一個需要注意的是,當cell高度較小時输涕,會只顯示image音婶,不顯示title,當cell高度夠大時莱坎,會同時顯示image和title衣式。我寫demo測試的時候,因為每個cell的高度都較小檐什,所以只顯示image碴卧,然后我增加cell的高度后,就可以同時顯示image和title了乃正。
swift4.0的適配工作
1住册、指定swift4.0的版本
2、pods的第三方庫的適配
目前pods的framework只能指定一個版本的swift烫葬。issue在這里:Pods automatically compiling with Swift 4.0 in Xcode 9 beta 1 界弧。pod默認會使用一個swift版本編譯全部凡蜻,然而并不是你所導(dǎo)入的第三方庫都已經(jīng)支持swift4,這就導(dǎo)致了一個問題就是垢箕,要么你的第三方庫都升級為swift4.0划栓,要么有一個還不支持swift4就要統(tǒng)一使用swift3.2的版本。這是一個選擇題条获,由于目前swift4.0剛出沒多久忠荞,而且所有的第三方庫都支持4.0也不太現(xiàn)實,所以這方面的適配工作就擱置了帅掘。
3委煤、swift4.0語法適配
Swift4.0中對于擴展的屬性(包括實例屬性、static屬性修档、class屬性)碧绞,都只能使用get方法,不可使用set方法
Swift4.0中不再允許復(fù)寫擴展中的方法(包括實例方法吱窝、static方法讥邻、class方法)
swift3使用#selector指定的方法,只有當方法權(quán)限為private時需要加@objc修飾符院峡,現(xiàn)在全都要加@objc修飾符(這是最坑的P耸埂!U占ぁ)
字體方面的一些重命名:
(NSFontAttributeName重命名為NSAttributedStringKey.font发魄、NSForegroundColorAttributeName重命名為NSAttributedStringKey.foregroundColor、NSStrikethroughStyleAttributeName重命名為NSAttributedStringKey.strikethroughStyle俩垃、size(withAttributes:)方法重命名為size(withAttributes:))
ps:針對#selector指定的方法都要添加@objc修飾符問題励幼,這才是最坑的!?诹赏淌!至于原因,這里有一篇文章說明 如何解決#selector的參數(shù)是指不暴露給Objective-C的實例方法啄清,大家可以看看六水,我就不在這類羅列了,因為pods問題和#selector問題辣卒,使我暫時沒有去適配swift4.0掷贾,還保持swift3.2版本開發(fā),在觀望觀望吧荣茫。想帅。。