11种动画按钮一键切换:FRDLivelyButton让iOS导航栏交互活起来
【免费下载链接】FRDLivelyButton 项目地址: https://gitcode.com/gh_mirrors/fr/FRDLivelyButton
你是否还在为iOS应用导航栏按钮单调的样式和生硬的交互烦恼?用户点击时毫无反馈,切换图标时突兀生硬,自定义样式又要从零开始绘制?FRDLivelyButton开源项目彻底解决了这些问题——一个轻量级UIButton子类,用Core Graphics驱动11种常用导航按钮样式,自带丝滑过渡动画和触摸反馈,只需几行代码就能让你的应用交互品质跃升一个台阶。
读完本文你将获得:
- 掌握5分钟集成动画按钮的完整流程
- 学会11种内置按钮样式的灵活应用
- 精通自定义颜色、线条粗细等外观属性的技巧
- 解锁导航栏按钮状态切换的高级动画效果
- 获取在Interface Builder中可视化配置的实战经验
项目概述:Core Graphics驱动的交互革命
FRDLivelyButton是专为UIBarButtonItem设计的UIButton子类(也可在任何UIButton场景使用),完全基于Core Graphics绘制,避免了图片资源管理的麻烦。项目支持iOS 6.1+系统和ARC内存管理,核心优势在于:
11种内置按钮样式一览
| 样式常量 | 视觉效果 | 典型应用场景 |
|---|---|---|
| kFRDLivelyButtonStyleHamburger | 三横线菜单图标 | 侧边栏切换 |
| kFRDLivelyButtonStyleClose | 叉号关闭图标 | 弹窗关闭按钮 |
| kFRDLivelyButtonStylePlus | 加号图标 | 添加新内容 |
| kFRDLivelyButtonStyleCirclePlus | 圆形加号 | 主要操作按钮 |
| kFRDLivelyButtonStyleCircleClose | 圆形叉号 | 模态窗口关闭 |
| kFRDLivelyButtonStyleCaretUp/Down/Left/Right | caret方向指示器 | 下拉菜单/折叠面板 |
| kFRDLivelyButtonStyleArrowLeft/Right | 箭头导航图标 | 页面切换/返回 |

