iOS自定义UITabBar仿今日头条效果
时间:2019-04-06
本文章向大家介绍iOS自定义UITabBar仿今日头条效果,主要包括iOS自定义UITabBar仿今日头条效果使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
动机
关于自定义 TabBar,早就有过很多讨论,开源网站上也有很多造好的轮子,多半是纯代码实现有个性的 TabBar,当然我们可以很方便的使用它。周末闲着没事干,自己也写了一下,模仿今日头条的 TabBar 效果,实现方式是Storyboard + 代码。
效果图
实现步骤在 Storyborad 上搭建项目基础结构
在界面上设置每个 TabBarItem 的相关属性
需要自定义的 item 不需要在界面上设置。
自定义 UITabBarViewController
目的
替换默认的 UITabBar
处理 发布按钮(中间那个加号按钮)点击事件
主要代码
替换 UITabBar,监听点击事件
override func viewDidLoad() { super.viewDidLoad() // 替换 tabbar let _tabBar = TabBar() // 监听按钮点击事件 _tabBar.handleBtnReleaseClick(self, action: #selector(btnReleaseClick)) setValue(_tabBar, forKey: "tabBar") }
自定义 UITabBar
目的
自定义 UITabBar,替换掉 Storyboard 上默认生成的 TabBarItem
处理 发布按钮(中间那个加号按钮)点击事件
主要代码
删除占位“按钮”,添加自定义按钮
// MARK: 删除占位“按钮”,添加自定义按钮 override func layoutSubviews() { super.layoutSubviews() btnRelease.backgroundColor = UIColor.white // 过滤掉 _UIBarBackground 类型的对象,只保留 UITabBarButton 类型的对象 let tabbarButtonList = iews.filter{NSStringFromClass(type(of: $0)) == abBarButton"} // 取出需要删除的“按钮”(经测试,知道中间那个加号按钮的下标是2) let tmpView = tabbarButtonList[safe: 2] // 把默认生成的从父容器中移除 tmpView?.removeFromSuperview() let x = (InnerConst.ScreenW - btnRelease.w) * 0.5 let y = InnerConst.ButtonOffsetY btnRelease.origin = CGPoint(x: x, y: y) addSubview(btnRelease) }
处理默认情况下,按钮超出 TabBar 以外区域不能点击问题
// MARK: 处理默认情况下,按钮超出 TabBar 以外区域不能点击问题 override func hitTest(_ point: CGPoint, with event: UIEvent?) -View? { if isHidden == false { let newPoint = convert(point, to: btnRelease) if btnRelease.point(inside: newPoint, with: event) { return btnRelease } return super.hitTest(point, with: event) } return super.hitTest(point, with: event) }
按钮点击事件委托给调用方
func handleBtnReleaseClick(_ target: AnyObject?, action: Selector) { btnRelease.addTarget(target, action: action, for: .touchUpInside) }
代码写到这里,一个类似于今日头条的 UITabBar(主要是中间那个按钮)差不多造出来了。以上部分贴出来的是个人认为比较关键的代码,有问题可以讨论,目的是用最简单的方式、最少的代码实现需求。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- TensorFlow强化学习入门(4)——深度Q网络(DQN)及其扩展
- 3.请求安全-- 如何验证请求的唯一性
- 2.请求安全-- MD5的必要性以及实际应用场景
- 1.请求安全-- 一个简单的 单设备登录 单点登录
- phalapi-进阶篇3(自动加载和拦截器)
- phalapi-进阶篇2(DI依赖注入和单例模式)
- 基于PhalApi的DB集群拓展 V0.1bate
- phalapi-进阶篇1(Api,Domain,和Model)
- 你不知道的Javascript:有趣的setTimeout
- phalapi-入门篇5(数据库操作和Model层)
- HTML5.2新特性解读
- phalapi-入门篇6(小技巧和浅谈API适用范围以及入门篇总结)
- phalapi-入门篇2(把它玩起来)
- phalapi-入门篇3(请求和返回)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- geom_abline
- Python OpenCV查找图中的四边形/矩形
- Spark Opeartor的指标体系
- R-基本绘图参数(Ⅰ)
- NVIDIA TensorRT Inference Server on Kubernetes
- Kubernetes 环境的 Tensorflow Serving on S3
- 数据处理|数据框重铸
- Go mod 常见问题(持续更新)
- R In Action|创建数据集
- R语言进阶之生存分析
- R In Action |基本数据管理
- R|apply,tapply
- python中的基本运算
- 助力联邦——Pulsar在Angel PowerFL联邦学习平台中的应用
- 让数据跃然“图”上!腾讯位置服务数据可视化API正式发布