iOS11及Xcode9適配問題匯總

UIScrollView and UITableView的新特性

ScrollView

如果有一些文本位于UI滾動(dòng)視圖的內(nèi)部卿城,并包含在導(dǎo)航控制器中,現(xiàn)在一般navigationContollers會(huì)傳入一個(gè)contentInset給其最頂層的viewController的scrollView,在iOS11中進(jìn)行了一個(gè)很大的改變巩螃,不再通過scrollView的contentInset屬性了,而是新增了一個(gè)屬性:adjustedContentInset坦袍,通過下面兩種圖的對(duì)比,能夠表示adjustContentInset表示的區(qū)域:

image
image

新增的contentInsetAdjustmentBehavior屬性用來配置adjustedContentInset的行為等太,該結(jié)構(gòu)體有以下幾種類型:

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 是一個(gè)枚舉類型,值有以下幾種:

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

TableView

1.UITableview UICollectionView MJRefresh下拉刷新錯(cuò)亂或是莫名有20空隙的問題

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

如果改完后運(yùn)行無效果 可以嘗試Clean一下工程再運(yùn)行, 很多小伙伴都遇到這樣的問題了, 你不妨也試以試.

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

Self-Sizing在iOS11下是默認(rèn)開啟的,Headers, footers, and cells都默認(rèn)開啟Self-Sizing缩抡,所有estimated 高度默認(rèn)值從iOS11之前的 0 改變?yōu)?code>UITableViewAutomaticDimension.

如果目前項(xiàng)目中沒有使用estimateRowHeight屬性奠宜,在iOS11的環(huán)境下就要注意了,因?yàn)殚_啟Self-Sizing之后瞻想,tableView是使用estimateRowHeight屬性的压真,這樣就會(huì)造成contentSizecontentOffset值的變化,如果是有動(dòng)畫是觀察這兩個(gè)屬性的變化進(jìn)行的蘑险,就會(huì)造成動(dòng)畫的異常滴肿,因?yàn)樵诠浪阈懈邫C(jī)制下,contentSize的值是一點(diǎn)點(diǎn)地變化更新的佃迄,所有cell顯示完后才是最終的contentSize值泼差。因?yàn)椴粫?huì)緩存正確的行高,tableView reloadData的時(shí)候呵俏,會(huì)重新計(jì)算contentSize堆缘,就有可能會(huì)引起contentOffset的變化。iOS11下不想使用Self-Sizing的話普碎,可以通過以下方式關(guān)閉:

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

3.TableView的separatorInset擴(kuò)展

iOS 7 引入separatorInset屬性吼肥,用以設(shè)置 cell 的分割線邊距,在 iOS 11 中對(duì)其進(jìn)行了擴(kuò)展随常∏甭伲可以通過新增的UITableViewSeparatorInsetReference枚舉類型的separatorInsetReference屬性來設(shè)置separatorInset屬性的參照值.

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

image

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

有以下幾點(diǎn)需要注意:

  • separatorInset 被自動(dòng)地關(guān)聯(lián)到 safe area insets,因此绪氛,默認(rèn)情況下唆鸡,表視圖的整個(gè)內(nèi)容避免了其根視圖控制器的安全區(qū)域的插入。
  • UITableviewCellUITableViewHeaderFooterViewcontentview 在安全區(qū)域內(nèi)枣察;因此你應(yīng)該始終在 contentview 中使用add-subviews操作争占。
  • 所有的 headers 和 footers 都應(yīng)該使用UITableViewHeaderFooterView,包括 table headers 和 footers序目、section headers 和 footers臂痕。

5. TableView的滑動(dòng)操作

在iOS8之后,蘋果官方增加了UITableVIew的右滑操作接口猿涨,即新增了一個(gè)代理方法tableView: editActionsForRowAtIndexPath:和一個(gè)類UITableViewRowAction握童,代理方法返回的是一個(gè)數(shù)組,我們可以在這個(gè)代理方法中定義所需要的操作按鈕(刪除叛赚、置頂?shù)?澡绩,這些按鈕的類就是UITableViewRowAction稽揭。這個(gè)類只能定義按鈕的顯示文字、背景色肥卡、和按鈕事件溪掀。并且返回?cái)?shù)組的第一個(gè)元素在UITableViewCell的最右側(cè)顯示,最后一個(gè)元素在最左側(cè)顯示步鉴。從iOS 11開始有了一些改變揪胃,首先是可以給這些按鈕添加圖片了,然后是如果實(shí)現(xiàn)了以下兩個(gè)iOS 11新增的代理方法氛琢,將會(huì)取代tableView: editActionsForRowAtIndexPath:代理方法:

image

這兩個(gè)代理方法返回的是UISwipeActionsConfiguration類型的對(duì)象喊递,創(chuàng)建該對(duì)象及賦值可看下面的代碼片段:

