iOS11及Xcode9適配問題匯總

iOS 11增加info.Plist中的字段:
相冊權限:
之前的這個字段:Privacy - Photo Library Usage Description
需要增加這個字段:Privacy - Photo Library Additions Usage Description浸船,內(nèi)容和上面字段保持一致即可。
定位權限:
Privacy - NSLocationAlwaysAndWhenInUseUsageDescription

新特性 安全區(qū)域(Safe Area)

從iOS 7以來权薯,我們在整個操作系統(tǒng)中都有這些毛玻璃效果的bars讼呢,蘋果鼓勵我們通過這些bars繪制內(nèi)容撩鹿,我們是通過viewControlleredgesForExtendedLayout屬性來做這些的。

iOS 7 開始悦屏,在 UIViewController中引入的 topLayoutGuidebottomLayoutGuide 在 iOS 11 中被廢棄了节沦!取而代之的就是safeArea的概念键思,safeArea是描述你的視圖部分不被任何內(nèi)容遮擋的方法。 它提供兩種方式:safeAreaInsetssafeAreaLayoutGuide來提供給你safeArea的參照值甫贯,即 insets或者 layout guide吼鳞。 safeArea區(qū)域如圖所示:

safeArea區(qū)域

如果有一個自定義的viewController,你可能要添加你自己的bars叫搁,增加safeAreaInsets的值赔桌,可以通過一個新的屬性:addtionalSafeAreaInsets來改變safeAreaInsets的值,當你的viewController改變了它的safeAreaInsets值時渴逻,有兩種方式獲取到回調(diào):

UIView.safeAreaInsetsDidChange()
UIViewController.viewSafeAreaInsetsDidChange()

分享一個獲取某View安全區(qū)域范圍的宏

#define VIEWSAFEAREAINSETS(view) ({UIEdgeInsets i; if(@available(iOS 11.0, *)) {i = view.safeAreaInsets;} else {i = UIEdgeInsetsZero;} i;})

使用方法:
VIEWSAFEAREAINSETS(view).left
VIEWSAFEAREAINSETS(self.view).right

UIScrollView and UITableView的新特性ScrollView

如果有一些文本位于UI滾動視圖的內(nèi)部疾党,并包含在導航控制器中,現(xiàn)在一般navigationContollers會傳入一個contentInset給其最頂層的viewControllerscrollView惨奕,在iOS11中進行了一個很大的改變雪位,不再通過scrollViewcontentInset屬性了,而是新增了一個屬性:adjustedContentInset墓贿,通過下面兩種圖的對比茧泪,能夠表示adjustContentInset表示的區(qū)域:

adjustContentInset表示的區(qū)域
iOS 10 和 iOS 11 對比

新增的contentInsetAdjustmentBehavior屬性用來配置adjustedContentInset的行為蜓氨,該結構體有以下幾種類型:

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;

UIScrollViewContentInsetAdjustmentBehavior 是一個枚舉類型,值有以下幾種:

  • automaticscrollableAxes一樣,scrollView會自動計算和適應頂部和底部的內(nèi)邊距并且在scrollView不可滾動時,也會設置內(nèi)邊距.
  • scrollableAxes 自動計算內(nèi)邊距.
  • never不計算內(nèi)邊距
  • always 根據(jù)safeAreaInsets 計算內(nèi)邊距

TableView

1.UITableview UICollectionView MJRefresh下拉刷新錯亂的問題

if (@available(iOS 11.0, *)) {
    _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    _tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0);//iPhoneX這里是88
    _tableView.scrollIndicatorInsets = _tableView.contentInset;
}

2.在iOS 11中默認啟用Self-Sizing 未使用AutoLayout的TableView中的高度會出現(xiàn)問題.

Self-SizingiOS11下是默認開啟的,Headers, footers, and cells都默認開啟Self-Sizing穴吹,所有estimated 高度默認值從iOS11之前的 0 改變?yōu)?code>UITableViewAutomaticDimension.

如果目前項目中沒有使用estimateRowHeight屬性幽勒,在iOS11的環(huán)境下就要注意了,因為開啟Self-Sizing之后港令,tableView是使用estimateRowHeight屬性的啥容,這樣就會造成contentSizecontentOffset值的變化,如果是有動畫是觀察這兩個屬性的變化進行的顷霹,就會造成動畫的異常咪惠,因為在估算行高機制下,contentSize的值是一點點地變化更新的淋淀,所有cell顯示完后才是最終的contentSize值遥昧。因為不會緩存正確的行高,tableView reloadData的時候朵纷,會重新計算contentSize炭臭,就有可能會引起contentOffset的變化。iOS11下不想使用Self-Sizing的話袍辞,可以通過以下方式關閉:

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

