What's new in iOS 11 - 部分iOS11新特性整理

前言

iOS 11beta版已經來了,正式版我想應該也快了,作為一個iOS開發(fā)者馆类,這意味著馬上就要著手來適配iOS 11了。在開始之前弹谁,我想對于iOS 11中的新特性乾巧,還是很有必要先了解一下的≡し撸總不能每次都是坐等別人的適配手冊吧沟于。

這里并沒有提到新增加的ARKitCoreML植康,我想這些新框架目前我們應該還接觸不到旷太。至于Drag & Drop,這個還是蠻有意思的,有時間的時候可以整理下供璧。

UIViewController

  • topLayoutGuide, bottomLayoutGuide
    這2個屬性被標記為過期了存崖,但是在Storyboard里設置約束的時候,還是會出現這2個屬性
  • automaticallyAdjustsScrollViewInsets
    這個屬性也被標記過期了睡毒,可以使用UIScrollViewcontentInsetAdjustmentBehavior替代

UIScrollView

  • 新增contentInsetAdjustmentBehavior屬性
    替代之前UIViewControllerautomaticallyAdjustsScrollViewInsets来惧,作用類似,會根據某些情況自動調整scrollviewcontentInset(實際改變的是adjustedContentInset屬性吕嘀,contentInset屬性不會變)
    有4個可選值:
 public enum UIScrollViewContentInsetAdjustmentBehavior : Int {
    case automatic // Similar to .scrollableAxes, but will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewContentInset = YES inside a navigation controller, regardless of whether the scroll view is scrollable
    case scrollableAxes // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
    case never // contentInset is not adjusted
    case always // contentInset is always adjusted by the scroll view's safeAreaInsets
}
  • 新增safeAreaInsets: UIEdgeInsets屬性
    只讀屬性违寞,為了配合contentInsetAdjustmentBehavior使用
  • 新增adjustedContentInset: UIEdgeInsets屬性
    只讀屬性,這個屬性會根據safeAreaInsets的變化而變化
  • UIScrollViewDelegate新增scrollViewDidChangeAdjustedContentInset偶房,當adjustedContentInset變化時會調用
    UIScrollView的這幾個Inset的改變需要引起注意趁曼,他改變了原來的contentInset的邏輯(比如現在contentInset不會受UINavigationBarisTranslucent影響了),可能會對現有的項目中的頁面展示有影響棕洋,在項目適配iOS11時需要留意下挡闰。

UINavigationBar

  • 新增prefersLargeTitles: Bool屬性
    大標題,默認為false掰盘,當設置為true時摄悯,navigation bar會顯示大標題,向上滑動頁面愧捕,navigation bar 會變小直到顯示成跟之前一樣奢驯,同時title位置會發(fā)生變化
navigationController?.navigationBar.prefersLargeTitles = true

效果如下:

大標題

滾動的過程中,通過打印navigation bar 的frame發(fā)現次绘,navigation bar 的高度會跟著變化
如果navigation bar是透明的瘪阁,scrollview的safeAreaInsets屬性也會跟著變化
大概關系是:
safeAreaInsets.top = navigationBar.frame.height+statusBar.height

UINavigationItem

  • 新增largeTitleDisplayMode屬性
    這個屬性配合navigation bar的大標題使用的。
    當navigation bar啟用prefersLargeTitles后邮偎,這個屬性才會生效管跺,可以控制某個單獨的ViewController中的large title顯示模式,有三個可選值:
public enum LargeTitleDisplayMode : Int {
        /// Automatically use the large out-of-line title based on the state of the previous item in the navigation bar. An item with largeTitleDisplayMode=Automatic will show or hide the large title based on the request of the previous navigation item. If the first item pushed is set to Automatic, then it will show the large title if the navigation bar has prefersLargeTitles=YES.
        case automatic
        /// Always use a larger title when this item is top most.
        case always
        /// Never use a larger title when this item is top most.
        case never
    }

使用方法:

navigationItem.largeTitleDisplayMode = .never

簡單來說:

  • automatic:與上一個navigation item設置的largeTitleDisplayMode相同
  • always: 總是啟用大標題禾进。剛開始有個誤解豁跑,always并不是說當scrollview滾動的時候,navigation bar一直是大標題模式泻云,而是指艇拍,不管上一個viewcontroller設置的是什么,這個viewcontroller都是啟用大標題
  • never:總是顯示小標題模式宠纯,就是我們正呈缜悖看到的導航欄標題樣式

關于如何修改largetitle的樣式,目前尚沒找到正確的打開方式征椒。以前通過navigationbar.titleTextAttributes直接修改小標題的樣式,對大標題無效(至少目前看是無效的)湃累。

  • 新增searchController屬性
    在navigation bar下面增加一個搜索框
 let searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.backgroundColor = .white
