亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS應用開發中UITabBarController標簽欄控制器使用進階

2020-07-26 03:26:12
字體:
來源:轉載
供稿:網友

做了這么長時間的ios開發了,最基本的UITabBarController和UINavigationController都用了好長時間了,總是改現成的代碼,或者各種自定義控件的修改,用的都有些混亂了,呵呵。還是自己做個demo再復習一下吧,記錄下來以備后續翻查。
一、UITabBarController和UINavigationController的聯合使用

這種方法最常見,好像一般有tabbar都會有naviBar。一般使用,

1. 在appDelegate里面創建UITabBarController; 準備好ViewControllerArray等其它數據變量;
[/code]
UITabBarController *tabBarController = [[UITabBarController alloc] init]; 
    tabBarController.delegate = nil;

UINavigationController *naviController = nil; 
    NSMutableArray *controllerArray = [[NSMutableArray alloc] initWithCapacity:3];
[/code]

2.創建每個tab對應的viewController和以該viewController為根視圖控制器的UINavigationController; 將naviController添加到數組中; 定制每個UITabBarItem,可以設置圖片、文字、標記等;

如下:tab1和tab3的創建類似 

復制代碼 代碼如下:

SecondTabViewController *secondController = [[SecondTabViewController alloc] initWithStyle:UITableViewStylePlain]; 
    naviController = [[UINavigationController alloc] initWithRootViewController:secondController]; 
    //    UITabBarItem *secondTab = [[UITabBarItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"tab2.png"] tag:2]; 
    UITabBarItem *secondTab = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:2]; 
    naviController.tabBarItem = secondTab; 
    secondController.navigationItem.title = @"second tab"; 
    [secondTab release]; 
    [controllerArray addObject:naviController]; 
    [naviController release]; 
    [secondController release];</span> 

3. 將viewController數組設置給tabBarController,tabBarController添加到窗口顯示。

復制代碼 代碼如下:

tabBarController.viewControllers = controllerArray; 
    [controllerArray release]; 
     
    [self.window addSubview:tabBarController.view];

完成,顯示效果如下。

201631292645938.gif (336×506)

4. UITabBarController和naviController不是一定綁定在一起用的。

復制代碼 代碼如下:

naviController.tabBarItem = secondTab;

 從上面這句話就可以看出來,我理解這句才是將tab和viewController連接起來的關鍵,但是每個UIViewController本身都會自動創建一個tabBarItem,因此secondController.tabBarItem = secondTab也是可以的,這就可以實現只有UITabBarController,而沒有naviController。如下圖所示

201631292706814.gif (329×506)

UITabBarController.h中的相關定義,可以驗證這種用法。

復制代碼 代碼如下:

@interface UIViewController (UITabBarControllerItem) 
 
@property(nonatomic,retain) UITabBarItem *tabBarItem; // Automatically created lazily with the view controller's title if it's not set explicitly. 

二、UITabBar和UITabBarItem的一些設置。

  設置UITabBar的背景,網上流傳最多的方法是取出UITabBar之后,對其layer層的contents屬性進行修改,將其設置為自定義的一張背景圖片,如下面注視掉的代碼。不過看了頭文件之后我覺得這種方法好像挺奇怪的,雖然也沒幾句代碼,不過感覺不用這么復雜吧??取出UITabBar之后直接設置backgroundImage不就行了么?或許有潛在問題我不知道吧,先了解有這種方法吧,以備不時之需。

復制代碼 代碼如下:

UITabBar *tabBar = (UITabBar*)[[tabBarController.view subviews] objectAtIndex:1]; 
    //tabBar.layer.contents = (id)[UIImage imageNamed:@"tabbar_background.png"].CGImage; 
    tabBar.backgroundImage = [UIImage imageNamed:@"tabbar_background.png"];


UITabBarItem有兩種初始化方式,本代碼中使用的是設置系統tab類型,另一種更常用的應該是定制tab標題和圖片,如上注釋掉的語句。

復制代碼 代碼如下:

//UITabBarItem *secondTab = [[UITabBarItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"tab2.png"] tag:2]; 
    UITabBarItem *secondTab = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:2];

可以通過下面的函數設置選中、未選中的圖片; 字符串badgeValue是可以在tab右上角的紅色小圓圈內的文字內容
復制代碼 代碼如下:

<span style="font-size:16px;">    [firstTab setFinishedSelectedImage:[UIImage imageNamed:@"tab1_selected.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"tab1.png"]]; 
    firstTab.badgeValue = @"3";

201631292725543.gif (323×55)

這幾個控件的屬性不多,還有可以UITabBar選中的圖片、顏色等等,通過頭文件注釋看到的,沒有實際使用,大概使用方法都差不多。


三、自定義UITabBar

實際工作中,還是用純粹的自定義TabBar的情況更多,在此先寫寫思路,整理好代碼再來記錄。

第一種思路,也是我現在使用的,自定義TabBar繼承UIView,每個tab是一個button,從而可以設置選中/未選中的圖片,將button都添加到TabBar里面,button的點擊事件就可以作為tab是否被選中的觸發事件,通過delegate通知外面到底選中了哪個tab。

第二種思路,既然UITabBar本身就是UIView的子類,應該可以重寫drawRect函數完全自繪吧,這也是一種思路,好像一些開源代碼也是這樣做的。


還有一些情況,可能使用UIToolBar來代替TabBar更合適,toolBar可以設置自定義的view,那就好辦了,估計搞個UIActivityIndicatorView之類的設置上去都行,下一步要看看這塊的文檔和代碼,嘗試一下,寫了demo再來記錄。


四、總結UITabBarController的注意點
使用UITabBarController和使用一般的控制器一樣,比如可以設置

復制代碼 代碼如下:

self.window.rootViewController = tabBarController;

使用addChildViewController方法可以給其添加子控制器。每個子控制器對應一個UITabBarButton,也就是在UITabBarController下面的選項。此時如果想要改變UITabBarButton的內容,比如想要設置title, image等內容,需要在其對應的子控制器里面通過修改tabBarItem的屬性來設置內容。
復制代碼 代碼如下:

// JYViewController.m -> 是UITabBarController的子控制器
- (void)viewDidLoad
{
    [super viewDidLoad];

      self.tabBarItem.title = @"選項1";
      self.tabBarItem.badgeValue = @"1";
}


這一點和UINavigationController是類似的,在使用UINavigationController的時候,我們在當前顯示的控制器(也就是棧頂的控制器)中通過修改navigationItem來設置導航欄中的內容。
self.navigationItem.leftBarButtonItem = ...;
也就是說,使用UINavigationController和UITabBarController的時候:
在其對應的控制器里面修改導航欄和tabBar的內容。
通過修改tabBarItem和__navigationItem__的屬性來設置導航欄和tabBar的內容。其實tabBarItem和navigationItem屬于模型(從NSObject繼承,以...Item結尾的可以都推測為模型?),此時我們通過修改模型來修改view中顯示的內容。
當UINavigationController和UITabBarController同時使用的時候,如果讓navigationController作為self.window.rootViewController,然后再讓tabBarController成為navigationController的子控制器,這么做是合法的,但是會有一些問題。
因為前面說過,navigationBar上顯示的內容是通過在其當前顯示的子控制器中修改的,但是此時navigationController直接顯示的子控制器是tabBarController,所以當進入不同的界面的時候,我們希望navigationBar上的內容(比如title)改變,但是此時是做不到的,因為我們無法在UITabBarController中修改navigationBar的內容。
所以一般來說我們會讓tabBarController作為根控制器,如果其他自定義的子控制器需要navigationController,那么就讓每個自定義的控制器對應的navigationController作為tabBarController的子控制器,然后讓自定義的控制器作為navigationController的子類。這樣就可以在自定義控制器中修改navigationController的navigationBar顯示內容。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品揄拍500视频| 亚洲欧洲在线免费| 精品免费在线观看| 久久久成人的性感天堂| 91中文在线观看| 日韩欧中文字幕| 日韩在线一区二区三区免费视频| 欧美一级视频在线观看| 久久视频在线直播| 国产精品色悠悠| 久久夜色精品亚洲噜噜国产mv| 欧美亚洲国产精品| 日韩女优在线播放| 亚洲精品免费在线视频| 黄色精品一区二区| 日韩毛片中文字幕| 亚洲天天在线日亚洲洲精| 久久久影视精品| 国产免费一区二区三区在线能观看| 美女视频黄免费的亚洲男人天堂| 欧美一级电影免费在线观看| 国产成人久久精品| 国产欧美中文字幕| 第一福利永久视频精品| 日韩精品福利网站| 亚洲欧美福利视频| 欧美影院久久久| 亚洲欧美日韩网| 日韩av一区二区在线观看| 亚洲国产精品久久久久秋霞不卡| 亚洲激情在线观看视频免费| 久久天天躁夜夜躁狠狠躁2022| 欧美第一页在线| 国产精品国产三级国产aⅴ9色| 国产91精品久久久久| 欧美成人免费网| 欧美视频一区二区三区…| 高清在线视频日韩欧美| 亚洲美女av网站| 亚洲精品电影在线| 欧美国产欧美亚洲国产日韩mv天天看完整| 成人在线视频网| 欧美中文字幕第一页| 亚洲精品福利免费在线观看| 黄色精品在线看| 最新91在线视频| 亚洲综合中文字幕在线| 欧美怡红院视频一区二区三区| 97在线日本国产| 精品亚洲aⅴ在线观看| 久热爱精品视频线路一| 亚洲人成电影网站| 久久精品亚洲热| 国产日韩欧美在线视频观看| 精品国偷自产在线视频| 欧美一级成年大片在线观看| 亚洲片在线观看| 中文字幕欧美视频在线| 精品国产福利在线| 日韩第一页在线| 国产精品久久中文| 日韩中文字幕在线免费观看| 欧美小视频在线观看| 日韩福利视频在线观看| 中文字幕亚洲欧美日韩在线不卡| 欧美有码在线观看视频| 日韩欧美在线一区| 午夜免费在线观看精品视频| 91手机视频在线观看| 久久久女人电视剧免费播放下载| 亚洲免费视频一区二区| 亚洲japanese制服美女| 国产69精品99久久久久久宅男| 日韩中文在线视频| 欧美日韩国产一中文字不卡| 国产成人91久久精品| 久久精品国产91精品亚洲| 国产精品福利无圣光在线一区| 91国内揄拍国内精品对白| 欧美成aaa人片在线观看蜜臀| 性色av一区二区三区| 久久久久久久久国产精品| 国产精品久久电影观看| 国产日本欧美一区二区三区在线| 高清一区二区三区四区五区| 日韩欧美在线免费| 亚洲国产美女精品久久久久∴| 在线播放国产一区二区三区| 亚洲欧美国产视频| 精品中文字幕在线| 日韩电影中文 亚洲精品乱码| 中文字幕亚洲国产| 最新中文字幕亚洲| 国产精品视频yy9099| 久久69精品久久久久久久电影好| 日本不卡免费高清视频| 久久久人成影片一区二区三区观看| 亚洲国产另类 国产精品国产免费| 九色精品美女在线| 综合网日日天干夜夜久久| 亚洲精品欧美日韩专区| 精品久久国产精品| 日韩电影中文字幕在线| 日韩欧美在线字幕| 国产精品一二三视频| 精品爽片免费看久久| 国产成一区二区| 97精品在线观看| 国产精品成人免费电影| 日本伊人精品一区二区三区介绍| 4388成人网| 国语自产精品视频在线看一大j8| 国产午夜精品视频免费不卡69堂| 91精品综合久久久久久五月天| 亚洲国产一区二区三区四区| 青草热久免费精品视频| 亚洲成人精品久久久| 不卡在线观看电视剧完整版| 91精品一区二区| 色婷婷久久一区二区| 久久99精品久久久久久琪琪| 精品成人乱色一区二区| 欧美性xxxx极品hd满灌| 久久久久久久久久久免费精品| 午夜精品久久久久久久久久久久| 欧美激情小视频| 国产精品久久久久7777婷婷| 国产精品一区=区| 亚洲色图第三页| 日韩中文字幕第一页| 伊人男人综合视频网| 在线观看国产精品日韩av| 亚洲人av在线影院| 国产亚洲精品激情久久| 欧美在线视频一二三| 成年人精品视频| 日韩一区二区福利| 中文字幕日韩在线观看| 精品国内产的精品视频在线观看| 日韩欧美亚洲范冰冰与中字| 欧美日韩性视频在线| 日韩中文字幕在线精品| 亚洲精品mp4| 成人xxxx视频| 高清亚洲成在人网站天堂| 亚洲第一中文字幕在线观看| 久久久久久久久中文字幕| 欧美性在线观看| 热久久免费视频精品| 色综合91久久精品中文字幕| 国产亚洲欧美另类中文| 91在线高清视频| 日韩精品在线观看一区二区| 另类图片亚洲另类| 欧美一级大片在线免费观看| 欧美久久精品一级黑人c片| 亚洲毛片在线观看| 国产成人亚洲综合91| 成人h视频在线| 一本色道久久88综合日韩精品| 2019中文字幕免费视频| 欧美性猛交视频| 俺去了亚洲欧美日韩| 亚洲精品白浆高清久久久久久|