3.TableView的separatorInset擴展

iOS 7引入separatorInset屬性鞋仍,用以設置cell的分割線邊距,在 iOS 11中對其進行了擴展搅吁⊥矗可以通過新增的UITableViewSeparatorInsetReference枚舉類型的separatorInsetReference屬性來設置separatorInset屬性的參照值.

通過下面的參考圖可以看出他們的區(qū)別:

separatorInset區(qū)別

4. TableView和SafeArea(安全區(qū))

有以下幾點需要注意:

  • separatorInset 被自動地關聯(lián)到 safe area insets落午,因此,默認情況下肚豺,表視圖的整個內(nèi)容避免了其根視圖控制器的安全區(qū)域的插入板甘。
  • UITableviewCellUITableViewHeaderFooterViewcontentview 在安全區(qū)域內(nèi);因此你應該始終在 contentview 中使用add-subviews操作详炬。
  • 所有的 headersfooters都應該使用UITableViewHeaderFooterView盐类,包括 table headersfooterssection headersfooters呛谜。

5. TableView的滑動操作

iOS8之后在跳,蘋果官方增加了UITableVIew的右滑操作接口,即新增了一個代理方法tableView: editActionsForRowAtIndexPath:和一個類UITableViewRowAction隐岛,代理方法返回的是一個數(shù)組猫妙,我們可以在這個代理方法中定義所需要的操作按鈕(刪除、置頂?shù)?聚凹,這些按鈕的類就是UITableViewRowAction割坠。這個類只能定義按鈕的顯示文字、背景色妒牙、和按鈕事件彼哼。并且返回數(shù)組的第一個元素在UITableViewCell的最右側(cè)顯示,最后一個元素在最左側(cè)顯示湘今。從iOS 11開始有了一些改變敢朱,首先是可以給這些按鈕添加圖片了,然后是如果實現(xiàn)了以下兩個iOS 11新增的代理方法摩瞎,將會取代tableView: editActionsForRowAtIndexPath:代理方法:

代理方法

這兩個代理方法返回的是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;
}
typedef NS_ENUM(NSInteger, UIContextualActionStyle) {
    UIContextualActionStyleNormal,
    UIContextualActionStyleDestructive
} NS_SWIFT_NAME(UIContextualAction.Style)

創(chuàng)建UIContextualAction對象時,UIContextualActionStyle有兩種類型旗们,如果是置頂蚓哩、已讀等按鈕就使用UIContextualActionStyleNormal
類型,delete操作按鈕可使用UIContextualActionStyleDestructive
類型上渴,當使用該類型時岸梨,如果是右滑操作,一直向右滑動某個cell驰贷,會直接執(zhí)行刪除操作盛嘿,不用再點擊刪除按鈕,這也是一個好玩的更新.

typedef NS_ENUM(NSInteger, UIContextualActionStyle) {
    UIContextualActionStyleNormal,
    UIContextualActionStyleDestructive
} NS_SWIFT_NAME(UIContextualAction.Style)

滑動操作這里還有一個需要注意的是括袒,當cell高度較小時次兆,會只顯示image,不顯示title锹锰,當cell高度夠大時芥炭,會同時顯示imagetitle漓库。我寫demo測試的時候,因為每個cell的高度都較小园蝠,所以只顯示image渺蒿,然后我增加cell的高度后,就可以同時顯示imagetitle了彪薛。見下圖對比:


iOS11中 UIKit’s Bars 上的變化
WWDC通過iOS新增的文件管理App:Files開始介紹茂装,在Files這個APP中能夠看到iOS11``中UIKit’s Bars的一些新特性:在瀏覽功能上的大標題視圖(向上滑動后標題會回到原來的UI效果)、橫屏狀態(tài)下tab上的文字和icon會變?yōu)樽笥遗帕校?br>
豎屏

橫屏

iPhone上善延,tab上的圖標較小少态,tab bar較小,這樣垂直空間可多放置內(nèi)容易遣。如果有人看不清楚tab bar上的圖標或文字彼妻,可以通過長按tab bar上的任意item,會將該item顯示在HUD上豆茫,這樣可以清楚的看清icontext侨歉。對tool barnavigation bar同理,長按item也會放大顯示.

  • UIBarItem

UIBarItemUItabbaritemUIbarbuttonitem的父類揩魂,要想實現(xiàn)上面介紹的效果幽邓,只需要為UIBarItem 設置landscapeImagePhone
屬性,在storyboard中也支持這個設置肤京,對于HUD的image需要設置另一個iOS11新增的屬性:largeContentSizeImage
颊艳,關于這部分更詳細的討論茅特,可以參考 WWDC2017 Session 215:What's New in Accessibility

  • 控制大標題的顯示

