前言

最近公司的项目中需要用到弧形菜单,起初自定义UICollectionView的layout,但实现出的效果并不符合项目中要求按钮始终垂直于界面、界面始终保持几个按钮等一系列需求(是我水平不够),后来索性用UIView写了一个弧形可滑动菜单。
效果如下:
实现思路:
1、根据思路可以自己确定到半径与圆心的每个按钮所在的x点,可根据数学公式求得y点
2、给按钮添加拖动手势UIPanGestureRecognizer,根据偏移量x计算出对应偏移弧线的距离,根据圆的运动轨迹赋值给按钮的x 并更新 y
3、结束拖动手势的时候计算偏移距离、根据是否划到下一个按钮的一半的width来实施动画更新按钮的center
实现细节:
已知圆心、半径与x值求y值:(x-a)^2 + (y - b)^ 2 = r2。
用到的UIPanGestureRecognizer的三种状态:UIGestureRecognizerStateBegan\UIGestureRecognizerStateChanged\UIGestureRecognizerStateEnded
用UIPanGestureRecognizer的locationInView方法来确定当前点的位置
if(pgr.state==UIGestureRecognizerStateBegan){
self.endMove = NO;
self.beginPoint=[pgr locationInView:self];
}else if (pgr.state==UIGestureRecognizerStateChanged){
self.movePoint= [pgr locationInView:self];
self.moveX = sqrt(fabs(self.movePoint.x - self.beginPoint.x) * fabs(self.movePoint.x - self.beginPoint.x) + fabs(self.movePoint.y - self.beginPoint.y) * fabs(self.movePoint.y - self.beginPoint.y));
}
计算出偏移的x点后要根据起始点来判断用户是向左滑动还是向右滑动
if (self.movePoint.x>self.beginPoint.x) {
self.moveNum += self.moveX;
} else{
self.moveNum -= self.moveX;
}
之后判断判断是否超过了所有按钮所在的范围并赋值
if (self.moveNum > 0) {
self.moveNum = 0;
}
if (self.moveNum < -((SCREEN_WIDTH - 20 - subViewW)/(self.showBtnCount - 1)) * (self.subViewArray.count - self.showBtnCount)) {
self.moveNum = -((SCREEN_WIDTH - 20 - subViewW)/(self.showBtnCount - 1)) * (self.subViewArray.count - self.showBtnCount);
}
将偏移量赋值给x并更新y值
///中心点
CGFloat yy = 0.0;
CGFloat xx = 0.0;
CGFloat margin = 0.0;
///子视图x中点
UIView *view = self.subViewArray[0];
CGFloat subCenterX = view.frame.size.width / 2;
for (NSInteger i=0; i<self.subViewArray.count ;i++) {// 178,245
margin = i * ((SCREEN_WIDTH - 20 - view.frame.size.width)/(self.showBtnCount - 1));
xx = 10 + subCenterX + fabs(self.subViewX) + margin + self.moveNum;
yy = sqrt((self.radius - self.circleMargin / 2) * (self.radius - self.circleMargin / 2) - (xx - self.radius) * (xx - self.radius)) + self.radius;
if (xx >= self.radius - (self.radius - self.circleMargin / 2) && xx <= self.radius + (self.radius - self.circleMargin / 2)) {
UIButton *button=[self.subViewArray objectAtIndex:i];
NSLog(@"~~~~~~~%@",button);
if (self.isEndMove) {
[UIView animateWithDuration:0.3 animations:^{
button.center=CGPointMake(xx , yy);
}];
} else{
button.center=CGPointMake(xx , yy);
}
}
NSLog(@"xx:%f---------yy:%f",xx,yy);
}
原理大概就是这些
然后把项目中的效果直接做了简单的封装传了个demo
Github地址:https://github.com/xuuhan/HXCamberMenu
本地下载地址:http://xiazai./201705/yuanma/HXCamberMenu().rar
总结
以上就是这篇文章的全部内容了,实现的效果和功能可能还有着明显的限制,希望同学们多多指教,同时也希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# ios
# 弧形菜单
# 滑动菜单
# 扇形滑动菜单
# iOS实现顶部标签式导航栏及下拉分类菜单
# 拖动
# 计算出
# 几个
# 偏移量
# 本地下载
# 中心点
# 同学们
# 三种
# 写了
# 自定义
# 这篇文章
# 谢谢大家
# 方法来
# 传了
# 始终保持
# 判断是否
# 可根据
# 起始点
# 超过了
# 等一系列
相关文章:
5种Android数据存储方式汇总
西安专业网站制作公司有哪些,陕西省建行官方网站?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
青岛网站建设如何选择本地服务器?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
网站网页制作专业公司,怎样制作自己的网页?
兔展官网 在线制作,怎样制作微信请帖?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
建站之星如何助力企业快速打造五合一网站?
网站制作企业,网站的banner和导航栏是指什么?
建站VPS配置与SEO优化指南:关键词排名提升策略
如何制作一个表白网站视频,关于勇敢表白的小标题?
英语简历制作免费网站推荐,如何将简历翻译成英文?
高端企业智能建站程序:SEO优化与响应式模板定制开发
广州美橙建站如何快速搭建多端合一网站?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
常州企业网站制作公司,全国继续教育网怎么登录?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何在云指建站中生成FTP站点?
宝塔建站后网页无法访问如何解决?
南平网站制作公司,2025年南平市事业单位报名时间?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何通过建站之星自助学习解决操作问题?
南宁网站建设制作定制,南宁网站建设可以定制吗?
建设网站制作价格,怎样建立自己的公司网站?
如何在服务器上配置二级域名建站?
表情包在线制作网站免费,表情包怎么弄?
Thinkphp 中 distinct 的用法解析
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
网站代码制作软件有哪些,如何生成自己网站的代码?
宿州网站制作公司兴策,安徽省低保查询网站?
如何通过网站建站时间优化SEO与用户体验?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何在IIS中新建站点并配置端口与IP地址?
如何在局域网内绑定自建网站域名?
建站OpenVZ教程与优化策略:配置指南与性能提升
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
济南企业网站制作公司,济南社保单位网上缴费步骤?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
Swift中switch语句区间和元组模式匹配
网站制作新手教程,新手建设一个网站需要注意些什么?
c# 服务器GC和工作站GC的区别和设置
临沂网站制作企业,临沂第三中学官方网站?
做企业网站制作流程,企业网站制作基本流程有哪些?
IOS倒计时设置UIButton标题title的抖动问题
北京专业网站制作设计师招聘,北京白云观官方网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。