快速集成:两种安装方式对比
CocoaPods安装(推荐)
# 添加到Podfile
pod 'FRDLivelyButton', '~> 1.1.3'
# 执行安装命令
pod install
手动集成
# 克隆项目仓库
git clone https://gitcode.com/gh_mirrors/fr/FRDLivelyButton.git
# 复制核心文件到项目
cp -r FRDLivelyButton/FRDLivelyButton your_project_directory/
两种方式对比表:
| 安装方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| CocoaPods | 自动更新/依赖管理 | 需要CocoaPods环境 | 正式项目/团队协作 |
| 手动集成 | 无依赖/离线可用 | 需手动更新 | 快速原型/演示项目 |
核心用法:从基础到进阶
1. 代码创建导航栏按钮
在导航栏右侧添加汉堡菜单按钮的完整示例:
// 初始化按钮(36x28为导航栏最佳尺寸)
FRDLivelyButton *menuButton = [[FRDLivelyButton alloc] initWithFrame:CGRectMake(0,0,36,28)];
// 设置初始样式(禁用动画)
[menuButton setStyle:kFRDLivelyButtonStyleHamburger animated:NO];
// 添加点击事件
[menuButton addTarget:self
action:@selector(toggleSideMenu:)
forControlEvents:UIControlEventTouchUpInside];
// 包装成UIBarButtonItem
UIBarButtonItem *menuItem = [[UIBarButtonItem alloc] initWithCustomView:menuButton];
// 添加到导航栏
self.navigationItem.rightBarButtonItem = menuItem;
2. 样式动态切换
实现按钮点击时在汉堡菜单和关闭图标间切换的动画效果:
- (IBAction)toggleMenu:(FRDLivelyButton *)sender {
// 判断当前样式并切换
kFRDLivelyButtonStyle newStyle = (sender.buttonStyle == kFRDLivelyButtonStyleHamburger) ?
kFRDLivelyButtonStyleClose : kFRDLivelyButtonStyleHamburger;
// 应用新样式(启用动画)
[sender setStyle:newStyle animated:YES];
// 执行菜单显示/隐藏逻辑
[self.sideMenuViewController toggleMenuAnimated:YES];
}
3. 自定义外观属性
创建蓝色高亮效果的圆形加号按钮:
// 创建自定义选项字典
NSDictionary *customOptions = @{
kFRDLivelyButtonLineWidth: @(2.5f), // 线条粗细
kFRDLivelyButtonColor: [UIColor darkGrayColor], // 正常状态颜色
kFRDLivelyButtonHighlightedColor: [UIColor colorWithRed:0.2 green:0.5 blue:1.0 alpha:1.0], // 高亮颜色
kFRDLivelyButtonHighlightScale: @(0.95f), // 触摸缩放比例
kFRDLivelyButtonStyleChangeAnimationDuration: @(0.4f) // 动画时长
};
// 应用自定义选项
FRDLivelyButton *addButton = [[FRDLivelyButton alloc] init];
addButton.options = customOptions;
[addButton setStyle:kFRDLivelyButtonStyleCirclePlus animated:NO];
所有可自定义属性及其默认值:
// 默认选项字典结构
@{
kFRDLivelyButtonHighlightScale: @(0.9f), // 触摸缩放比例
kFRDLivelyButtonLineWidth: @(1.0f), // 线条宽度
kFRDLivelyButtonColor: [UIColor blackColor], // 正常颜色
kFRDLivelyButtonHighlightedColor: [UIColor lightGrayColor], // 高亮颜色
kFRDLivelyButtonHighlightAnimationDuration: @(0.1), // 触摸动画时长
kFRDLivelyButtonUnHighlightAnimationDuration: @(0.15), // 释放动画时长
kFRDLivelyButtonStyleChangeAnimationDuration: @(0.3) // 样式切换动画时长
}
Interface Builder可视化配置
除纯代码方式外,也可通过Storyboard拖拽配置:
- 添加按钮控件:拖入UIButton到视图,将Class改为FRDLivelyButton
- 设置尺寸:推荐36x28(导航栏)或44x44(普通按钮)
- 连接IBOutlet:创建按钮属性连接
- 代码设置样式:在viewDidLoad中配置初始样式
// 视图加载完成后设置样式
- (void)viewDidLoad {
[super viewDidLoad];
[self.navigationButton setStyle:kFRDLivelyButtonStyleArrowLeft animated:NO];
self.navigationButton.options = @{kFRDLivelyButtonLineWidth: @(2.0f)};
}
高级实战:导航栏按钮状态机
实现一个智能导航按钮,根据当前视图状态自动切换样式和行为:
@interface NavigationStateManager ()
@property (nonatomic, strong) FRDLivelyButton *dynamicButton;
@property (nonatomic, assign) NSInteger currentState; // 0:列表 1:编辑 2:筛选
@end
@implementation NavigationStateManager
- (void)setupDynamicButton {
self.dynamicButton = [[FRDLivelyButton alloc] initWithFrame:CGRectMake(0,0,36,28)];
[self.dynamicButton addTarget:self action:@selector(handleDynamicButtonTap:) forControlEvents:UIControlEventTouchUpInside];
[self updateButtonForState:0 animated:NO]; // 初始状态
}
- (void)updateButtonForState:(NSInteger)state animated:(BOOL)animated {
self.currentState = state;
switch (state) {
case 0: // 列表状态 - 显示筛选按钮
[self.dynamicButton setStyle:kFRDLivelyButtonStyleCaretDown animated:animated];
break;
case 1: // 编辑状态 - 显示完成按钮
[self.dynamicButton setStyle:kFRDLivelyButtonStyleClose animated:animated];
break;
case 2: // 筛选状态 - 显示取消按钮
[self.dynamicButton setStyle:kFRDLivelyButtonStyleArrowLeft animated:animated];
break;
}
}
- (void)handleDynamicButtonTap:(FRDLivelyButton *)sender {
NSInteger nextState = (self.currentState + 1) % 3;
[self updateButtonForState:nextState animated:YES];
// 执行对应状态的业务逻辑
[self performActionForState:nextState];
}
@end
状态切换流程:
性能优化与最佳实践
内存占用优化
- 避免重复创建:导航栏按钮应作为视图控制器属性保存,而非每次使用时创建
- 合理设置动画时长:复杂界面建议将样式切换动画时长缩短至0.2-0.25秒
- 重用按钮实例:不同状态切换时重用同一按钮实例,而非创建多个按钮
适配不同屏幕尺寸
// 动态计算适合当前屏幕的按钮尺寸
CGFloat scale = [UIScreen mainScreen].scale;
CGSize buttonSize = CGSizeMake(36*scale, 28*scale);
FRDLivelyButton *scaledButton = [[FRDLivelyButton alloc] initWithFrame:CGRectMake(0,0,buttonSize.width,buttonSize.height)];
常见问题解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 动画卡顿 | 主线程阻塞 | 将复杂逻辑移至后台线程,动画前调用layoutIfNeeded |
| 颜色不生效 | 选项字典键名错误 | 使用系统提供的常量字符串,避免手动输入拼写错误 |
| 按钮点击区域过小 | frame设置不当 | 确保frame至少为36x28pt,可通过contentEdgeInsets扩展点击区域 |
项目贡献与版本迭代
贡献代码流程
- Fork项目仓库到个人账号
- 创建特性分支:
git checkout -b feature/your-feature-name - 提交修改:
git commit -m "Add xxx feature" - 推送分支:
git push origin feature/your-feature-name - 创建Pull Request到原仓库develop分支
版本历史重要节点
- v1.0.0:初始版本,支持5种基础样式
- v1.1.0:新增箭头和caret系列样式,优化动画曲线
- v1.1.3:修复iOS 12+兼容性问题,增加自定义动画时长选项
总结与未来展望
FRDLivelyButton以不到2000行代码实现了复杂的动画按钮系统,其核心价值在于:
- 降低开发门槛:无需图形设计能力即可实现专业级动画按钮
- 提升用户体验:通过微妙的动画反馈增强用户交互信心
- 保持代码整洁:Core Graphics绘制避免大量图片资源管理
未来版本可能加入的功能:
- Swift语言重写版本
- 支持自定义路径绘制
- 更多预设动画效果
- SwiftUI组件支持
立即行动:将你的下一个iOS项目中的普通UIButton替换为FRDLivelyButton,体验交互品质的显著提升!
如果觉得本项目有帮助,请给GitHub仓库点星支持,关注作者获取更多优质开源组件。下一篇我们将深入探讨Core Graphics绘制复杂动画路径的实现原理,敬请期待!
【免费下载链接】FRDLivelyButton 项目地址: https://gitcode.com/gh_mirrors/fr/FRDLivelyButton
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



