iOS开发-Quartz 2D动态绘图上下波动展示

今天呢给同学讲解一个项目中非常常用的动态绘图界面!以及实现原理解析和思路分析还有Quart 2D的使用!那么废话不多说直接上代码!

iOS开发-Quartz 2D动态绘图上下波动展示.gif
//

//  ZZQuartz2DView.h

//  08-动态绘图

//

//  Created by 周昭 on 2017/3/27.

//  Copyright © 2017年 ZZ. All rights reserved.

//

#import <UIKit/UIKit.h>

// 定义屏幕尺寸适配修改

#define kSCREEN_WIDTH     [UIScreen mainScreen].bounds.size.width

#define kSCREEN_HEIGHT    [UIScreen mainScreen].bounds.size.height

@interface ZZQuartz2DView : UIView

+ (instancetype)quartz2DView;

@end

//

//  ZZQuartz2DView.m

//  08-动态绘图

//

//  Created by 周昭 on 2017/3/27.

//  Copyright © 2017年 ZZ. All rights reserved.

//

#import "ZZQuartz2DView.h"

@interface  ZZQuartz2DView()

/**

 *  头像

 */

@property (nonatomic, weak) UIButton *iconBtn;

/**

 *  湿度

 */

@property (nonatomic, assign) CGFloat hum;

/**

 *  温度

 */

@property (nonatomic, assign) CGFloat tem;

@end

@implementation ZZQuartz2DView

- (void)drawRect:(CGRect)rect

{

#warning - 接收数据然后赋值

    self.hum += 0.01;

    if (self.hum >= 1.0) { // 对湿度要特殊处理

        self.hum = 0.0;

    }

    self.tem += 0.01;

    if (self.tem >= 1.0) {

        self.tem = 0.0;

    }

 // 1.左侧外弧

 CGContextRef ctx1 = UIGraphicsGetCurrentContext();

 CGContextSetLineWidth(ctx1, 15.0);//线的宽度

 CGContextSetRGBStrokeColor(ctx1, 230/255.0, 230/255.0, 230/255.0, 1);//改变画笔颜色

#warning - 贝塞尔曲线

    /*

     CGContextAddArc 中的参数:

     context               图形上下文

     CGFloat x              圆心横坐标

     CGFloat y              圆心纵坐标

     CGFloat radius         半径

     CGFloat startAngle     开始角度

     CGFloat endAngle       结束角度

     clockwise              圆弧的方向 (0:顺时针  1:逆时针)

     */

 CGContextAddArc(ctx1, kSCREEN_WIDTH / 2, kSCREEN_HEIGHT * 3/10, kSCREEN_WIDTH/2 - 40, -M_PI*7/6, -M_PI*5/6, 0);

 CGContextSetLineCap(ctx1, kCGLineCapRound);//设置首尾样式

 CGContextStrokePath(ctx1);//绘画路径

 // 2.左侧内弧

 CGContextRef smallCtx1 = UIGraphicsGetCurrentContext();

 CGContextSetLineWidth(smallCtx1, 8);//线的宽度

 CGContextSetRGBStrokeColor(smallCtx1, 145/255.0, 216/255.0, 220/255.0, 1);//改变画笔颜色

 CGContextAddArc(smallCtx1,  kSCREEN_WIDTH / 2, kSCREEN_HEIGHT * 3/10, kSCREEN_WIDTH/2 - 40, -M_PI*7/6 , - M_PI*5/6 - M_PI/3*(0.9999 - self.hum), 0);

 CGContextSetLineCap(smallCtx1, kCGLineCapRound);//设置首尾样式

 CGContextStrokePath(smallCtx1);//绘画路径

 // 3.右侧外弧

 CGContextRef ctx2 = UIGraphicsGetCurrentContext();

 CGContextSetLineWidth(ctx2, 15.0);//线的宽度

 CGContextSetRGBStrokeColor(ctx2, 230/255.0, 230/255.0, 230/255.0, 1);//改变画笔颜色

 CGContextAddArc(ctx2, kSCREEN_WIDTH / 2, kSCREEN_HEIGHT * 3/10, kSCREEN_WIDTH/2 - 40, M_PI/6, -M_PI/6, 1);

#warning - x1,y1跟p1形成一条线的坐标p2,x2,y2结束坐标跟p3形成一条线的p3,radius半径,注意, 需要算好半径的长度, CGContextAddArcToPoint(context, 148, 68, 148, 180, 100);

 CGContextSetLineCap(ctx2, kCGLineCapRound);//设置首尾样式

 CGContextStrokePath(ctx2);//绘画路径

 // 4.右侧内弧

 CGContextRef smallCtx2 = UIGraphicsGetCurrentContext();

 CGContextSetLineWidth(smallCtx2, 8);//线的宽度

 CGContextSetRGBStrokeColor(smallCtx2, 222/255.0, 208/255.0, 229/255.0, 1);//改变画笔颜色

 CGContextAddArc(smallCtx2,  kSCREEN_WIDTH / 2, kSCREEN_HEIGHT * 3/10, kSCREEN_WIDTH/2 - 40, M_PI*1/6, M_PI*1/6 - M_PI/3*(self.tem + 0.0001), 1);

 CGContextSetLineCap(smallCtx2, kCGLineCapRound);//设置首尾样式

 CGContextStrokePath(smallCtx2);//绘画路径

}

