全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

iOS实现滑动弧形菜单的思路与方法

前言

最近公司的项目中需要用到弧形菜单,起初自定义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小时内与您取得联系。