天天看點

iOS開發中标簽控制器的使用——UITabBarController

        與導航控制器相類似,标簽控制器也是用于管理視圖控制器的一個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&lt;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>

iOS開發中标簽控制器的使用——UITabBarController

通過點選下面的标簽按鈕,可以很友善的切換控制器。如果我們的控制器數超過4個,系統會被我們建立一個more的導航,并且可以通過系統自帶的編輯來調整控制器的順序,如下:

iOS開發中标簽控制器的使用——UITabBarController

14

15

<code>//管理的viewcontroller數組</code>

<code>@property(nullable, nonatomic,copy) nsarray&lt;__kindof uiviewcontroller *&gt; *viewcontrollers;</code>

<code>- (</code><code>void</code><code>)setviewcontrollers:(nsarray&lt;__kindof uiviewcontroller *&gt; * __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&lt;__kindof uiviewcontroller *&gt; *customizableviewcontrollers;</code>

<code>//标簽控制器中分裝的标簽欄</code>

<code>@property(nonatomic,readonly) uitabbar *tabbar ns_available_ios(3_0);</code>

<code>//代理</code>

<code>@property(nullable, nonatomic,weak) id&lt;uitabbarcontrollerdelegate&gt; delegate;</code>

        通過自定義标簽欄的一些屬性,使我們可以更加靈活的使用tabbar。

設定标簽:

<code>@property(nullable,nonatomic,copy) nsarray&lt;uitabbaritem *&gt; *items;  </code>

<code>//設定選中的标簽    </code>

<code>@property(nullable,nonatomic,assign) uitabbaritem *selecteditem; </code>

<code>- (</code><code>void</code><code>)setitems:(nullable nsarray&lt;uitabbaritem *&gt; *)items animated:(</code><code>bool</code><code>)animated;</code>

設定自定義标簽順序:

<code>//調用這個方法會彈出一個類似上面第二張截圖的控制器,我們可以交換标簽的布局順序</code>

<code>- (</code><code>void</code><code>)begincustomizingitems:(nsarray&lt;uitabbaritem *&gt; *)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&lt;uitabbaritem *&gt; *)items;          </code><code>//已經開始編輯标簽時         </code>

<code>- (</code><code>void</code><code>)tabbar:(uitabbar *)tabbar didbegincustomizingitems:(nsarray&lt;uitabbaritem *&gt; *)items;           </code>

<code>//将要進入編輯狀态時</code>

<code>- (</code><code>void</code><code>)tabbar:(uitabbar *)tabbar willendcustomizingitems:(nsarray&lt;uitabbaritem *&gt; *)items changed:(</code><code>bool</code><code>)changed; </code>

<code>//已經進入編輯狀态時</code>

<code>- (</code><code>void</code><code>)tabbar:(uitabbar *)tabbar didendcustomizingitems:(nsarray&lt;uitabbaritem *&gt; *)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>

iOS開發中标簽控制器的使用——UITabBarController

<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&lt;nsstring *,id&gt; *)attributes forstate:(uicontrolstate)state;</code>

<code>- (nullable nsdictionary&lt;nsstring *,id&gt; *)titletextattributesforstate:(uicontrolstate)state;</code>

繼續閱讀