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)容撩鹿,我們是通過viewController
的edgesForExtendedLayout
屬性來做這些的。
iOS 7 開始悦屏,在 UIViewController
中引入的 topLayoutGuide
和 bottomLayoutGuide
在 iOS 11 中被廢棄了节沦!取而代之的就是safeArea
的概念键思,safeArea
是描述你的視圖部分不被任何內(nèi)容遮擋的方法。 它提供兩種方式:safeAreaInsets
或safeAreaLayoutGuide
來提供給你safeArea
的參照值甫贯,即 insets
或者 layout guide
吼鳞。 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
給其最頂層的viewController
的scrollView
惨奕,在iOS11
中進行了一個很大的改變雪位,不再通過scrollView
的contentInset
屬性了,而是新增了一個屬性:adjustedContentInset
墓贿,通過下面兩種圖的對比茧泪,能夠表示adjustContentInset
表示的區(qū)域:
新增的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
是一個枚舉類型,值有以下幾種:
-
automatic
和scrollableAxes
一樣,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-Sizing
在iOS11
下是默認開啟的,Headers
, footers
, and cells
都默認開啟Self-Sizing
穴吹,所有estimated
高度默認值從iOS11
之前的 0
改變?yōu)?code>UITableViewAutomaticDimension.
如果目前項目中沒有使用estimateRowHeight
屬性幽勒,在iOS11
的環(huán)境下就要注意了,因為開啟Self-Sizing
之后港令,tableView
是使用estimateRowHeight
屬性的啥容,這樣就會造成contentSize
和contentOffset
值的變化,如果是有動畫是觀察這兩個屬性的變化進行的顷霹,就會造成動畫的異常咪惠,因為在估算行高機制下,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ū)別:
4. TableView和SafeArea(安全區(qū))
有以下幾點需要注意:
-
separatorInset
被自動地關聯(lián)到safe area insets
落午,因此,默認情況下肚豺,表視圖的整個內(nèi)容避免了其根視圖控制器的安全區(qū)域的插入板甘。 -
UITableviewCell
和UITableViewHeaderFooterView
的contentview
在安全區(qū)域內(nèi);因此你應該始終在contentview
中使用add-subviews
操作详炬。 - 所有的
headers
和footers
都應該使用UITableViewHeaderFooterView
盐类,包括table headers
和footers
、section headers
和footers
呛谜。
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
高度夠大時芥炭,會同時顯示image
和title
漓库。我寫demo
測試的時候,因為每個cell
的高度都較小园蝠,所以只顯示image
渺蒿,然后我增加cell
的高度后,就可以同時顯示image
和title
了彪薛。見下圖對比:
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
上豆茫,這樣可以清楚的看清icon
和text
侨歉。對tool bar
和 navigation bar
同理,長按item也會放大顯示.
- UIBarItem
UIBarItem
是UItabbaritem
和UIbarbuttonitem
的父類揩魂,要想實現(xiàn)上面介紹的效果幽邓,只需要為UIBarItem
設置landscapeImagePhone
屬性,在storyboard
中也支持這個設置肤京,對于HUD的image
需要設置另一個iOS11
新增的屬性:largeContentSizeImage
颊艳,關于這部分更詳細的討論茅特,可以參考 WWDC2017 Session 215:What's New in Accessibility
- 控制大標題的顯示
在UINavigationbar
中新增了一個BOOL
屬性prefersLargeTitles
,將該屬性設置為ture
忘分,navigationbar
就會在整個APP
中顯示大標題,如果想要在控制不同頁面大標題的顯示白修,可以通過設置當前頁面的navigationItem
的largeTitleDisplayMode
屬性.
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
祖很,組裝一些整體push
和pop
體驗笛丙,你不會得到searchController
的集成、大標題的控制更新和Rubber banding
效果假颇,因為這些都是由UINavigationController
控制的胚鸯。