iOS自定义UITabBar中间按钮

iOS自定义UITabBar中间按钮的具体代码,供大家参考,具体内容如下

自定义YLTbaBar继承自UITabBar

git地址

YLTbaBar.h

//
// YLTabBar.h
// 自定义tabbar
//
// Created by nyl on 2018/10/15.
// Copyright © 2018年 nieyinlong. All rights reserved.
//

#import <UIKit/UIKit.h>
//tab页面个数
typedef NS_ENUM(NSInteger, kTbaBarItemUIType) {
 kTbaBarItemUIType_Three = 3,//底部3个选项
 kTbaBarItemUIType_Five = 5,//底部5个选项
};

@class YLTabBar;

@protocol YLTabBarDelegate <NSObject>

-(void)tabBar:(YLTabBar *)tabBar clickCenterButton:(UIButton *)sender;

@end

@interface YLTabBar : UITabBar

@property (nonatomic, weak) id<YLTabBarDelegate> tabDelegate;
@property (nonatomic, strong) NSString *centerBtnTitle;
@property (nonatomic, strong) NSString *centerBtnIcon;

+ (instancetype)instanceCustomTabBarWithType:(kTbaBarItemUIType)type;

@end

YLTbaBar.m

//
// YLTabBar.m
// 自定义tabbar
//
// Created by nyl on 2018/10/15.
// Copyright © 2018年 nieyinlong. All rights reserved.
//

#import "YLTabBar.h"

@interface YLTabBar()

@property(nonatomic, strong) UIButton *centerButton;
@property(nonatomic, strong) UILabel *centerTitle;
@property (nonatomic,assign) kTbaBarItemUIType type;

@end

@implementation YLTabBar

+(instancetype)instanceCustomTabBarWithType:(kTbaBarItemUIType)type{
 YLTabBar *tabBar = [[YLTabBar alloc] init];
 tabBar.type = type;
 return tabBar;
}

-(instancetype)initWithFrame:(CGRect)frame{
 self = [super initWithFrame:frame];
 if (self) {
 self.translucent = NO;
 UIButton *plusBtn = [UIButton buttonWithType:UIButtonTypeCustom];
 self.centerButton = plusBtn;
 [plusBtn addTarget:self action:@selector(plusBtnDidClick) forControlEvents:UIControlEventTouchUpInside];
 [self addSubview:plusBtn];

 UILabel *lblTitle = [[UILabel alloc] init];
 self.centerTitle = lblTitle;
 lblTitle.font = [UIFont systemFontOfSize:10];
 lblTitle.textColor = [UIColor blackColor];
 lblTitle.textAlignment = NSTextAlignmentCenter;
 [self addSubview:lblTitle];

 }
 return self;
}

-(void)plusBtnDidClick{
 if (self.tabDelegate && [self.tabDelegate respondsToSelector:@selector(tabBar:clickCenterButton:)]) {
 [self.tabDelegate tabBar:self clickCenterButton:self.centerButton];
 }
}