navigationItem.searchController = searchController

效果如下:

searchcontroller.gif
  • 新增hidesSearchBarWhenScrolling:Bool屬性
    配合searchController使用的勃救,默認是true碍讨。
    這個屬性是控制searchController默認是否顯示的。
    通過上圖也可以看到蒙秒,searchBar默認是隱藏的勃黍,當下拉的時候才會顯示出來,再上拉又會隱藏晕讲。
    當設置為false時覆获,searchBar會一直顯示,當scrollview下拉時瓢省,searchBar會隨著scrollview往下走弄息,上拉時,則固定在頂部不動勤婚。
    如下圖:

searchcontroller2.gif

有意思的是摹量,當scrollview下拉時,navigation bar的高度是一直增大的(通過在scrollViewDidScroll代理里打印navigation barframe就會發(fā)現)馒胆,也就是系統(tǒng)實際上是通過增大navigation barheight缨称,來讓search bar緊隨著scrollview的content的。
查看層級關系祝迂,會發(fā)現睦尽,searchBar并不是navigation barsubview
<img src='http://upload-images.jianshu.io/upload_images/2412938-05ab84f30acc7fcb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240' width='200' />

UITableView

  • 新增separatorInsetReference屬性
    分割線相關的型雳,有2個可選值:
public enum UITableViewSeparatorInsetReference : Int {
    // The value set to the separatorInset property is interpreted as an offset from the edges of the cell.
    case fromCellEdges
    // The value set to the separatorInset property is interpreted as an offset from the automatic separator insets.
    case fromAutomaticInsets
}

舉個例子当凡,TableView的separator默認左邊會留15,如果要去掉這個空隙四啰,頂頭顯示
iOS 11之前的寫法:

table.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
cell.layoutMargins = .zero

iOS 11之后的寫法:

table.separatorInsetReference = .fromCellEdges //默認就是fromCellEdges宁玫,所以可以不寫這行代碼
cell.separatorInset = .zero

目前我測試的結果是,當設置separatorInsetReferencefromCellEdges時柑晒,separator的Inset就相當于 cell.separatorInset欧瘪,當設置為fromAutomaticInsets時,tableView.separatorInsetcell.separatorInset都無效匙赞。(可能是我的打開方式不對佛掖?)

  • 新增performBatchUpdates函數,支持批量操作了

Swipe actions

主要是實現了TableViewCell的左劃和右劃手勢功能
UITableViewDelegate中涌庭,新增了兩個delegate芥被,如下:

// These methods supersede -editActionsForRowAtIndexPath: if implemented
// return nil to get the default swipe actions
@available(iOS 11.0, *)
optional public func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?

@available(iOS 11.0, *)
optional public func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?

可以看到,這2個delegate是為了取代原有的editActionsForRowAtIndexPath的坐榆,并且細化了是左滑還是右滑拴魄,同時提供了很不錯的交互體驗。
下面代碼是實現了一個Star功能的左滑手勢

func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        
       let action = UIContextualAction(style: .normal, title: "Star") { (action, view, handler) in
            self.starAction(indexPath: indexPath)
            handler(true)
        }
        action.backgroundColor = .green
        if let stared = stars[indexPath], stared {
            action.title = "Unstar"
            action.backgroundColor = .red
        }
        
        return UISwipeActionsConfiguration(actions: [action])
    }

先看效果:

leadingswipe.gif

下面看下里面涉及到的幾個類

  • UIContextualAction
    表示的是滑開后顯示的一個操作按鈕,它有下面幾個屬性:
    • style: 有2個可選值:.normal.destructive匹中,區(qū)別是背景色不同夏漱,.normal是灰色,.destructive是紅色顶捷。當然如果手動設置了action.backgroundColor挂绰,則以backgroundColor為準。
      還有一個區(qū)別服赎,下面會說葵蒂。
    • title: action顯示的文字,目前沒有發(fā)現api可以修改這個title的font和color
    • image: 設置action的圖片重虑,設置了image就不會顯示文字了
    • handler: 點擊action后的回調践付,它的定義如下:
// call the completionHandler to reset the context to its normal state (e.g. when swiping, resets to unswiped state)
// pass YES to the completionHandler if the action was actually performed, to show a visual indication of the successful completion
public typealias UIContextualActionHandler = (UIContextualAction, UIView, (Bool) -> Swift.Void) -> Swift.Void

