自定义UITabBar替换系统默认的,目的是为了在UITabBar中间位置添加一个“+号按钮”

1、自定义WBTabBar,让其继承自UITabBar,并定义点击事件代理方法。

.h方法里面

#import <UIKit/UIKit.h>

@class WXReleaseTabBar;

@protocol WXReleaseTabBarDelegate <WXReleaseTabBarDelegate>

@optional

- (void)tabBarDidClickPlusButton:(WXReleaseTabBar *)tabBar;

@end

@interface WXReleaseTabBar : UITabBar

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

@end

.m方法里面

//定义一个按钮

@property (nonatomic, strong) UIButton *plusButton;

然后初始化

- (id)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

UIButton *plusBtn = [[UIButton alloc] init];

[plusBtn setBackgroundImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateNormal];

[plusBtn setBackgroundImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateHighlighted];

[plusBtn setImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateNormal];

[plusBtn setImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateHighlighted];

plusBtn.size = plusBtn.currentBackgroundImage.size;

[plusBtn addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside];

[self addSubview:plusBtn];

self.plusButton = plusBtn;

}

return self;

}

//添加约束

- (void)layoutSubviews

{

[super layoutSubviews];

CGFloat width = self.width;

CGFloat height = self.height;

self.plusButton.center = CGPointMake(width * 0.5, height * 0.5);

CGRect tempRect = self.plusButton.frame;

tempRect.origin.y =  -20;

self.plusButton.frame = tempRect;

int index = 0;

CGFloat tabBarButtonW = width / 5;

CGFloat tabBarButtonH = height;

CGFloat tabBarButtonY = 0;

for (UIView *tabBarButton in self.subviews) {

if (![NSStringFromClass(tabBarButton.class) isEqualToString:@"UITabBarButton"]) continue;

CGFloat tabBarButtonX = index * tabBarButtonW;

if (index >= 2) {

tabBarButtonX += tabBarButtonW;

}

tabBarButton.frame = CGRectMake(tabBarButtonX, tabBarButtonY, tabBarButtonW, tabBarButtonH);

index++;

}

[self bringSubviewToFront:self.plusButton];

}

//重写系统的hitTest方法让处于tabbar外部的按钮部分也可以被点击

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

if (self.isHidden == NO) { // 当前界面 tabBar显示

CGPoint newPoint = [self convertPoint:point toView:self.plusButton];

if ( [self.plusButton pointInside:newPoint withEvent:event]) { // 点 属于按钮范围

return self.plusButton;

}else{

return [super hitTest:point withEvent:event];

}

}else {

return [super hitTest:point withEvent:event];

}

}

//被点击的方法

- (void)plusClick

{

// 通知代理

if ([self.tabBarDelegate respondsToSelector:@selector(tabBarDidClickPlusButton:)]) {

[self.tabBarDelegate tabBarDidClickPlusButton:self];

}

}

2、tabBar是UITabBarController的只读成员变量(属性),是不让修改的,在UITabBarController.m中的操作如下:

@interface WXTabbarViewController ()<UITabBarDelegate>

@end

3、然后在UITabBarController.m初始化里面我们可以使用KVC的方式,更换系统自带的UITabBar,实现代码如下:

xxxTabBar(自定义的tabbar) *tabBar = [[xxxTabBar alloc] init]; 

xxxTabBar.tabBarDelegate= self;
[self setValue:tabBar forKeyPath:@"tabBar"];

4、在UITabBarController.m实现点击的代理方法

- (void)tabBarDidClickPlusButton:(WXReleaseTabBar *)tabBar

{

NSLog(@"发布按钮");

//    ComposeViewController *composeViewController= [[ComposeViewController alloc] init];

//    UINavigationController * navigationController = [[UINavigationController alloc]initWithRootViewController:composeViewController];

//    [self presentViewController:navigationController animated:YES completion:nil];

}

