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

news/2024/7/5 23:57:55

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

 

 

//

//  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

 

 

 

 

 


http://www.niftyadmin.cn/n/541526.html

相关文章

如何上传base64编码图片到七牛云

接口说明 POST /putb64/<Fsize>/key/<EncodedKey>/mimeType/<EncodedMimeType>/crc32/<Crc32>/x:user-var/<EncodedUserVarVal> Host: upload.qiniu.com Authorization: UpToken <UpToken> Content-Type: application/octet-stream<Bas…

区块链毕设资料【2019-1】

2019独角兽企业重金招聘Python工程师标准>>> 区块链作为一种崭新的、颠覆性的技术&#xff0c;是国内外活跃的研究领域和毕业设计选题方向。本文列出最新的一组区块链方面的论文&#xff0c;希望可以对选择区块链毕业设计的同学们有所帮助&#xff0c;这是汇智网编辑…

八个造成 Android 应用内存泄露的原因

八个造成 Android 应用内存泄露的原因 转载 2016年07月22日 22:37:03 原文链接 : Eight Ways Your Android App Can Leak Memory原文作者 : Tom Huzij译文出自 : 掘金翻译计划译者 : zhangzhaoqi校对者: Jasper Zhong&#xff0c;江湖迈杰 诸如 Java 这样的 GC &#xff08;…

iOS开发-模仿动态增加或者删除cell并自动增加变化高度

今天给同学们讲一下在项目开发中我们经常会碰到这样的需求&#xff0c;动态的添加或者删除某一行显示数据并且重新布局Frame&#xff0c;那么废话不多说&#xff0c;直接上代码&#xff01;先看演示视频&#xff1a; // // ZZCustomAddView.h // 动态变化frame // // Cr…

BZOJ4300:绝世好题(DP)

Description 给定一个长度为n的数列ai&#xff0c;求ai的子序列bi的最长长度&#xff0c;满足bi&bi-1!0(2<i<len)。Input 输入文件共2行。第一行包括一个整数n。第二行包括n个整数&#xff0c;第i个整数表示ai。Output 输出文件共一行。包括一个整数&#xff0c;表示…

开始记录

测试&#xff01;转载于:https://www.cnblogs.com/Aldj/articles/5810195.html

iOS开发-JS与原生OC互相调用之JavaScriptCore

## 近期由于工作和个人的闲置没有及时的更新博客&#xff0c;为此对各位同学表示抱歉&#xff0c;那么废话不多说&#xff0c;今天我们就聊聊那些在iOS中JS与原生OC互相调用,那么废话不多说,直接上代码&#xff5e; 本文摘抄自&#xff1a;https://hjgitbook.gitbooks.io/ios/…

c#安全性、稳定性、高性能需要注重的点

1、弱事件 2、类型安全&#xff08;包括类型转换时可能的异常&#xff09; 3、线程安全 5、装箱和拆箱 6、闭包传递局部变量时可能遇到的问题。 7、用于dictionary的键&#xff0c;要同时实现GetHashCode和Equals的重写并且满足一定规则。 8、重写操作符特别是类型强制转换符的…