ios 圆形旋转菜单_iOS高级动画:圆形树展开&收起动画

转自:标哥的技术博客,作者:黄仪标(微博)

前段时间帮某某做了一个动画效果,今天分享给大家。关于动画的基础知识,这里不会细说,如果您还没有核心动画的基础知识,请先阅读相关文章,了解核心动画如何使用,然后再继续阅读本篇文章。

本篇文章,涉及到以下知识点:如何添加缩放动画

如何添加平移动画

如何添加旋转动画

如何添加关键帧动画

如何使用组合动画

如何实现渐变图层

如何实现圆形渐变进度条

温馨提示:新手不适合阅读本篇文章哦,不过可以初步阅读了解一下!

如果没有了解过动画的基础知识,可先看看笔者之前的一些文章:

本篇文章不深入讲基础知识,只讲如何实现及实现的要点,并放出关键代码。对于伸手党,请不要私聊我要完整的源代码。如果您正好在项目中有这样的需求,可以尝试根据本篇文章讲解动手做一个!

最终效果图

无缩放动画的效果图:

从动画效果可以看出来,有平移、旋转、关键帧动画,同时还有渐变进度条充满的动画。另外还要注意移动的距离。请忽略样式丑陋的问题~

有缩放动画的效果图:

从动画效果可以看出来,个人变成了6个,且是平分的,比上面的效果图多了缩放的动画!这个缩放动画,生成GIF图的效果真丑,跟手机运行起来看到的差别比较大!

设计思路

这里是封装里了通用的组件,如果是在项目中使用,可以轻松调用且可以复用。从动画效果可以看到,这个整体是由以下几个部分组成的:

1)中间带进度图的圆形控件(这里叫叶子吧)

2)从中心圆出来到四周的N个控件,其中每个都是拥有同样的特性的

所以,我们设计成三个类,分别是:HYBCurveItemView:代表散开的每个子项控件

HYBCurveMainView:代表中间的圆形控件

HYBCurveMenuView:由前两个控件组合而形成的整体控件

设计HYBCurveItemView

假设叫叶子。那么每个叶子就有相同的特性,需要知道自己的归属:自身的大小

展示的元素

可移动到最远的哪个位置

可移动到最近的哪个位置

起始位置

最终展开后停留的位置

可设置以下几个位置属性:@property (nonatomic, assign) CGPoint startPoint;

@property (nonatomic, assign) CGPoint endPoint;

@property (nonatomic, assign) CGPoint nearPoint;

@property (nonatomic, assign) CGPoint farPoint;

这个类只需要有相关属性即可!

设计HYBCurveMainView

假设中大圆。大圆主要需要属性以下特性:自身大小

展示的元素

带有渐变圆形进度条

可执行的操作:更新进度

展开、收起叶子

对于这个大圆类,细读如何添加圆形进度条。

设计渐变进度圆环

首先,添加白色固定圆形

底部是一个白色的圆环,当白色圆环填满时,表示0%。那么白色圆环可以用什么来实现呢?其实CAShapeLayer就是非常好的,它可以添加圆形路径来实现的,记得设置填充色为透明哦,不然连中间的内容也看不见了。代码如下:self.outLayer = [CAShapeLayer layer];

CGRect rect = {kLineWidth / 2, kLineWidth / 2, frame.size.width - kLineWidth, frame.size.height - kLineWidth};

UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:rect];

self.outLayer.strokeColor = [UIColor whiteColor].CGColor;

self.outLayer.lineWidth = kLineWidth;

self.outLayer.fillColor =  [UIColor clearColor].CGColor;

self.outLayer.lineCap = kCALineCapRound;

self.outLayer.path = path.CGPath;

[self.layer addSublayer:self.outLayer];

因为要设置为白色圆环,所以画笔颜色设置为白色,线宽就设置为圆环的大小。这样就可以初步形成了带有白色圆环的底色了。此时就是0%。

其次,设置可调进度的进度圆环图层

下面所创建的图层,会用于设置渐变颜色图层的mask,这样才能显示中间的内容,而不是渐变的图层。它的大小与白底圆环一样大小:self.progressLayer = [CAShapeLayer layer];

self.progressLayer.frame 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值