標籤:斯坦福大學 ipad應用 uiviewcontroller delegate splitview
轉載請註明出處
http://blog.csdn.net/pony_maggie/article/details/31462099
作者:小馬
這節課的內容太多,分兩部分介紹。本節課主要是介紹如何開發基於ipad的應用程式,涉及到了一些只有ipad才有的類,介面等。
先講到UIToolbar工具列,常用的UI控制項。在工具列上按鈕一樣的東西叫UIBarButtonItems,可以像一般按鈕一樣操作它,比如建立outlet,action等。使用的時候只要從工具箱裡拖到視圖中就可以了,當然如果你想動態控制,用代碼實現也是沒問題的,第二部分的demo程式就會涉及到這一點。
看到的UI效果叫分屏視圖(split view),有一個控制器類叫UISplitViewController。 這個是只在ipad應用下才有的,也就是你建立工程時,要選擇ipad或universal應用,才可以使用這個類。當然這個視圖控制項也只有在基於ipad的storyboard(一個工程可以有多個storyboard,後面的程式碼範例會看到這個用法)中才可以拖出來使用。應該可以理解為只有ipad才有這樣的控制項,畢竟螢幕比較大這樣的顯示效果才有意義。
既然是分屏,左邊的叫全域欄(master),右邊的叫細節欄(detail)。UISplitViewController本身有個NSArray類型屬性叫viewControllers,數組第一個元素是master,第二個是detail。
分屏視圖和代理(delegate)是永遠不分家的,如果沒有代理你會發現ipad豎屏時,左側邊欄會消失,你無法從任何地方開啟它(正常情況下,是要有個toolbar上的按鈕,按一下,左側邊欄會出現)。 這個在後面的程式碼範例中,我還會講到。
這裡既然提到ipad豎屏, 就多說一些,分屏視圖在轉到豎屏時,有兩種顯示方案,一是上面提到的左側邊欄消失,不過會在toolbar上放一個button,按一下就可以以Popover(後面會介紹)的形式彈出來。還有一種是左右同時顯示,但是要”擠壓”一下,就像ipad裡的設定功能的UI一樣。具體用哪一種還是要根據實際開發的功能以及顯示效果。
我們一次講完上面三幅圖,說的是同一個函數,
(BOOL)splitViewController:(UISplitViewController*)sender shouldHideViewController:(UIViewController *)master inOrientation:(UIInterfaceOrientation)orientation
這個函數控制左側邊欄在不同方向是否隱藏。從三張圖可以看到不同實現的顯示效果,很容易理解,不多說。
控制左側邊欄如何顯示需要用到代理,當前視圖控制器把自己作為代理,並實現
UISplitViewControllerDelegate
這個協議裡的一些方法, 上面提到的那個方法就是其中之一,當然還有其它方法,如下:
//左側邊欄將要隱藏時調用(比如由橫屏轉到豎屏)- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc{ //做兩件事 //一,把工具列上按鈕的title設定成self.title(這裡是"doctor") //二,把按鈕放到工具列上,這個任備要由右側邊欄完成,因為這個時候只有右側邊欄是顯示的。 barButtonItem.title = self.title; [self splitViewBarButtonItemPresenter].splitViewBarButtonItem = barButtonItem; }//左側邊欄將要顯示時調用(比如由豎屏轉到橫屏)- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem{ //把工具列上的按鈕移除,因為左側邊欄顯示,所以不需要 [self splitViewBarButtonItemPresenter].splitViewBarButtonItem = nil;}
這裡說到如何更新細節欄,當全域欄變化時,可能要更新細節欄中的顯示,有兩種方法。一種是很直接的,用target/action,相當於一個響應事件,在處理函數裡設定就可以,如。還有一種不太常用,就是用segue, 這種方法其實相當於把整個原來的右側邊欄視圖換掉,載入一個新的視圖。相當少用。不過後面的程式碼範例中,會用到這一點,要留意。
這裡講到快顯視窗(popover)的一些屬性,如何設定等,還有就是如何改變快顯視窗的預設行為,比如預設情況下,popover是在使用者觸摸到它的地區已外時會自動關閉,可以改變這種行為。比較簡單。
第二部分會詳細講解程式碼範例。