- ( 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對(duì)象時(shí),UIContextualActionStyle有兩種類型艺沼,如果是置頂册舞、已讀等按鈕就使用UIContextualActionStyleNormal類型,delete操作按鈕可使用UIContextualActionStyleDestructive類型障般,當(dāng)使用該類型時(shí)调鲸,如果是右滑操作,一直向右滑動(dòng)某個(gè)cell挽荡,會(huì)直接執(zhí)行刪除操作藐石,不用再點(diǎn)擊刪除按鈕,這也是一個(gè)好玩的更新.

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

滑動(dòng)操作這里還有一個(gè)需要注意的是定拟,當(dāng)cell高度較小時(shí)于微,會(huì)只顯示image,不顯示title青自,當(dāng)cell高度夠大時(shí)株依,會(huì)同時(shí)顯示image和title。我寫demo測試的時(shí)候延窜,因?yàn)槊總€(gè)cell的高度都較小恋腕,所以只顯示image,然后我增加cell的高度后逆瑞,就可以同時(shí)顯示image和title了荠藤。見下圖對(duì)比:

image

iOS11中 UIKit’s Bars 上的變化

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

豎屏
橫屏

在iPhone上哈肖,tab上的圖標(biāo)較小,tab bar較小念秧,這樣垂直空間可多放置內(nèi)容淤井。如果有人看不清楚tab bar上的圖標(biāo)或文字,可以通過長按tab bar上的任意item,會(huì)將該item顯示在HUD上庄吼,這樣可以清楚的看清icon和text缎除。對(duì)tool bar 和 navigation bar同理严就,長按item也會(huì)放大顯示.

  • UIBarItem

UIBarItem是UI tab bar item和UI bar button item的父類总寻,要想實(shí)現(xiàn)上面介紹的效果,只需要為UIBarItem 設(shè)置landscapeImagePhone屬性梢为,在storyboard中也支持這個(gè)設(shè)置渐行,對(duì)于HUD的image需要設(shè)置另一個(gè)iOS11新增的屬性:largeContentSizeImage,關(guān)于這部分更詳細(xì)的討論铸董,可以參考 WWDC2017 Session 215:What's New in Accessibility

  • 控制大標(biāo)題的顯示

UINavigationbar中新增了一個(gè)BOOL屬性prefersLargeTitles,將該屬性設(shè)置為ture祟印,navigationbar就會(huì)在整個(gè)APP中顯示大標(biāo)題,如果想要在控制不同頁面大標(biāo)題的顯示粟害,可以通過設(shè)置當(dāng)前頁面的navigationItemlargeTitleDisplayMode屬性.

navigationItem.largeTitleDisplayMode 

typedef NS_ENUM(NSInteger, UINavigationItemLargeTitleDisplayMode) {  
/// 自動(dòng)模式依賴上一個(gè) item 的特性
UINavigationItemLargeTitleDisplayModeAutomatic,
/// 針對(duì)當(dāng)前 item 總是啟用大標(biāo)題特性
UINavigationItemLargeTitleDisplayModeAlways,
/// Never 
UINavigationItemLargeTitleDisplayModeNever,
}

在 Navigation 集成 UISearchController

把你的UISearchController賦值給navigationItem蕴忆,就可以實(shí)現(xiàn)將UISearchController集成到 Navigation.

navigationItem.searchController  //iOS 11 新增屬性
navigationItem.hidesSearchBarWhenScrolling //決定滑動(dòng)的時(shí)候是否隱藏搜索框;iOS 11 新增屬性

UINavigationController和滾動(dòng)交互

滾動(dòng)的時(shí)候悲幅,以下交互操作都是由UINavigationController負(fù)責(zé)調(diào)動(dòng)的:

UIsearchController搜索框效果更新
大標(biāo)題效果的控制
Rubber banding效果 //當(dāng)你開始往下拉套鹅,大標(biāo)題會(huì)變大來回應(yīng)那個(gè)滾輪

所以,如果你使用navigation bar汰具,組裝一些整體push和pop體驗(yàn)卓鹿,你不會(huì)得到searchController的集成、大標(biāo)題的控制更新和Rubber banding效果留荔,因?yàn)檫@些都是由UINavigationController控制的吟孙。

Margins 和 Insets

基于約束的Auto Layout, 使我們搭建能夠動(dòng)態(tài)響應(yīng)內(nèi)部和外部變化的用戶界面. Auto Layout為每一個(gè)view都定義了margin. margin指的是控件顯示內(nèi)容部分的邊緣和控件邊緣的距離.
可以用layoutMargins或者layoutMarginsGuide屬性獲得viewmargin, margin是視圖內(nèi)部的一部分. layoutMargins允許獲取或者設(shè)置UIEdgeInsets結(jié)構(gòu)的margin. layoutMarginsGuide則獲取到只讀的UILayoutGuide對(duì)象.

