中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

UIkit框架(14)自定義標簽控制器-創新互聯

  • 自定義UITabBarController子類

    創新互聯是一家專業提供臨夏企業網站建設,專注與網站制作、做網站、H5技術、小程序制作等業務。10年已為臨夏眾多企業、政府機構等服務。創新互聯專業網站制作公司優惠進行中。

UITabBarController的tabBar往往不能滿足我們的需求

通過自定義UITabBarController子類自定義標簽欄是經常采用的方式。

基本步驟:

  1)定義UIButton子類作為標簽按鈕

    2)定義模型類,管理每個頁面的控制器以及對應標簽欄上的數據

    3)自定義標簽欄

    4)定義UITabBarController子類

  • 定義標簽按鈕

添加兩種創建方法:只顯示圖片和文字圖片都顯示的

+ (AMTabBarButton *)tabBarButtonWithTitle:(NSString *)title normalImage:(UIImage *)normalImage selectedImage:(UIImage *)selectedImage
{
    AMTabBarButton * btn = [AMTabBarButton buttonWithType:UIButtonTypeCustom];
    [btn setImage:normalImage forState:UIControlStateNormal];
    [btn setImage:selectedImage forState:UIControlStateSelected];
    [btn setTitle:title forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor orangeColor] forState:UIControlStateSelected];
    btn.titleLabel.font = [UIFont systemFontOfSize:10];
    btn.titleLabel.textAlignment = NSTextAlignmentCenter;
    return btn;
}
+ (AMTabBarButton *)tabBarButtonWithNormalImage:(UIImage *)normalImage selectedImage:(UIImage *)selectedImage
{
    AMTabBarButton * btn = [AMTabBarButton buttonWithType:UIButtonTypeCustom];
    [btn setImage:normalImage forState:UIControlStateNormal];
    [btn setImage:selectedImage forState:UIControlStateSelected];
    [btn setTitle:nil forState:UIControlStateNormal];
    return btn;
}

修改按鈕內部label和p_w_picpathView的位置,重寫以下方法即可

- (CGRect)titleRectForContentRect:(CGRect)contentRect
- (CGRect)p_w_picpathRectForContentRect:(CGRect)contentRect

如:

- (CGRect)p_w_picpathRectForContentRect:(CGRect)contentRect
{
    CGFloat x, y, w, h;
  
    if ( [self titleForState:UIControlStateNormal] == nil ) {
        w = h = contentRect.size.height*0.8;
    }
    else {
        w = h = contentRect.size.height*0.45;
    }
    x = contentRect.size.width/2 - w/2;
    y = contentRect.size.height*0.1;
    return CGRectMake(x, y, w, h);
}

- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
    CGFloat x, y, w, h;
    if ( [self titleForState:UIControlStateNormal] == nil ) {
        return CGRectZero;
    }
    h = contentRect.size.height*0.25;
    w = contentRect.size.width*0.6;
    x = contentRect.size.width*0.2;
    y = contentRect.size.height*0.65;
    return CGRectMake(x, y, w, h);
}

取消按鈕點擊時的高亮效果:重寫highlighted屬性的setter方法

- (void)setHighlighted:(BOOL)highlighted {    
}

  • 定義模型類

管理每個子控制器及標簽欄上按鈕的數據

@interface AMTabBarItemModel : NSObject

@property (nonatomic, copy) UIImage * normalImage;

@property (nonatomic, copy) UIImage * selectedImage;

@property (nonatomic, copy) NSString * title;

@property (nonatomic, strong) UIViewController * viewController;

+ (instancetype) tabBarItemModelWithNormalImage:(UIImage*) normalImage selectedImage:(UIImage*) selectedImage title:(NSString*) title viewController:(UIViewController*) viewController;

@end

  • 定義標簽欄

定義一個UIView的子類作為自定義的標簽類

設置樣式屬性,兩種樣式:只有圖片和文字圖片都有的

typedef enum {
    AMTabBarStyleTitleAndImage,
    AMTabBarStyleImageOnly
}AMTabBarStyle;

創建方法:

+ (instancetype)tabBarViewWithItemModels:(NSArray *)models tabBarStyle:(AMTabBarStyle)tabBarStyle
{
    return [[self alloc] initWithItemModels:models tabBarStyle:tabBarStyle];
}
- (instancetype) initWithItemModels:(NSArray*) models tabBarStyle:(AMTabBarStyle) tabBarStyle
{
    if ( self = [super init] ) {
        self.tabBarStyle = tabBarStyle;
        int i = 1;
        for ( AMTabBarItemModel * model in models ) {
            AMTabBarButton * btn;
            if ( tabBarStyle == AMTabBarStyleTitleAndImage ) {
                btn = [AMTabBarButton tabBarButtonWithTitle:model.title normalImage:model.normalImage selectedImage:model.selectedImage];
            }
            else {
                btn = [AMTabBarButton tabBarButtonWithNormalImage:model.normalImage selectedImage:model.selectedImage];
            }
            
            [self addSubview:btn];
            
            [btn addTarget:self action:@selector(itemBtnClicked:) forControlEvents:UIControlEventTouchDown];
            btn.tag = i;
            i++;
        }
        self.selectedBtn = self.subviews[0];
    }
    return self;
}
- (void)layoutSubviews
{
    [super layoutSubviews];
    
    CGFloat x, y, w, h;
    h = self.frame.size.height;
    w = self.frame.size.width/self.subviews.count;
    y = x = 0;
    
    for ( AMTabBarButton * btn in self.subviews ) {
        btn.frame = CGRectMake(x, y, w, h);
        x += w;
    }
}

   參數items:模型對象數組

