当前位置: 首页 > news >正文

[iOS开发]iOS中TabBar中间按钮凸起的实现

在日常使用app的过程中,经常能看到人家实现了底部分栏控制器的中间按钮凸起的效果,那么这是怎么实现的呢?

效果演示:

请添加图片描述

实现原理:

创建按钮

创建一个UITabBar的子类,重写它的layoutSubviews方法:

- (void)layoutSubviews {[super layoutSubviews];CGFloat width = self.bp_width;// 添加发布按钮[self addSubview:self.publishButton];self.publishButton.center = CGPointMake(width * 0.5, 0);// 按钮索引int index = 0;// tabBar上按钮的尺寸CGFloat tabBarButtonW = (width - publishButtonWidth) / 2;CGFloat tabBarButtonH = [UIDevice bp_tabBarHeight];CGFloat tabBarButtonY = 0;// 设置TabBarButton的framefor (UIView *tabBarButton in self.subviews) {if (![NSStringFromClass(tabBarButton.class) isEqualToString:@"UITabBarButton"]) {continue;}// 计算按钮的X值CGFloat tabBarButtonX = index * tabBarButtonW;if (index == 1) { // 给下一个个button增加一个publushButton宽度的x值tabBarButtonX += publishButtonWidth;}// 设置按钮的frametabBarButton.frame = CGRectMake(tabBarButtonX, tabBarButtonY, tabBarButtonW, tabBarButtonH);// 增加索引index++;}
}

方法里面对原有的tabBarButton的位置进行调整,以便把自己加上去的按钮插入到中间,把center位置设置成tabBar上沿的中间位置。

扩大点击范围

按钮加上去后,发现点击超出tabBar范围的位置,按钮无法响应,所以,需要重写hitTest方法,扩大响应范围:

// 重写扩大响应范围
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {if (self.isHidden == NO) {CGPoint newPoint = [self convertPoint:point toView:self.publishButton];if ([self.publishButton pointInside:newPoint withEvent:event]) {return self.publishButton;}}return [super hitTest:point withEvent:event];
}

这样,这个中间凸起的按钮就做好了!

相关文章:

  • Zabbix结合Grafana统计日志网站访问量
  • 11.4商业伦理(全)
  • npm create vue@latest 原理
  • C++17中std::any的使用
  • 【教3妹学编程-算法题】2914. 使二进制字符串变美丽的最少修改次数
  • 如何从站长的角度选择高防CDN以节省成本
  • Python基础入门例程36-NP36 谁的数字大(运算符)
  • 部署ELK
  • [Machine Learning][Part 8]神经网络的学习训练过程
  • Windows下pm2调用npm和nuxt的办法
  • 【LeetCode刷题-栈与队列】--232.用栈实现队列
  • 论文阅读:One Embedder, Any Task: Instruction-Finetuned Text Embeddings
  • git reflog 恢复git reset --hard 回退的内容
  • 小程序如何设置用户同意服务协议并上传头像和昵称
  • Spring Boot spring.factories的原理
  • 【mysql】环境安装、服务启动、密码设置
  • Flex布局到底解决了什么问题
  • Java Agent 学习笔记
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Javascript基础之Array数组API
  • JSONP原理
  • JS实现简单的MVC模式开发小游戏
  • js数组之filter
  • MySQL几个简单SQL的优化
  • Node项目之评分系统(二)- 数据库设计
  • Python - 闭包Closure
  • vagrant 添加本地 box 安装 laravel homestead
  • 包装类对象
  • 关于springcloud Gateway中的限流
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 全栈开发——Linux
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何用vue打造一个移动端音乐播放器
  • 微信小程序开发问题汇总
  • scrapy中间件源码分析及常用中间件大全
  • 我们雇佣了一只大猴子...
  • ​一些不规范的GTID使用场景
  • #每日一题合集#牛客JZ23-JZ33
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (+4)2.2UML建模图
  • (5)STL算法之复制
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (HAL库版)freeRTOS移植STMF103
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (六)c52学习之旅-独立按键
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十三)Maven插件解析运行机制
  • (四) Graphivz 颜色选择
  • (新)网络工程师考点串讲与真题详解
  • (转)nsfocus-绿盟科技笔试题目
  • .bashrc在哪里,alias妙用