// 调整子视图的布局
-(void)layoutSubviews{
 [super layoutSubviews];
 CGFloat width = self.frame.size.width/self.type;
 Class class = NSClassFromString(@"UITabBarButton");
 for (UIView *view in self.subviews) {
 if ([view isEqual:self.centerTitle]) {//self.centerButton
  view.frame = CGRectMake(0, 0, width, 15);
  view.center = CGPointMake(self.frame.size.width/2, self.frame.size.height - view.frame.size.height + 8);
 }else if ([view isEqual:self.centerButton]) {//self.centerButton
  view.frame = CGRectMake(0, 0, width, self.frame.size.height);
  [view sizeToFit];
  view.center = CGPointMake(self.frame.size.width/2, 10);
 }else if ([view isKindOfClass:class]){//system button
  CGRect frame = view.frame;
  int indexFromOrign = view.frame.origin.x/width;//防止UIView *view in self.subviews 获取到的不是有序的
  if (indexFromOrign >= (self.type - 1) / 2) {
  indexFromOrign++;
  }
  CGFloat x = indexFromOrign * width;
  //如果是系统的UITabBarButton,那么就调整子控件位置,空出中间位置
  view.frame = CGRectMake(x, view.frame.origin.y, width, frame.size.height);

  //调整badge postion
  for (UIView *badgeView in view.subviews){
  NSString *className = NSStringFromClass([badgeView class]);
  // Looking for _UIBadgeView
  if ([className rangeOfString:@"BadgeView"].location != NSNotFound){
   badgeView.layer.transform = CATransform3DIdentity;
   badgeView.layer.transform = CATransform3DMakeTranslation(-17.0, 1.0, 1.0);
   break;
  }
  }
 }
 }
}

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
 //这一个判断是关键,不判断的话push到其他页面,点击发布按钮的位置也是会有反应的,这样就不好了
 //self.isHidden == NO 说明当前页面是有tabbar的,那么肯定是在导航控制器的根控制器页面
 //在导航控制器根控制器页面,那么我们就需要判断手指点击的位置是否在发布按钮身上
 //是的话让发布按钮自己处理点击事件,不是的话让系统去处理点击事件就可以了
 if (self.isHidden == NO) {
 //将当前tabbar的触摸点转换坐标系,转换到发布按钮的身上,生成一个新的点
 CGPoint newP = [self convertPoint:point toView:self.centerButton];

 //判断如果这个新的点是在发布按钮身上,那么处理点击事件最合适的view就是发布按钮
 if ( [self.centerButton pointInside:newP withEvent:event]) {
  return self.centerButton;
 }else{//如果点不在发布按钮身上,直接让系统处理就可以了
  return [super hitTest:point withEvent:event];
 }
 }
 else {//tabbar隐藏了,那么说明已经push到其他的页面了,这个时候还是让系统去判断最合适的view处理就好了
 return [super hitTest:point withEvent:event];
 }
}

-(void)setCenterBtnIcon:(NSString *)centerBtnIcon{
 _centerBtnIcon = centerBtnIcon;
 [self.centerButton setBackgroundImage:[UIImage imageNamed:self.centerBtnIcon] forState:UIControlStateNormal];
 [self.centerButton setBackgroundImage:[UIImage imageNamed:self.centerBtnIcon] forState:UIControlStateHighlighted];
}

-(void)setCenterBtnTitle:(NSString *)centerBtnTitle{
 _centerBtnTitle = centerBtnTitle;
 self.centerTitle.text = centerBtnTitle;
}

@end

在UITabBarController中使用

// viewDidLoda中, KVO形式添加
[self setValue:self.ylTabBar forKey:@"tabBar"];

- (YLTabBar *)ylTabBar {
 if (!_ylTabBar) {
 _ylTabBar = [YLTabBar instanceCustomTabBarWithType:kTbaBarItemUIType_Five];
 _ylTabBar.centerBtnIcon = @"centerIcon";
 _ylTabBar.tabDelegate = self;
 }
 return _ylTabBar;
}

YLTabBarDelegate

