平鋪導航模式是非常重要的導航模式。一般用于簡單的扁平化資訊浏覽或任務。扁平化資訊是指這些資訊之間沒有從屬的層次關系,如中國的城市中北京、上 海和哈爾濱之間是扁平化資訊,而哈爾濱市與黑龍江省之間的關系是從屬的層次關系,層次關系資訊可以采用标簽導航和樹形結構導航。
從一個案例開始介紹平鋪導航。如果我想為開發一個基于iphone的“畫廊”應用,目前隻有3幅名畫(左圖是達芬奇-蒙娜麗莎、中圖是羅丹-思想者、右圖是畢加索-哭泣)收錄到應用中。由于這3幅名畫之間沒有層次關系,他們之間是扁平的。
基于分屏導航實作
基于分屏導航是平鋪導航模式的主要實作方式,主要涉及的控件有:分屏控件(uipagecontrol)和scrollview,分屏控件是ios标準控件。
基于分屏導航的手勢有兩種,一個是點選小點的左邊(上邊)或右邊(下邊)實作翻屏,另一個是用手在螢幕上滑動實作翻屏。螢幕的總數應該限制在20個 以内,超過20個分屏控件的小點就會溢出。事實上,如果一個應用超過10屏,此時使用基于分屏導航的平鋪導航模式已經不是很友善了。
下面我們采用基于分屏導航模式實作“畫廊”應用。使用single view application模闆建立一個名為pagecontrolnavigation的工程。将scrollview和pagecontrol控件拖曳到 設計界面,将其擺放到合适的位置,通過屬性将視圖背景設定為黑色。
在interface builder中選中scrollview控件,打開其屬性檢查器,設定scrollers中的屬性,此時該scrollview控件不顯示水準和垂直滾動條,但可以滾動也可以分屏。
在interface builder中選中pagecontrol控件,打開其屬性檢查器,設定pages中“# of pages”(總屏數)屬性為3,current(目前屏)屬性為0。再打開尺寸檢查器,修改width(寬度)屬性為200,将這個屬性設定大一些是為 了便于手指點選。
最後,還需要為這兩個控件定義輸出口并連線,而且要為分屏控件控件定義響應螢幕變化事件的方法changepage:并連線。
完成之後,viewcontroller.h檔案中增加的代碼如下:
下面設計3個視圖,将3個view controller視圖控制器拖曳到mainstoryboard.storyboard的設計界面中,然後再并分别拖曳3個imageview到3個不同視圖上。
然後再分别修改3個imageview的image屬性為名畫的檔案名。
設定完成imageview的image屬性後,再依次選中視圖控制器,将storyboard id分别修改為page1、page2、page3。與模态視圖的例子不同,我們不需要再建立視圖控制器的子類。就本例而言,我們隻需展示一些圖檔。如果 需要處理動作事件,則需要自定義視圖控制器的子類。
設計完成後,我們看看程式代碼viewcontroller.h:
由于需要響應uiscrollview的事件,我們在viewcontroller中實作了uiscrollviewdelegate協定。
下面我們看看viewcontroller.m中viewdidload方法的代碼:
該方法主要進行控件初始化,由于需要計算各個控件的位置,代碼比較多,但是基本上沒什麼難點。self.scrollview.delegate = self是把目前視圖控制(uiscrollviewdelegate實作對象)配置設定給scrollview控件,以便響應事件處理,其他事件是 scrollviewdidscroll:,其代碼如下:
當左右滑動螢幕,scrollview控件滾動完成的時候,要計算和設定分屏控件的目前屏currentpage。當點選分屏控件時螢幕發生變化,此時觸發changepage:方法,其代碼如下:
在上述代碼中,我們根據分屏控件目前螢幕屬性(currentpage)重新調整了scrollview控件的偏移量,而且為了使螢幕變化産生動畫 效果,使用了[uiview animatewithduration:0.3f animations:^{ …}]代碼,重新調整scrollview控件偏移量。
運作代碼,得到的效果