與導航控制器相類似,标簽控制器也是用于管理視圖控制器的一個ui控件,在其内部封裝了一個标簽欄,與導航不同的是,導航的管理方式是縱向的,采用push與pop切換控制器,标簽的管理是橫向的,通過标簽的切換來改變控制器,一般我們習慣将tabbar作為應用程式的根視圖控制器,在其中添加導航,導航中在對viewcontroller進行管理。
通過如下的步驟,我們可以很簡便的建立一個tabbarcontroller:
<a href="http://my.oschina.net/u/2340880/blog/529970#">?</a>
1
2
3
4
5
6
7
8
9
10
11
12
13
<code>uitabbarcontroller * tabbar= [[uitabbarcontroller alloc]init];</code>
<code> </code><code>nsmutablearray * controllerarray = [[nsmutablearray alloc]init];</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i=0; i<4; i++) {</code>
<code> </code><code>uiviewcontroller * con = [[uiviewcontroller alloc]init];</code>
<code> </code><code>[con loadviewifneeded];</code>
<code> </code><code>con.view.backgroundcolor = [uicolor colorwithred:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];</code>
<code> </code><code>con.tabbaritem.image = [uiimage imagenamed:@</code><code>"btn_publish_face_a.png"</code><code>];</code>
<code> </code><code>con.tabbaritem.title=[nsstring stringwithformat:@</code><code>"%d"</code><code>,i+1];</code>
<code> </code><code>con.title = [nsstring stringwithformat:@</code><code>"%d"</code><code>,i+1];</code>
<code> </code><code>[controllerarray addobject:con];</code>
<code> </code><code>}</code>
<code> </code><code>tabbar.viewcontrollers = controllerarray;</code>
<code> </code><code>[self presentviewcontroller:tabbar animated:yes completion:nil];</code>
通過點選下面的标簽按鈕,可以很友善的切換控制器。如果我們的控制器數超過4個,系統會被我們建立一個more的導航,并且可以通過系統自帶的編輯來調整控制器的順序,如下:
14
15
<code>//管理的viewcontroller數組</code>
<code>@property(nullable, nonatomic,copy) nsarray<__kindof uiviewcontroller *> *viewcontrollers;</code>
<code>- (</code><code>void</code><code>)setviewcontrollers:(nsarray<__kindof uiviewcontroller *> * __nullable)viewcontrollers animated:(</code><code>bool</code><code>)animated;</code>
<code>//選中的viewcontrolle</code>
<code>@property(nullable, nonatomic, assign) __kindof uiviewcontroller *selectedviewcontroller;</code>
<code>//通過編号設定選中viewcontroller</code>
<code>@property(nonatomic) nsuinteger selectedindex;</code>
<code>//當viewcontroller大于4個時,擷取"更多"标簽的導航控制器</code>
<code>@property(nonatomic, readonly) uinavigationcontroller *morenavigationcontroller; </code>
<code>//這個屬性設定的是可以進行自定義排列順序的視圖控制器,如上面第二張圖中的,預設是全部</code>
<code>@property(nullable, nonatomic, copy) nsarray<__kindof uiviewcontroller *> *customizableviewcontrollers;</code>
<code>//标簽控制器中分裝的标簽欄</code>
<code>@property(nonatomic,readonly) uitabbar *tabbar ns_available_ios(3_0);</code>
<code>//代理</code>
<code>@property(nullable, nonatomic,weak) id<uitabbarcontrollerdelegate> delegate;</code>
通過自定義标簽欄的一些屬性,使我們可以更加靈活的使用tabbar。
設定标簽:
<code>@property(nullable,nonatomic,copy) nsarray<uitabbaritem *> *items; </code>
<code>//設定選中的标簽 </code>
<code>@property(nullable,nonatomic,assign) uitabbaritem *selecteditem; </code>
<code>- (</code><code>void</code><code>)setitems:(nullable nsarray<uitabbaritem *> *)items animated:(</code><code>bool</code><code>)animated;</code>
設定自定義标簽順序:
<code>//調用這個方法會彈出一個類似上面第二張截圖的控制器,我們可以交換标簽的布局順序</code>
<code>- (</code><code>void</code><code>)begincustomizingitems:(nsarray<uitabbaritem *> *)items; </code>
<code>//完成标簽布局</code>
<code>- (</code><code>bool</code><code>)endcustomizinganimated:(</code><code>bool</code><code>)animated; </code>
<code>//是否正在自定義标簽布局</code>
<code>- (</code><code>bool</code><code>)iscustomizing;</code>
設定tabbar顔色相關:
<code>//設定渲染顔色,會影響選中字型和圖案的渲染</code>
<code>@property(null_resettable, nonatomic,strong) uicolor *tintcolor;</code>
<code>//設定導航欄的顔色</code>
<code>@property(nullable, nonatomic,strong) uicolor *bartintcolor;</code>
設定背景圖案:
<code>//設定導航欄背景圖案</code>
<code>@property(nullable, nonatomic,strong) uiimage *backgroundimage;</code>
<code>//設定選中一個标簽時,标簽背後的選中提示圖案 這個會出現在設定的item圖案的後面</code>
<code>@property(nullable, nonatomic,strong) uiimage *selectionindicatorimage;</code>
<code>//設定陰影的背景圖案</code>
<code>@property(nullable, nonatomic,strong) uiimage *shadowimage</code>
tabbar中标簽的宏觀屬性:
<code>//設定标簽item的位置模式</code>
<code>@property(nonatomic) uitabbaritempositioning itempositioning;</code>
<code>//枚舉如下</code>
<code>typedef</code> <code>ns_enum(nsinteger, uitabbaritempositioning) {</code>
<code> </code><code>uitabbaritempositioningautomatic,</code><code>//自動</code>
<code> </code><code>uitabbaritempositioningfill,</code><code>//充滿</code>
<code> </code><code>uitabbaritempositioningcentered,</code><code>//中心</code>
<code>} ns_enum_available_ios(7_0);</code>
<code>//設定item寬度</code>
<code>@property(nonatomic) cgfloat itemwidth;</code>
<code>//設定item間距</code>
<code>@property(nonatomic) cgfloat itemspacing;</code>
與導航欄類似,也可以設定tabbar的風格和透明效果:
<code>//風格 分黑白兩種</code>
<code>@property(nonatomic) uibarstyle barstyle;</code>
<code>//是否透明效果</code>
<code>@property(nonatomic,getter=istranslucent) </code><code>bool</code> <code>translucent;</code>
<code>//選中标簽時調用</code>
<code>- (</code><code>void</code><code>)tabbar:(uitabbar *)tabbar didselectitem:(uitabbaritem *)item;</code>
<code>//将要開始編輯标簽時</code>
<code>- (</code><code>void</code><code>)tabbar:(uitabbar *)tabbar willbegincustomizingitems:(nsarray<uitabbaritem *> *)items; </code><code>//已經開始編輯标簽時 </code>
<code>- (</code><code>void</code><code>)tabbar:(uitabbar *)tabbar didbegincustomizingitems:(nsarray<uitabbaritem *> *)items; </code>
<code>//将要進入編輯狀态時</code>
<code>- (</code><code>void</code><code>)tabbar:(uitabbar *)tabbar willendcustomizingitems:(nsarray<uitabbaritem *> *)items changed:(</code><code>bool</code><code>)changed; </code>
<code>//已經進入編輯狀态時</code>
<code>- (</code><code>void</code><code>)tabbar:(uitabbar *)tabbar didendcustomizingitems:(nsarray<uitabbaritem *> *)items changed:(</code><code>bool</code><code>)changed;</code>
和navigationitem類似,标簽欄上的item也可以自定義,一些方法如下。
初始化方法:
<code>//通過标題和圖案進行建立</code>
<code>- (instancetype)initwithtitle:(nullable nsstring *)title image:(nullable uiimage *)image tag:(nsinteger)tag;</code>
<code>- (instancetype)initwithtitle:(nullable nsstring *)title image:(nullable uiimage *)image selectedimage:(nullable uiimage *)selectedimage;</code>
<code>//建立系統類型的</code>
<code>- (instancetype)initwithtabbarsystemitem:(uitabbarsystemitem)systemitem tag:(nsinteger)tag;</code>
uitabbarsystemitem的枚舉如下:
<code>typedef</code> <code>ns_enum(nsinteger, uitabbarsystemitem) {</code>
<code> </code><code>uitabbarsystemitemmore,</code><code>//更多圖示</code>
<code> </code><code>uitabbarsystemitemfavorites,</code><code>//最愛圖示</code>
<code> </code><code>uitabbarsystemitemfeatured,</code><code>//特征圖示</code>
<code> </code><code>uitabbarsystemitemtoprated,</code><code>//進階圖示</code>
<code> </code><code>uitabbarsystemitemrecents,</code><code>//最近圖示</code>
<code> </code><code>uitabbarsystemitemcontacts,</code><code>//聯系人圖示</code>
<code> </code><code>uitabbarsystemitemhistory,</code><code>//曆史圖示</code>
<code> </code><code>uitabbarsystemitembookmarks,</code><code>//圖書圖示</code>
<code> </code><code>uitabbarsystemitemsearch,</code><code>//查找圖示</code>
<code> </code><code>uitabbarsystemitemdownloads,</code><code>//下載下傳圖示</code>
<code> </code><code>uitabbarsystemitemmostrecent,</code><code>//記錄圖示</code>
<code> </code><code>uitabbarsystemitemmostviewed,</code><code>//全部檢視圖示</code>
<code>};</code>
uitabbaritem常用屬性:
<code>//設定選中圖案</code>
<code>@property(nullable, nonatomic,strong) uiimage *selectedimage;</code>
下面這個屬性可以設定item的頭标文字:
<code> </code><code>con.tabbaritem.badgevalue = @</code><code>"1"</code><code>;</code>
<code>//設定标題的位置偏移</code>
<code>@property (nonatomic, readwrite, assign) uioffset titlepositionadjustment;</code>
由于uitabbaritem是繼承于uibaritem,還有下面這個屬性可以設定使用:
<code>//标題</code>
<code>@property(nullable, nonatomic,copy) nsstring *title; </code>
<code>//圖案 </code>
<code>@property(nullable, nonatomic,strong) uiimage *image; </code>
<code>//橫屏時的圖案 </code>
<code>@property(nullable, nonatomic,strong) uiimage *landscapeimagephone;</code>
<code>//圖案位置偏移</code>
<code>@property(nonatomic) uiedgeinsets imageinsets; </code>
<code>//橫屏時的圖案位置偏移</code>
<code>@property(nonatomic) uiedgeinsets landscapeimagephoneinsets ;</code>
<code>//設定和擷取标題的字型屬性</code>
<code>- (</code><code>void</code><code>)settitletextattributes:(nullable nsdictionary<nsstring *,id> *)attributes forstate:(uicontrolstate)state;</code>
<code>- (nullable nsdictionary<nsstring *,id> *)titletextattributesforstate:(uicontrolstate)state;</code>