+ (instancetype)quartz2DView

{

    return [[self alloc] init];

}

#pragma mark - 通过init方法初始化

- (instancetype)initWithFrame:(CGRect)frame

{

    if (self = [super initWithFrame:frame]) {

        [self  setUpSubViews];

    }

 return  self;

}

#pragma mark - 通过解档/加载xib/或者storyboard初始化

- (instancetype)initWithCoder:(NSCoder *)decoder

{

    if (self = [super initWithCoder:decoder]) {

        [self  setUpSubViews];

    }

 return  self;

}

/**

 *  初始化所有的子控件并且进行一次性设定

 */

- (void)setUpSubViews

{

    UIButton *iconBtn = [[UIButton alloc] init];

    iconBtn.backgroundColor = [UIColor  yellowColor];

    [self addSubview:iconBtn];

    self.iconBtn = iconBtn;

    [NSTimer  scheduledTimerWithTimeInterval:0.1  target:self  selector:@selector(setNeedsDisplay) userInfo:nil  repeats:YES];

}

#pragma mark - 拿到真实的尺寸后在这里进行子控件的布局

- (void)layoutSubviews

{

#warning - 一定要调用super

    [super  layoutSubviews];

    CGFloat iconBtnX = self.frame.size.width * 0.5;

    CGFloat iconBtnH = 180;

    CGFloat iconBtnY = 100 + iconBtnH * 0.5;

    CGFloat iconBtnW = iconBtnH;

    self.iconBtn.layer.cornerRadius = iconBtnW / 2;

    self.iconBtn.center = CGPointMake(iconBtnX, iconBtnY);

    self.iconBtn.bounds = CGRectMake(0, 0, iconBtnW, iconBtnH);

}

@end

//

//  ZZViewController.h

//  08-动态绘图

//

//  Created by 周昭 on 2017/3/27.

//  Copyright © 2017年 ZZ. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface ZZViewController : UIViewController

@end

//

//  ZZViewController.m

//  08-动态绘图

//

//  Created by 周昭 on 2017/3/27.

//  Copyright © 2017年 ZZ. All rights reserved.

//

#import "ZZViewController.h"

#import "ZZQuartz2DView.h"

@interface  ZZViewController ()

@property (nonatomic, weak) ZZQuartz2DView *quartz2DView;

@end

@implementation ZZViewController

- (void)viewDidLoad {

 // 1.初始化界面

    [self  setUpQuartz2DView];

}

#pragma mark - setUp初始化

/**

 *  动态绘图view

 */

- (void)setUpQuartz2DView

{

 ZZQuartz2DView *quartz2DView = [ZZQuartz2DView  quartz2DView];

    quartz2DView.backgroundColor = [UIColor whiteColor];

#warning - 根据自己写的来设定frame

    CGFloat quartz2DViewX = 0;

    CGFloat quartz2DViewY = 64;

    CGFloat quartz2DViewW = self.view.frame.size.width;

    CGFloat quartz2DViewH = self.view.frame.size.height * 0.5;

    quartz2DView.frame = CGRectMake(quartz2DViewX, quartz2DViewY, quartz2DViewW, quartz2DViewH);

    [self.view addSubview:quartz2DView];

    self.quartz2DView = quartz2DView;

}

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

推荐阅读更多精彩内容