UINavigationbar中新增了一個BOOL屬性prefersLargeTitles
,將該屬性設置為ture忘分,navigationbar就會在整個APP中顯示大標題,如果想要在控制不同頁面大標題的顯示白修,可以通過設置當前頁面的navigationItemlargeTitleDisplayMode屬性.

navigationItem.largeTitleDisplayMode 

typedef NS_ENUM(NSInteger, UINavigationItemLargeTitleDisplayMode) {  
/// 自動模式依賴上一個 item 的特性
UINavigationItemLargeTitleDisplayModeAutomatic,
/// 針對當前 item 總是啟用大標題特性
UINavigationItemLargeTitleDisplayModeAlways,
/// Never 
UINavigationItemLargeTitleDisplayModeNever,
}

在 Navigation 集成 UISearchController

把你UISearchController賦值給navigationItem妒峦,就可以實現(xiàn)將UISearchController集成到 Navigation.

navigationItem.searchController //iOS 11 新增屬性
navigationItem.hidesSearchBarWhenScrolling //決定滑動的時候是否隱藏搜索框;iOS 11 新增屬性

UINavigationController和滾動交互

滾動的時候兵睛,以下交互操作都是由UINavigationController負責調(diào)動的:

UIsearchController搜索框效果更新
大標題效果的控制
Rubber banding效果 //當你開始往下拉肯骇,大標題會變大來回應那個滾輪

所以,如果你使用navigation bar祖很,組裝一些整體pushpop體驗笛丙,你不會得到searchController的集成、大標題的控制更新和Rubber banding效果假颇,因為這些都是由UINavigationController控制的胚鸯。

參考:
你可能需要為你的APP適配iOS11

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市笨鸡,隨后出現(xiàn)的幾起案子姜钳,更是在濱河造成了極大的恐慌坦冠,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哥桥,死亡現(xiàn)場離奇詭異辙浑,居然都是意外死亡,警方通過查閱死者的電腦和手機拟糕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門判呕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人送滞,你說我怎么就攤上這事佛玄。” “怎么了累澡?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵梦抢,是天一觀的道長。 經(jīng)常有香客問我愧哟,道長奥吩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任蕊梧,我火速辦了婚禮霞赫,結果婚禮上,老公的妹妹穿的比我還像新娘肥矢。我一直安慰自己端衰,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布甘改。 她就那樣靜靜地躺著旅东,像睡著了一般。 火紅的嫁衣襯著肌膚如雪十艾。 梳的紋絲不亂的頭發(fā)上抵代,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音忘嫉,去河邊找鬼荤牍。 笑死,一個胖子當著我的面吹牛庆冕,可吹牛的內(nèi)容都是我干的康吵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼访递,長吁一口氣:“原來是場噩夢啊……” “哼晦嵌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤耍铜,失蹤者是張志新(化名)和其女友劉穎邑闺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棕兼,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡陡舅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伴挚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靶衍。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茎芋,靈堂內(nèi)的尸體忽然破棺而出颅眶,到底是詐尸還是另有隱情,我是刑警寧澤田弥,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布涛酗,位于F島的核電站,受9級特大地震影響偷厦,放射性物質(zhì)發(fā)生泄漏商叹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一只泼、第九天 我趴在偏房一處隱蔽的房頂上張望剖笙。 院中可真熱鬧,春花似錦请唱、人聲如沸弥咪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聚至。三九已至,卻和暖如春孽惰,著一層夾襖步出監(jiān)牢的瞬間晚岭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工勋功, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人库说。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓狂鞋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親潜的。 傳聞我的和親對象是個殘疾皇子骚揍,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • UIScrollView and UITableView的新特性 ScrollView 如果有一些文本位于UI滾動...
    透支未來閱讀 613評論 0 0
  • iOS 11 為整個生態(tài)系統(tǒng)的 UI 元素帶來了一種更加大膽、動態(tài)的新風格。 本文介紹iOS11中在UI方面做了哪...
    阿凡提說AI閱讀 590評論 0 1
  • 前言 蘋果WWDC開發(fā)者大會上信不,終于發(fā)布了大家期待已久的iOS 11嘲叔,有些新特性功能確實出人意料。不過大的方面蘋果...
    Mr_Say_Yes閱讀 3,318評論 6 15
  • 一抽活、NavigationBar UIBarItem UIBarItem在iOS11在中新增landscapeIma...
    灰s閱讀 3,804評論 5 11
  • 長著肉肉的葉子硫戈,枝干和根,多肉植物是不是摸起來很有手感下硕。除了可愛的外表之外多肉植物也很好養(yǎng)活哦丁逝,絕對是你裝點房間的...
    小飛探索閱讀 3,803評論 0 0