在iOS11新增了一個(gè)屬性:directional layout margins,該屬性是NSDirectionalEdgeInsets結(jié)構(gòu)體類型的屬性:

typedef struct NSDirectionalEdgeInsets {  
    CGFloat top, leading, bottom, trailing;
} NSDirectionalEdgeInsets API_AVAILABLE(ios(11.0),tvos(11.0),watchos(4.0));

layoutMarginsUIEdgeInsets結(jié)構(gòu)體類型的屬性:

typedef struct UIEdgeInsets {  
CGFloat top, left, bottom, right;
} UIEdgeInsets;

從上面兩種結(jié)構(gòu)體的對(duì)比可以看出, NSDirectionalEdgeInsets屬性用leadingtrailing 取代了之前的 leftright.

directional layout margins屬性的說明如下:

directionalLayoutMargins.leading is used on the left when the user interface direction is LTR and on the right for RTL.
Vice versa for directionalLayoutMargins.trailing.

例子: 當(dāng)你設(shè)置了trailing = 30; 當(dāng)在一個(gè)right to left 語言下trailing的值會(huì)被設(shè)置在view的左邊, 可以通過layoutMarginleft屬性讀出該值. 如下圖所示:

image

還有其他一些更新. 自從引入layout margins, 當(dāng)將一個(gè)view添加到viewController時(shí), viewController會(huì)修改viewlayoutMargins為UIKit定義的一個(gè)值, 這些調(diào)整對(duì)外是封閉的. 從iOS11開始, 這些不再是一個(gè)固定的值, 它們實(shí)際是最小值, 你可以改變viewlayoutMargins為任意一個(gè)更大的值. 而且, viewController新增了一個(gè)屬性: viewRespectsSystemMinimumLayoutMargins, 如果你設(shè)置該屬性為false, 你就可以改變你的layoutMargins為任意你想設(shè)置的值, 包括0, 如下圖所示:

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末聚蝶,一起剝皮案震驚了整個(gè)濱河市杰妓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碘勉,老刑警劉巖巷挥,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恰聘,居然都是意外死亡句各,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門晴叨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凿宾,“玉大人,你說我怎么就攤上這事兼蕊〕鹾瘢” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長产禾。 經(jīng)常有香客問我排作,道長,這世上最難降的妖魔是什么亚情? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任妄痪,我火速辦了婚禮,結(jié)果婚禮上楞件,老公的妹妹穿的比我還像新娘衫生。我一直安慰自己,他們只是感情好土浸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布罪针。 她就那樣靜靜地躺著,像睡著了一般黄伊。 火紅的嫁衣襯著肌膚如雪泪酱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天还最,我揣著相機(jī)與錄音墓阀,去河邊找鬼。 笑死憋活,一個(gè)胖子當(dāng)著我的面吹牛岂津,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悦即,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吮成,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辜梳?” 一聲冷哼從身側(cè)響起粱甫,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎作瞄,沒想到半個(gè)月后茶宵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宗挥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年乌庶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片契耿。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞒大,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搪桂,到底是詐尸還是另有隱情透敌,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站酗电,受9級(jí)特大地震影響魄藕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撵术,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一背率、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荷荤,春花似錦退渗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽个粱。三九已至古毛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間都许,已是汗流浹背稻薇。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胶征,地道東北人塞椎。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像睛低,于是被迫代替她去往敵國和親案狠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • iOS 11增加info.Plist中的字段:相冊(cè)權(quán)限:之前的這個(gè)字段:Privacy - Photo Libra...
    vision_colion閱讀 1,292評(píng)論 3 9
  • 前言 蘋果WWDC開發(fā)者大會(huì)上钱雷,終于發(fā)布了大家期待已久的iOS 11骂铁,有些新特性功能確實(shí)出人意料。不過大的方面蘋果...
    Mr_Say_Yes閱讀 3,318評(píng)論 6 15
  • iOS 11 為整個(gè)生態(tài)系統(tǒng)的 UI 元素帶來了一種更加大膽罩抗、動(dòng)態(tài)的新風(fēng)格拉庵。 本文介紹iOS11中在UI方面做了哪...
    阿凡提說AI閱讀 590評(píng)論 0 1
  • 本文為作者原創(chuàng),未經(jīng)作者允許不得轉(zhuǎn)載套蒂。該文同時(shí)發(fā)表在騰訊bugly公眾號(hào):https://mp.weixin.qq...
    sonialiu閱讀 101,621評(píng)論 74 283
  • 2017年7月4日星期二晴 今天女兒回學(xué)校了钞支,走的時(shí)候說:媽,我考試完了就找份工作在那里打工操刀。"我說:“好的烁挟。"...
    孫建勝_fa1a閱讀 350評(píng)論 0 0