iOS之自定义UITabBar替换系统默认的(添加“+”号按钮)

自定义UITabBar替换系统默认的,目的是为了在UITabBar中间位置添加一个“+号按钮”,下面我们来聊聊具体的实现。

1、自定义WBTabBar,让其继承自UITabBar,代码如下:

//
//  WBTabBar.h
//  SinaWeibo
//
//  Created by android_ls on 15/5/21.
//  Copyright (c) 2015年 android_ls. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface WBTabBar : UITabBar

@end

2、tabBar是UITabBarController的只读成员变量(属性),是不让修改的,在UITabBarController.h文件中的声明如下:

@property(nonatomic,readonly) UITabBar *tabBar NS_AVAILABLE_IOS(3_0);

针对于这种情况,我们可以使用KVC的方式,更换系统自带的UITabBar,实现代码如下:

    WBTabBar *tabBar = [[WBTabBar alloc] init];
    [self setValue:tabBar forKeyPath:@"tabBar"];

3、添加一个UIButton到WBTabBar中,实现代码如下:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // 添加一个按钮到tabbar中
        UIButton *plusBtn = [[UIButton alloc] init];
        [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal];
        [plusBtn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted];
        [plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_background_icon_add"] forState:UIControlStateNormal];
        [plusBtn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add_highlighted"] forState:UIControlStateHighlighted];
        plusBtn.size = plusBtn.currentBackgroundImage.size;
        [plusBtn addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:plusBtn];
        self.plusBtn = plusBtn;
    }
    return self;
}

4、设置加号按钮的位置,调整WBTabBar中各个UITabBarButton的位置和宽度,具体实现代码如下:

- (void)layoutSubviews
{
    [super layoutSubviews];

    // 1.设置加号按钮的位置
    self.plusBtn.centerX = self.width * 0.5;
    self.plusBtn.centerY = self.height * 0.5;

    // 2.设置其它UITabBarButton的位置和尺寸
    CGFloat tabbarButtonW = self.width / 5;
    CGFloat tabbarButtonIndex = 0;
    for (UIView *child in self.subviews) {
        Class class = NSClassFromString(@"UITabBarButton");
        if ([child isKindOfClass:class]) {
            // 设置宽度
            child.width = tabbarButtonW;
            // 设置x
            child.x = tabbarButtonIndex * tabbarButtonW;

            // 增加索引
            tabbarButtonIndex++;
            if (tabbarButtonIndex == 2) {
                tabbarButtonIndex++;
            }
        }
    }
}

5、定义WBTabBarDelegate协议,声明WBTabBar的代理,代码如下:

//
//  WBTabBar.h
//  SinaWeibo
//
//  Created by android_ls on 15/5/21.
//  Copyright (c) 2015年 android_ls. All rights reserved.
//

#import <UIKit/UIKit.h>

#pragma mark 因为在UITabBar中已经声明过一个UITabBarDelegate协议,
#pragma mark 我们若想新增一个对外的代理函数,可以让我们自定义的协议继承自UITabBarDelegate,添加一个扩展函数。

@class WBTabBar;

@protocol WBTabBarDelegate <UITabBarDelegate>

@optional
- (void)tabBarDidClickPlusButton:(WBTabBar *)tabBar;

@end

@interface WBTabBar : UITabBar

@property (nonatomic, weak) id<WBTabBarDelegate> tabBarDelegate;

@end

6、在加号按钮的点击事件处理器中,通知代理

#pragma mark 加号按钮点击事件处理器
- (void)plusClick
{
    // 通知代理
    if ([self.tabBarDelegate respondsToSelector:@selector(tabBarDidClickPlusButton:)]) {
        [self.tabBarDelegate tabBarDidClickPlusButton:self];
    }
}

7、在WBTabBarController中设置WBTabBar的代理,具体实现如下:

 // 2、使用KVC的方式,更换系统自带的UITabBar
    WBTabBar *tabBar = [[WBTabBar alloc] init];
    tabBar.tabBarDelegate = self;
    [self setValue:tabBar forKeyPath:@"tabBar"];
#pragma mark - HWTabBarDelegate代理方法
- (void)tabBarDidClickPlusButton:(WBTabBar *)tabBar
{
    ComposeViewController *composeViewController= [[ComposeViewController alloc] init];
    UINavigationController * navigationController = [[UINavigationController alloc]initWithRootViewController:composeViewController];
    [self presentViewController:navigationController animated:YES completion:nil];
}
时间: 2024-10-12 23:41:57

iOS之自定义UITabBar替换系统默认的(添加“+”号按钮)的相关文章

