iOS之DrawRect

    xiaoxiao2022-06-29  34

    DrawRect,iOS重绘视图的方法,我们用的Label、View、button等,他们的形状默认都是矩形的,最多也就是加个圆角,变成椭圆或则圆形而已,但是如果我们想要个五角星形的呢?三角形的呢?举个栗子��,微信的对话框旁边是不是有个小三角的形状加一个矩形,那他是怎么实现的呢,这就用到iOS的重绘机制,DrawRect啦。

    DrawRect是关于UIView及其子类的重绘,他们要重绘需要调用一个方法

    -(void)drawRect:(CGRect)aRect; 它的参数是CGRect ,是一个矩形的区域,当然这个参数只是规定你所重绘区域的大小

    还有一点要注意!!!!!!!!!!!!!!

    不要去自己调用drawRect方法,他不是给我们来调用的,是系统自己调用,但是我们怎么去使用呢,系统给了我们两个方法

    //方法一 重绘这个View [self setNeedsDisplay]; //方法二 重绘某个矩形区域 [self setNeedsDisplayInRect:rect]; 好,现在我们来看看怎么画一个不规则的图形,来人!上代码!!!!

    慢着!还有准备工作,就是先要创建一个UIView或则其子类的类,然后在。。。。。。上代码!

    //首先写个drawRect的方法,中间我写了好多种绘制方法 - (void)drawRect:(CGRect)rect { // Drawing code //绘制一条线段 [self p_drawLine]; //绘制一条多端点的线 [self p_drawLines]; //绘制一条弧 [self p_drawArc]; //绘制一条贝塞尔曲线 [self p_drawCurve]; //画一个矩形 [self p_drawOneRect]; //绘制椭圆 [self p_drawEllipse]; }

    //绘制一条线段 -(void)p_drawLine{ //获取绘制目标, 当绘制引擎调用drawRect方法进行视图渲染的时候, 回自动为我们创建一个绘制目标, 相当于一块画布,关联我们需要绘制的内容 CGContextRef context = UIGraphicsGetCurrentContext(); //设置一个起点坐标,绘制系统回追踪至该点进行绘制 //参数一: 关联的绘制目标 //参数二: 起点的x坐标 //参数三: 起点的y坐标 CGContextMoveToPoint(context, 100, 100); //设置一条线上的端点 //参数一: 关联的绘制目标 //参数二: 该端点的x坐标 //参数三: 起点的y坐标 CGContextAddLineToPoint(context, 200, 100); //设置描边的颜色 //方法一 // CGContextSetRGBStrokeColor(context, 0, 0, 1, 1.0); //方法二 [[UIColor blackColor] setStroke]; //设置描边的宽度 CGContextSetLineWidth(context, 20); //描边 CGContextStrokePath(context); } //绘制一条多端点的线 // (100, 100) (200, 100) (200, 200) (100, 200) -(void)p_drawLines{ CGContextRef context = UIGraphicsGetCurrentContext(); //方法一 // CGContextMoveToPoint(context, 100, 100); // CGContextAddLineToPoint(context, 200, 100); // CGContextAddLineToPoint(context, 200, 200); // CGContextAddLineToPoint(context, 100, 200); // CGContextSetLineWidth(context, 5); // [[UIColor blueColor] setStroke]; // CGContextStrokePath(context); //方法二 通过数组绘制一条多端点的线 CGPoint pointArray[] = {CGPointMake(100, 40), CGPointMake(200, 100), CGPointMake(200, 200), CGPointMake(100, 200)}; //参数1: 关联的目标 //参数2: 数组 //参数3: 数组元素个数 CGContextAddLines(context, pointArray, sizeof(pointArray) / sizeof(CGPoint)); //设置填充颜色 //方法一 // CGContextSetRGBFillColor(context, 1, 0, 0, 1.0); //方法二 [[UIColor whiteColor] setFill]; //闭合一段路径 CGContextClosePath(context); CGContextSetLineWidth(context, 2); [[UIColor blueColor] setStroke]; // CGContextStrokePath(context); // CGContextFillPath(context); //绘制路径 // CGContextDrawPath(context, kCGPathEOFillStroke); } //绘制一条弧 -(void)p_drawArc{ CGContextRef context = UIGraphicsGetCurrentContext(); //绘制一条弧度 //参数1: 关联绘制目标 //参数2: 原点的坐标x //参数3: 原点的坐标y //参数4: 半径 //参数5: 起始弧度 //参数6: 结束弧度 //参数7: 绘制方向(0为顺时针, 1为逆时针) CGContextAddArc(context, 100, 100, 50, 180 * (M_PI / 180), 360 * (M_PI / 180), 1); CGContextStrokePath(context); } //绘制一条贝塞尔曲线 -(void)p_drawCurve{ CGContextRef context = UIGraphicsGetCurrentContext(); CGContextMoveToPoint(context, 100, 100); //绘制贝塞尔曲线 //参数1: 关联绘制目标 //参数2: 控制点1的x坐标 //参数3: 控制点1的y坐标 //参数4: 控制点2的x坐标 //参数5: 控制点2的y坐标 //参数6: 终点的x坐标 //参数7: 终点的y坐标 CGContextAddCurveToPoint(context, 150, 50, 250, 300, 300, 100); CGContextSetLineWidth(context, 5); [[UIColor blueColor] setStroke]; CGContextStrokePath(context); } //画一个矩形 -(void)p_drawOneRect{ CGContextRef context = UIGraphicsGetCurrentContext(); //绘制矩形 //参数1: 关联绘制目标 //参数2: 绘制位置大小 CGContextAddRect(context, CGRectMake(100, 100, 100, 100)); CGContextStrokePath(context); } //绘制椭圆 -(void)p_drawEllipse{ CGContextRef context = UIGraphicsGetCurrentContext(); //绘制椭圆 //参数1: 关联绘制目标 //参数2: 绘制位置大小 CGContextAddEllipseInRect(context, CGRectMake(100, 100, 100, 150)); CGContextStrokePath(context); } 我感觉我的注释已经很详细啦,本来还想查个效果图,但是我感觉你萌自己回去试试应该会有惊喜的,挺好玩的,刚学的时候我写了个简易版的绘画板,玩了一天(话说我也是够无聊的。。。)。

    每周一段:(Ps:不知道你们看完笑没笑,我感觉我的笑点还算高的了。。。)

    有人买了一只鹦鹉,想让它学会文明用语,于是每天早晨经过它时都说,早安。话说这天早上他精神不太好,经过它时什么也没说,鸟儿冷冷的瞪着他说:喂,老头,牛了啊哈,竟然都不向我问好了。

    转载请注明原文地址: https://ju.6miu.com/read-1125273.html

    最新回复(0)