iOS 自定义底部tabbar加号按钮实现方法的更多相关文章

  1. Wepy--小程序自定义底部tabBar

    PS后续: 说来惭愧, 没想到这篇文章浏览的人有点多. 说实话写的挺乱的. 并且自定义tabbar还有闪屏的问题. 因为有好几位道友都问了这个问题,  其中一位因为项目很急,所以就研究了一下(也是借鉴 ...

  2. iOS开发项目之四 [ 调整自定义tabbar的位置与加号按钮的位置]

    自定义tabbar与按钮的添加 01 - 把系统的tabbar用我们自己的覆盖 LHQTabBar *lhqTabBar = [[LHQTabBar alloc]init]; [self setVal ...

  3. iOS自定义tabBar

    在我们的项目中经常会自己自定义tabBar因为苹果自带的真的太丑了!也不满足我们的项目需求. 好 开始行动吧! 先上图看下我们最终实现的效果: 继承UItabBar自定义一个自己的tabBar .h# ...

  4. iOS自定义的UISwitch按钮

    UISwitch开关控件 开关代替了点选框.开关是到目前为止用起来最简单的控件,不过仍然可以作一定程度的定制化. 一.创建 UISwitch* mySwitch = [[ UISwitchalloc] ...

  5. iOS 自定义返回按钮,保留系统滑动返回

    原文链接 自定义返回按钮保留系统滑动返回手势.gif 1.简介 使用苹果手机,最喜欢的就是用它的滑动返回.作为一个开发者,我们在编写很多页面的时候,总是会因为这样那样的原因使得系统的滑动返回不可用.使 ...

  6. 拦截iOS系统导航栏返回按钮事件-三种方法

    方法一:在dealloc里面书写监听事件,因为只有pop才会调用dealloc,push不会掉用 - (void)dealloc {YLLog(@"123"); } 方法二:在- ...

  7. iOS 自定义UINavigationController返回按钮

    主要代码如下: //自定义导航栏返回按钮 self.navigationItem.leftBarButtonItem = ({ //导航栏返回背景视图 UIView *view = [[UIView ...

  8. iOS 自定义NavigationBar右侧按钮rightBarButtonItem

    自定义右侧的一个按钮 UIBarButtonItem *myButton = [[UIBarButtonItem alloc] initWithTitle:@"主页" style: ...

  9. iOS中UI阶段常用的一些方法

    UI 即 UserInterface(用户界面 1.iOS系统版本,每年都有更新.对我们开发者而言,主要的是观察API的变化. 2.iPhone新手机发布,会产生不同尺寸的屏幕,现在市面上有4种尺寸, ...

随机推荐

  1. Consider defining a bean of type 'com.lvjing.dao.DeviceStatusMapper' in your configuration.

    "C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:C:\Program Files\JetBra ...

  2. yamux多路复用的使用例子

    yamux yamux 是一个多路复用库.它依赖于底层可靠有序连接.如TCP. 提供基于流的多路利用 例子如下: Server package main // 多路复用 import ( " ...

  3. Javascript仿贪吃蛇出现Bug的反思

    bug现象:    图一

  4. 执行shell脚本出错'\r': command not found

    在linux中执行脚本时出错 $'\r': command not found 错误原因是在脚本中有空行,如果脚本是在Windows下进行编辑之后上传到linux上去执行的话,就会出现这个问题. 因为 ...

  5. java GMT时间转换为CST时间

    今天在获取windchill的“上次修改时间”的时候发现获取的是GMT时间,但是我们常用的是CST时间 一开始尝试直接设置为CST时区,TimeZone.getTimeZone("CST&q ...

  6. flask 数据库迁移的简单操作

    1.目的:修改现有数据库的表结构,不改变数据库中现有的数据. 2.导包:from flask_migrate import Migrate, MigrateCommandfrom flask_scri ...

  7. JAVA第九次作业

    JAVA第九次作业 (一)学习总结 1.用思维导图对javaIO操作的学习内容进行总结. 参考资料: XMind. 2.下面的程序实现了文件的拷贝,但采用的是一个字节一个字节的读写方式,效率很低.使用 ...

  8. fdsafdsafds

    name1 = input('请输入一个名字:') name2 = input('请输入一个名字: ') animal = input('请输入一个名字 :') print('刚按完摩的{}出门看见{ ...

  9. 云服务器 ECS > 建站教程 > 部署 LAMP (CentOS 7.2 ,Apache版本:2.4.23, Mysql 版本:5.7.17 , Php版本:7.0.12)

    云服务器 ECS > 建站教程 > 部署 LAMP (CentOS 7.2) 部署 LAMP (CentOS 7.2) 文档提供方:上海驻云信息科技有限公司    更新时间:2017-06 ...

  10. 一个权重的物体拷贝权重给多个(oneWeightToMany)

    你是否在做项目的时候经常会遇见一个物体带权重需要拷贝给其他物体,这时候其他物体多的数不胜数 你怎么办呢? 举例:假如一头狮子 身体你已经做好了,但是模型师把半个身体都做满了垂落的实体模型毛发,你是否感 ...