仿新浪微博IOS客户端(v5.2.8)——自定义UITabBar替换系统默认的(添加“+”号按钮)

转载请标明出处:http://blog.csdn.net/android_ls/article/details/45896395 声明:仿新浪微博项目,所用所有图片资源都来源于官方新浪微博IOS客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片. 自定义UITabBar替换系统默认的,目的是为了在UITabBar中间位置添加一个"+号按钮",下面我们来聊聊具体的实现. 1.自定义WBTabBar,让其继承自UITabBar,代码如下: // // WBT

JS替换系统默认对话框,仿IOS风格

Alert alert("这个是一个alert弹窗"); Alert 自定义参数 alert({ content: "自定义alert弹窗", btnText: "OK", boxClass: "custom-alert" }, function () { console.log("good!"); }); Confirm confirm("这个是一个confirm弹窗", functi

iOS日历相关操作--读取系统日历、添加事件到系统日历

1 读取系统日历 let eventStore = EKEventStore() let tempFormatter = NSDateFormatter() tempFormatter.dateFormat = "dd.MM.yyyy HH:mm" //获取一个时间段中的日历事件 let startDate = tempFormatter.dateFromString("10.08.2016 15:10")! let endDate = tempFormatter.

django 自定义用户表替换系统默认表

首先新建一个users应用,编写这个应用的models类. from django.contrib.auth.models import AbstractUser class UserProfile(AbstractUser): ...... 然后在settings里面加入应用. 最后重载用户model,如下: AUTH_USER_MODEL = "users.UserProfile" 最最后:makemigrations和migrate  根据提示输入YES,删除系统USER表,新建

[RK3288][Android6.0] 调试笔记 --- 替换系统签名【转】

本文转载自:http://blog.csdn.net/kris_fei/article/details/55100299 Platform: RK3288OS: Android 6.0Kernel: 3.10.92 由于项目的apk安装需要shareid为system的权限(不需要高权限的apk是可以正常安装的),一开始我用的是releasekey,导致签名文件不匹配无法安装,因此就替换系统默认platform签名文件. 生成新的签名文件方法参考rk3288/build/target/produ

UITabbar上的item自定义背景色和图片,push之后再pop回去会变成系统默认颜色-蓝色

在iOS8系统下,UITabbar上的item自定义背景色和图片,push之后再pop回去会变成系统默认颜色-蓝色,本来设置的是绿色的:而且程序首次启动时也是系统默认的蓝色 UIImage *image=[UIImage imageNamed:@"xxxx"]; //设置选中时的图标 UIImage *selectedImage=[UIImage imageNamed: @"xxxx"]; // 声明这张图片用原图(别渲染) selectedImage = [sel

iOS开发项目篇—27自定义UITabBar

iOS开发项目篇—27自定义UITabBar 一.自定义 思路: (1)新建一个继承自UITabBar的类,自定义一个UITabBar (2)用自定义的UITabBar换掉系统的UItabBar(使用了KVC) (3)监听控制器的切换,只要控制器一切换,就调用代理方法强制重新布局子控件(内部会调用layoutSubviews). YYTabBar.m文件代码: 1 // 2 // YYTabBar.m 3 // 4 5 #import "YYTabBar.h" 6 7 @interfa

iOS自定义键盘和系统键盘切换且文本输入框一直获得焦点

UITextView用来进行文本输入.方法becomeFirstResponder和resignFirstResponder可以用来进行弹出系统键盘和收下系统键盘. 弹出系统键盘,文本输入框获得焦点.收下系统键盘,文本输入框失去焦点.那么,问题来了. 某个条件下,如点击界面上的某个按钮,展示自定义键盘.再次点击,切换到系统键盘.先收下系统键盘,再展示自定义键盘.比如移动自定义键盘View的Frame.Y.但这时因为收下系统键盘,本文输入框失去焦点.虽然展示了自定义键盘.但用户体验很不好.光标没有

大叔手记(1):使用VisualStudio的查找与替换替代默认的系统搜索(转载)

大叔手记(1):使用VisualStudio的查找与替换替代默认的系统搜索 一直以来,一直使用Visual Studio的查找与替换(Find and Replace)来搜索当前项目或整个解决方案里的代码,从来没怎么注意右边的那个选择文件夹功能. 原来还可以选择非解决方案的文件夹,而且试用了一下,速度明显比默认的系统搜索功能快,尤其是在阅读.NET4.0源码的时候,效果真是高啊. 大叔手记:旨在记录日常工作中的各种小技巧与资料(包括但不限于技术) 原文链接 本文由豆约翰博客备份专家远程一键发布