2016-04-07 24 views
6

我想學習一些新的iOS編程模式。我已經閱讀了關於在iOS 7中添加的UIViewController轉換API的一些內容。它們看起來很酷,但對於看起來更簡單的任務來說,它們感覺相當沉重。瞭解UIViewController轉換的值

考慮這個用例: 我有一個自定義容器視圖控制器來管理「幻燈片」。它包含一組幻燈片視圖控制器,用戶可以通過點擊按鈕前後移動。

我可以完成這個過渡如下:

private func transitionToViewController(viewController: UIViewController, direction: TransitionDirection = .Forward, animated: Bool = true) { 
    currentViewController.willMove(toParentViewController: nil) 
    addChildViewController(viewController) 
    // ... set up frames, other animation prep ... 
    contentContainerView.addSubview(comingView) 
    UIView.animate(duration: 0.5, animations: { 
     // do the animations 
    }) { (finished) in 
     leavingView.removeFromSuperview() 
     self.currentViewController.removeFromParentViewController() 
     viewController.didMove(toParentViewController: self) 
     // final clean up 
    } 
} 

將如何轉變新的API改進呢?據我瞭解,這些API更加複雜,如果你正在自己的容器視圖控制器來使用(見custom-container view controller transitions

是在過渡的API值多爲互動的轉變?

感謝澄清

回答

7

我認爲新的轉變API(UIViewControllerTransitioningDelegate和朋友)僅僅是在視圖過渡的控制器之間的泛化最後一步。

UIKit中的第一個版本,我們不得不hack the system transition code得到任何自定義轉換在所有。多年後,我們獲得了控制器遏制,使管理視圖控制器成爲一流的公民和create our own interactive transitions。最後一步是爲您可以實現的任何轉換提供全功能的通用系統API--這是新的轉換API。

新的API可以將轉換提取到獨立的類中。反過來,這又使得最終可以從GitHub上下載一個轉換庫,並將其作爲一個簡單的轉換代理插入到您現有的代碼中。無需從某些特定的超類派生視圖控制器,不需要使用第三方控制器容器,也不需要爲UIKit類添加擴展。現在,轉換終於成爲了UIKit的一流公民。

+0

我同意有許多獨立的類,乍一看API看起來令人望而生畏。但是,Apple的文檔涵蓋了所有的低級語言,並且你需要爲每個類寫入的代碼數量(比如說)複製'UIAlertController'的行爲並不是很多。 –

2

新的轉換API如何改進?

TL; DR通過封裝,可重用性,可測試性的可維護性。

封裝:該註釋表明有邏輯設置和狀態跟蹤與動畫。您的視圖控制器可能已經足夠大了;將轉換邏輯放在其他地方會使每個零件更小,因此更易於維護。

可重複使用性:接下來要做的事情是什麼?毫無疑問,設置從過渡到控制器的過渡。這可能是這個動畫的逆轉嗎?很可能。因此,您可能會複製此代碼並將其粘貼到該控制器,並將其反轉。現在你有兩份。使用轉換的一個副本將更易於維護。 (還要注意自定義轉換的pod的存在,因爲可重用性和可共享性齊頭並進。)

可測試性:嵌入在重量級視圖控制器中的代碼非常難以測試。可以獨立測試自定義轉換,而無需實時視圖的狀態開銷。

因此,對於您打算多次查看的任何代碼,轉換API可能是值得的!