自定义圆环,跟随手指旋转角度加减layer

需求分析:这种功能常见于数值实时加减,比如对音量的控制。手指滑动圆盘,数值随着滑动的角度而改变,效果图跟最终实现GIF如下。(DCAutoImaginaryLayer

功能分析:自定义圆环音量调节显示,跟随手指旋转角度加减音量,利用了核心动画,图层,贝赛尔函数,三角函数与反三角函数;对外围螺纹线裁剪,使用了image layer mask 根据图片layer进行裁剪。一开始我想自己画螺纹线来着,无奈知识面太狭隘了,找了很多资料还是不会,所以最后就找了张有螺纹线的图片进行裁剪代替了。

实现原理:1.CAShapeLayer有虚线lineDashPattern的设置,可以实现这种间隔layer,不要自己费劲脑汁的一个个画了;2.利用图片裁剪螺纹线,也不用费劲脑汁的去想怎么画这个了;3.实现系统方法touchesMoved:处理角度,实时改变UIBezierPath并更新图层,实现最终效果。

DCAutoImaginaryLayer.png
transformView.gif

核心代码

1.根据图片layer进行裁剪:

        CALayer *maskLayer = [CALayer layer];
        maskLayer.frame = CGRectMake(frame.size.width/2 - 97, frame.size.height/2 - 97, 194, 194);
        UIImage *maskImage = [UIImage imageNamed:@"volume_area"];
        maskLayer.contents = (__bridge id)maskImage.CGImage;
        self.layer.mask = maskLayer;

2.虚线的设置:

 //每个虚线宽度为2,间隔为3 整个线条宽度为30
        _shapeLayer.lineWidth = 30.0f;
        _shapeLayer.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInt:4], [NSNumber numberWithInt:3], nil];

3.path角度的处理:

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];
    _endPoint = touchPoint;
    
    float x = _endPoint.y - self.frame.size.height/2;
    float y = _endPoint.x - self.frame.size.width/2;
    float a = atanf(x/y);
    float angle = 0.0;
    // ========== 4个象限角度的处理 start =============//
    if (x <0 && y < 0) {
        angle = a-M_PI;
    }
    if (x > 0 && y < 0) {
        angle = M_PI + a;
    }
    if (x > 0 && y > 0) {
        angle =  a;
    }
    if (x < 0 && y > 0) {
        angle = a;
    }
    // ========== 4个象限角度的处理 end =============//
    _path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.frame.size.width/2, self.frame.size.height/2) radius:90 startAngle:-M_PI endAngle:angle clockwise:1];
    _shapeLayer.path = _path.CGPath;
}

思路分析

要想layer跟着手指滑动实时更新,其实比较难想到的就是角度的处理,怎么实时获取正确的角度也是一个关键点。我首先想到的就是利用反三角函数获取角度,但是不能仅仅这样,还要注意四个象限x 跟 y 值的不同导致角度获取的不连续,需要手动处理。


这些小功能虽然不是很难,但是我能通过独立思考并利用自己所了解的知识点去实现它,我觉得很有成就感,它也是我进步的一个记录。


转载请注明出处 © XDChang
DCAutoImaginaryLayer

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容