-(void)tabBar:(YLTabBar *)tabBar clickCenterButton:(UIButton *)sender{
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"点击了中间按钮" preferredStyle:UIAlertControllerStyleAlert];
 UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

 // TODO
 }];
 [alert addAction:action];
 [self presentViewController:alert animated:YES completion:nil];
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS应用开发中导航栏按钮UIBarButtonItem的添加教程

    1.UINavigationController导航控制器如何使用 UINavigationController可以翻译为导航控制器,在iOS里经常用到. 我们看看它的如何使用: 下面的图显示了导航控制器的流程.最左侧是根视图,当用户点击其中的General项时 ,General视图会滑入屏幕:当用户继续点击Auto-Lock项时,Auto-Lock视图将滑入屏幕.相应地,在对象管理上,导航控制器使用了导航堆栈.根视图控制器在堆栈最底层,接下来入栈的是General视图控制器和Auto-Lock

  • 详解iOS-按钮单选与多选逻辑处理

    我们经常会有多行多列按钮的页面, 这个时候我们通常会选择循环创建按钮, 然后进行按钮单选或者多选的操作! 一. 单选逻辑处理 1. 创建按钮控件数组及标签数组, 并升级当前选中按钮为属性,方便使用 #define ZLUnselectedColor [UIColor colorWithRed:(241)/255.0 green:(242)/255.0 blue:(243)/255.0 alpha:1.0] #define ZLSelectedColor [UIColor colorWithRed

  • IOS UITableViewCell详解及按钮点击事件处理实例

    IOS UITableViewCell详解及按钮点击事件处理 今天突然做项目的时候,又遇到处理自定义的UITableViewCell上按钮的点击事件问题.我知道有两种方式,可是突然想不起来之前是怎么做的了,好记性不如烂笔头,还是记录一下吧. 1.第一种方式给Button加上tag值 这里分为两种:一种是直接在原生的UITableViewCell上添加UIButton按钮,然后给UIButton设置tag值,然后在控制器里的方法里通过取数据,做界面跳转等.还是举个例子吧,省的回忆半天. - (UI

  • 关于iOS导航栏返回按钮问题的解决方法

    最近遇到一个关于导航栏返回按钮的问题,因为之前项目里面都是用的系统默认的返回按钮样式所以没有想过要去更改,后来有需要将返回按钮箭头旁边的文字去掉,同时将该返回按钮的点击事件重新定义.一开始尝试自定义按钮然后设置为leftBarButtonItem,但是这样图片可能跟系统自带的不一样,还有就是返回按钮的位置跟系统自带的不一样.后来找了一些资料,发现将文字去掉比较简单,一般做法是控制器中添加如下代码,然后他的下一级控制就有一个只有箭头没有文字返回按钮: 复制代码 代码如下: UIBarButtonI

  • 详解iOS应用中自定义UIBarButtonItem导航按钮的创建方法

    iOS系统导航栏中有leftBarButtonItem和rightBarButtonItem,我们可以根据自己的需求来自定义这两个UIBarButtonItem. 四种创建方法 系统提供了四种创建的方法: 复制代码 代码如下: - (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(id)target action:(SEL)action; - (instancetype)init

  • 详解iOS中Button按钮的状态和点击事件

    一.按钮的状态 1.UIControlStateNormal 1> 除开UIControlStateHighlighted.UIControlStateDisabled.UIControlStateSelected以外的其他情况,都是normal状态 2> 这种状态下的按钮[可以]接收点击事件 2.UIControlStateHighlighted 1> [当按住按钮不松开]或者[highlighted = YES]时就能达到这种状态 2> 这种状态下的按钮[可以]接收点击事件 3

  • iOS App中UITableView左滑出现删除按钮及其cell的重用

    UITableView的编辑模式 实现UITableView简单的删除功能(左滑出现删除按钮) 首先UITableView需要进入编辑模式.实现下面的方法,即使什么代码也不写也会进入编辑模式: 复制代码 代码如下: - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)index

  • iOS开发中UISwitch按钮的使用方法简介

    一.第一种创建UISwitch控件的方法,在代码中动态创建. 1.打开Xcode  4.3.2, 新建项目Switch,选择Single View Application. 2.打开ViewController.m文件在viewDidLoad方法里添加代码: 复制代码 代码如下: - (void)viewDidLoad {     [super viewDidLoad];     UISwitch *switchButton = [[UISwitch alloc] initWithFrame:C

  • IOS 开发之自定义按钮实现文字图片位置随意定制

    IOS 开发之自定义按钮实现文字图片位置随意定制 可能有些看到这篇文章的朋友会觉得很不屑:"按钮谁不会自定义?还需要看你的?" 也确实,按钮是我们项目中最常见的控件之一,天天在使用.对于不同类型的按钮,我们是否有更加简便的方法来实现需求是我们需要做的.这里我提出自己的两种方法,您可以对你自己平时自定义按钮的方法做一下对比,看看哪种方法更加简单. 多说一句,千万不要觉得知识简单,觉得自己会了,没必要学习.'往往简单的东西存在大智慧'(这个比给满分),知识都是慢慢积累出来的. 按钮是应用中

  • 学习iOS开关按钮UISwitch控件

    开关按钮UISwitch 在ViewController.h里面 #import <UIKit/UIKit.h> @interface ViewController : UIViewController{ //定义一个开关控件 //作用可以进行状态的改变 //开,关:两种状态可以切换 //所有UIKit框架库中的控件均已UI开头 //苹果官方的控件都定义在UIKit框架库中 UISwitch * _mySwitch; } @property(retain,nonatomic) UISwitch

随机推荐