當標簽按鈕被點擊時發送代理方法:

- (void) itemBtnClicked:(AMTabBarButton*) sender
{
    self.selectedBtn = sender;
    if ( self.delegate && [self.delegate respondsToSelector:@selector(tabBarView:selectedIndex:)]) {
        [self.delegate tabBarView:self selectedIndex:sender.tag];
    }
}
- (void) setSelectedBtn:(AMTabBarButton *)selectedBtn
{
    if ( _selectedBtn != selectedBtn ) {
        if ( _selectedBtn != nil ) {
            _selectedBtn.selected = NO;
        }
        _selectedBtn = selectedBtn;
        _selectedBtn.selected = YES;
    }
}

    其中selectBtn屬性表示當前被選擇的按鈕

  • 定義UITabBarController子類

添加屬性:樣式、標簽欄、模型數組

@property (nonatomic, assign) AMTabBarStyle tabBarStyle;
@property (nonatomic, weak) AMTabBarView * myTabBar;
@property (nonatomic, strong) NSArray * items;

添加創建控制器子類的方法:

+ (instancetype)tabBarControllerWithItems:(NSArray *)items tabBarStyle:(AMTabBarStyle)tabBarStyle
{
    AMTabBarController * tabBarController = [[UIStoryboard storyboardWithName:@"AMTabBarController" bundle:nil] instantiateInitialViewController];
    
    tabBarController.items = items;
    tabBarController.tabBarStyle = tabBarStyle;
    
    NSMutableArray * arr = [NSMutableArray array];
    
    for ( AMTabBarItemModel * model in items ) {
        [arr addObject:model.viewController];
        model.viewController = nil;
    }
    tabBarController.viewControllers = [arr copy];
    
    return tabBarController;
}

創建自定義的標簽欄,添加到tabBar視圖上

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    [self setupTabBar];
}
- (void) setupTabBar
{
    AMTabBarView * myTabBar = [AMTabBarView tabBarViewWithItemModels:self.items tabBarStyle:self.tabBarStyle];
    
    self.myTabBar = myTabBar;
    
    [self.tabBar addSubview:self.myTabBar];
    self.myTabBar.delegate = self;
}
- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    
    self.myTabBar.frame = self.tabBar.bounds;
}

實現自定義標簽欄的代理方法,切換頁面

- (void)tabBarView:(AMTabBarView *)tabBarView selectedIndex:(NSInteger)index
{
    self.selectedIndex = index-1;
}

另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

名稱欄目:UIkit框架(14)自定義標簽控制器-創新互聯
文章起源:http://m.2m8n56k.cn/article22/cceejc.html

成都網站建設公司_創新互聯,為您提供電子商務動態網站網站改版靜態網站標簽優化外貿網站建設

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 一个人的视频日本免费 | 国产精品一区二区手机在线观看 | 九九九九九九精品免费 | 91国内精品久久久久免费影院 | 97精品福利视频在线 | 欧美在线做爰高清视频 | 免费观看一级成人毛片软件 | 成年免费网站 | 九九精品免视看国产成人 | 日本午夜vr影院新入口 | 国产日比视频 | 日本欧美一区二区三区不卡视频 | 久久一区二区三区99 | 亚洲成av人片在线观看无码 | 成人三级在线观看 | 亚洲综合第一页 | 91久久精品国产亚洲 | 一本本久综合久久爱 | 国产真实一区二区三区 | 播播网手机在线播放 | 91久久国产 | 经典日韩 | 欧美日韩精品一区二区三区视频在线 | 免费特黄一级欧美大片在线看 | 久久国产精品二区99 | 亚洲欧美激情精品一区二区 | 美女视频免费黄 | 天堂va欧美ⅴa亚洲va一国产 | 香港一级特黄高清免费 | 国产亚洲精品激情一区二区三区 | 国产成人一区二区三区在线播放 | 国产91精选在线观看网站 | 欧美99| 97精品国产手机 | 亚洲人在线 | 国产在线一区二区三区四区 | 天堂资源8中文最新版在线 天堂最新版 | 一级毛片真人不卡免费播 | 欧美一级特黄一片免费 | 国产精品黄色 | 欧美另类极品 |