iOS之DrawRect

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:不知道你们看完笑没笑,我感觉我的笑点还算高的了。。。)

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值