iOS旋钮动画-CircleKnob

前段时间和群里的一个设计师配合,根据网上的一个旋钮gif为原型,用代码做出来了。先来看下原型的效果 
原型效果

在看下下面是我做完后成品的效果,加了一个通过移动光源来对阴影控制的效果,这样看起来更立体点。(那个太阳有点不协调。。。) 
同时附上代码链接https://git.oschina.net/BearXR/CircleKnob 
还有单独的下载包http://download.csdn.net/detail/xiongbaoxr/9419655 
成品效果

下面开始简单的讲解下构思步骤和部分代码片段 
1,构建底盘 
首先我们要构造两个圆盘和旋钮上的红点 
这里写图片描述 
用view画两个圆盘,和一个小的红色控制点。 
注意:红色的控制点我又单独新建了一个view,这样方便待会做手势控制,从而不会影响到后面的view。而且所有view的圆心都要设置好。后面和角度相关的处理会很多的。最好能准确和self.view或者window能有直接的关联。

2,底盘增加点击和拖动的手势 
在这里我们要增加手势,还有起始点,终点的角度。我画了辅助线,便于调试。手势和过渡效果都写好了。所以效果我就直接放上来了。 
旋钮动画

3,增加外围的扇环 
由于后面要做阴影,所以除了扇环的底色和效果是用了一个view,其余的每个小格子我都是新开了一个view,并且将旋钮的圆心位置设置为锚点进行旋转。 
带有扇环

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#pragma mark - 设置外围的扇环形</span>
- (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)initSetFanView
{
    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">CGFloat</span> delta_distance = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">26</span>;

    fanView = [[FanView alloc] initWithFrame:CGRectMake(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, knob_width + delta_distance * <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>, knob_width + delta_distance * <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)];
    fanView<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.center</span> = knob<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.center</span>;
    fanView<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.backgroundColor</span> = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">UIColor</span> clearColor];
    fanView<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.userInteractionEnabled</span> = <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NO</span>;
    [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.view</span> addSubview:fanView];

    fanView<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.knobValue</span> = -startAngleValue;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//设置起始点</span>
    fanView<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.lightSource_InWindow</span> = lightSource;
}

- (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)drawRect:(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">CGRect</span>)rect
{
    contextBack = UIGraphicsGetCurrentContext();
    contextFore = UIGraphicsGetCurrentContext();

    [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span> drawFan:contextBack
       bezierPath:bezierPathBack
        knobAngle:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">180</span> + endAngleValue
      strokeColor:[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">UIColor</span> colorWithRed:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">202</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">255.0</span> green:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">207</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">255.0</span> blue:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">202</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">255.0</span> alpha:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.0</span>f]];

    [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">self</span> drawFan:contextFore
       bezierPath:bezierPathFore
        knobAngle:_knobValue
      strokeColor:[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">UIColor</span> colorWithRed:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">174</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">255.0</span> green:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">255.0</span> blue:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值