可以看到有3個參數:
UIContextualAction: 就是當前所屬的action啦
UIView: 可以理解成action所呈現出來的那個視圖。如果是action是文字的嚎尤,view是一個叫做UIButtonLabel的東東荔仁,如果是image的,view則是UIImageView
(Bool) -> Swift.Void: 這個參數是一個閉包芽死,他的作用是一個completionHandler乏梁,在handler的定義上面,已經給出了說明关贵,意思是在handler里你應該調用這個completionHandler遇骑,以恢復到正常狀態(tài)(可以看上面那個效果圖,點擊action后揖曾,cell會恢復到未左滑的狀態(tài))如果不調用落萎,點擊后就會是保持現有的左側滑開的狀態(tài)。
而且這個completionHandler也需要一個Bool類型的參數炭剪,傳true和傳false有什么區(qū)別呢练链?官方的說明是pass YES to the completionHandler if the action was actually performed
其實這個就是style中的normaldestructive的另一個區(qū)別。
我們知道奴拦,destructive的意思是危險操作媒鼓,一般表示的是刪除。如果你調用completionHandler傳的是true错妖,當style=.destructive時绿鸣,系統(tǒng)會刪掉這個cell,沒錯暂氯,刪掉這個cell潮模!按照官方的解釋可以理解成,destructive就是刪除痴施,你傳了true擎厢,說明action actually performed究流,那系統(tǒng)就會刪掉這個cell.
對于style=.normal的,我試了锉矢,傳truefalse梯嗽,沒區(qū)別。

  • UISwipeActionsConfiguration
    它只有兩個屬性沽损,一個是actions數組,表明你可以添加多個action操作循头;還有一個叫performsFirstActionWithFullSwipe绵估,默認是true,意思是當你full swipe(完全滑動)的時候卡骂,系統(tǒng)會自動執(zhí)行第一個action的handler国裳,這個在上面的效果圖上也能看到。
    右滑跟左滑類似全跨,就不再說了缝左。

結束語

目前就整理了這么多,如果有描述錯誤的浓若,還望不吝賜教渺杉。
希望大家都順利完成iOS11的適配工作!????

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末挪钓,一起剝皮案震驚了整個濱河市是越,隨后出現的幾起案子,更是在濱河造成了極大的恐慌碌上,老刑警劉巖倚评,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異馏予,居然都是意外死亡天梧,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門霞丧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呢岗,“玉大人,你說我怎么就攤上這事蚯妇》罅牵” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵箩言,是天一觀的道長硬贯。 經常有香客問我,道長陨收,這世上最難降的妖魔是什么饭豹? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任鸵赖,我火速辦了婚禮,結果婚禮上拄衰,老公的妹妹穿的比我還像新娘它褪。我一直安慰自己,他們只是感情好翘悉,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布茫打。 她就那樣靜靜地躺著,像睡著了一般妖混。 火紅的嫁衣襯著肌膚如雪老赤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天制市,我揣著相機與錄音抬旺,去河邊找鬼。 笑死祥楣,一個胖子當著我的面吹牛开财,可吹牛的內容都是我干的。 我是一名探鬼主播误褪,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼责鳍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了振坚?” 一聲冷哼從身側響起薇搁,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渡八,沒想到半個月后啃洋,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡屎鳍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年宏娄,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逮壁。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡孵坚,死狀恐怖,靈堂內的尸體忽然破棺而出窥淆,到底是詐尸還是另有隱情卖宠,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布忧饭,位于F島的核電站扛伍,受9級特大地震影響,放射性物質發(fā)生泄漏词裤。R本人自食惡果不足惜刺洒,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一鳖宾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逆航,春花似錦鼎文、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抹剩,卻和暖如春蚤假,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吧兔。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袍嬉,地道東北人境蔼。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像伺通,于是被迫代替她去往敵國和親箍土。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容

  • iOS 11 為整個生態(tài)系統(tǒng)的 UI 元素帶來了一種更加大膽罐监、動態(tài)的新風格吴藻。 本文介紹iOS11中在UI方面做了哪...
    阿凡提說AI閱讀 586評論 0 1
  • UIScrollView and UITableView的新特性 ScrollView 如果有一些文本位于UI滾動...
    透支未來閱讀 609評論 0 0
  • 一、NavigationBar UIBarItem UIBarItem在iOS11在中新增landscapeIma...
    灰s閱讀 3,790評論 5 11
  • 羨慕那些會畫畫的人 因為他們能把心情藏在畫里 也羨慕那些會唱歌的人 因為他們能把自己藏在歌里 而我 只能藏在夜里
    南嘉i閱讀 132評論 0 0
  • 你說弓柱,遇見我沟堡, 亂世突惹一身愁, 夜無點蠟矢空, 日無酥油航罗, 混得不如狗。 但你屁药,可知否粥血, 為苦苦尋你, 我一夜白頭酿箭,...
    倫小讓閱讀 597評論 9 3