- (void)drawRect:(CGRect)rect
{
[selfdrawText];
}
#pragma mark 绘制文本
/*
IOS7 定义的字典里面存储了很多文本的属性
下面代码演示了在某一个点绘制文本和在区域内(矩形)内显示文本以及换行
竖排的显示
*/
- (void)drawText
{
NSString *text =@"床前明月光 疑是地上霜 举头望明月 低头思故乡";
UIFont *font = [UIFontsystemFontOfSize:20];
UIColor *redColor = [UIColorredColor];
//设置文本的字体属性
NSDictionary *dic =@{NSFontAttributeName: font,
NSForegroundColorAttributeName:redColor};
//设置文本换行 这个方法在iOS7已经被废弃了
// [text sizeWithFont:font constrainedToSize:(100,10000) lineBreakMode:NSLineBreakByCharWrapping];
// 设置文本行 指定了个区域 就是在矩形内绘图 CGSizeMake(20,10000) 一行显示一个字成了竖排
CGRect rect = [textboundingRectWithSize:CGSizeMake(20,10000)options:NSStringDrawingUsesLineFragmentOriginattributes:dic context:nil];
//在指定的坐标点 其实是矩形的左上角(坐标)绘制文本
[text drawAtPoint:CGPointMake(10,200) withAttributes:dic];
//设置为文本的背景色
[[UIColorlightGrayColor] set];
UIRectFill(rect);
//在指定区域内绘制文本行
[text drawInRect:rectwithAttributes:dic];
}
#pragma mark 绘制图像一种是指定坐标点进行绘图 一种是指定区域内绘制
- (void)drawImage
{
//这样绘制的图像只能显示不能和用户进行任何交互但是性能比OC中的UIImageView高
UIImage *image = [UIImageimageNamed:@"头像1.png"];
// 1、在指定点坐标为(80,110)绘图
//[image drawAtPoint:CGPointMake(80, 110)];
/*
2、在指定区域内拉伸绘图
bounds属性:描述当前视图在其自身坐标系统中的位置和大小
*/
//[image drawInRect:self.bounds]; // 显示效果将图片拉伸占满整个屏幕
/*
3、平铺绘图
*/
[image drawAsPatternInRect:self.bounds];
}
#pragma mark 绘制弧线
- (void)drawArc
{
CGContextRef context =UIGraphicsGetCurrentContext();
/*
绘制弧线方法参数:
CGContextRef c context对象
CGFloat x, y 弧线所在圆上的圆心
CGFloat radius 圆半径
startAngle 开始角度 值为0表示圆最右侧的点
endAngle 结束角度 值为M_PI_2为90度 - M_PI_2表示值为270度
int clockwise 0 表示顺时针 1表示逆时针
*/
[[UIColorredColor] set];
//以坐标(180,240)为圆心 40为半径从最右侧的点开始顺时针绘制90度的圆弧
CGContextAddArc(context, 180, 240, 40,0, M_PI_2, 0);
CGContextDrawPath(context,kCGPathStroke);
}
#pragma mark 绘制圆和椭圆(指定一个正方形(矩形)内切圆就是圆(椭圆))
- (void)drawCicle
{
// 获取上下文
CGContextRef context =UIGraphicsGetCurrentContext();
// IOS中绘制圆要先绘制矩形绘制出来的圆内切矩形
CGRect rect = CGRectMake(50,60, 100, 200); // 内切就是椭圆
//CGRect rect = CGRectMake(50, 60, 200, 200); // 内切就是圆
// 在矩形内添加椭圆 AddEllipseInRect
CGContextAddEllipseInRect(context, rect);
// 绘制
[[UIColoryellowColor] set];
CGContextDrawPath(context,kCGPathFill);
}
#pragma mark 绘制矩形
- (void)drawRectangle
{
//矩形四个点 因此先定义四个点是以(40,50)为坐标点,然后向右(为宽)200向下(为高)120
CGRect rect = CGRectMake(40,50, 200, 120);
//设置线条和填充颜色
[[UIColorbrownColor] set];
// 绘制实心
UIRectFill(rect);
CGRect rect1 = CGRectMake(100,110, 50, 50);
[[UIColorblueColor] set];
// 绘制空心
UIRectFrame(rect1);
}
/*
对比利用上下文绘制三角形和直线发现代码只多了俩行:
CGContextAddLineToPoint(context, 100, 200);
CGContextAddLineToPoint(context, 100, 100);
在上下文中又添加了俩个点这意味着:
形成的三角形是将上下文中所有的点的轨迹走了一遍而形成的图形
也可以理解是:在上下文中确定了一个点,然后在点的基础上增加了三条线那也是三角形啊!!
因此在上下文中指定特殊的点就可以形成特殊的几何图形
最后一条线的代码是: CGContextAddLineToPoint(context, 100, 100);
可以用关闭上下文路径:CGContextClosePath(context);
在这里这两行代码形成的效果是等效的都是三角形,但是后一句意味着整个上下文中的路径已经关闭就不能再绘图了而前者还可以继续
*/
#pragma mark 利用上下文绘制三角形
- (void)drawTriangleWithContext
{
// 1.获取上下文
CGContextRef context =UIGraphicsGetCurrentContext();
// 2.直接在上下文中设置路径
// 2.1 将上下文中的默认原点移动到100 100
CGContextMoveToPoint(context,100, 100);
// 2.2 将上下文中点再移动到100 110
CGContextAddLineToPoint(context,200, 200);
CGContextAddLineToPoint(context,300, 200);
//CGContextAddLineToPoint(context, 100, 100);
CGContextClosePath(context);
// 3.指定绘图的颜色
// [[UIColor redColor] setStroke]; // 设置边线颜色
// [[UIColor blueColor] setFill]; // 设置填充颜色
[[UIColorredColor] set]; // 设置边线和填充颜色
// 4.填充并绘制上下文中的图形默认是黑色但是如果已经指定颜色则不覆盖
CGContextDrawPath(context,kCGPathFillStroke);
}
/**
绘制一条直线使用了俩种方法:
1、直接利用上下文绘图 drawLineWithContext
2、使用路径绘图 drawLine
两个方法代码对比:
1 比较简单不用指定路径,但是由于没有指定路径而只有点因此比较死板
2 需要指定路径,但是灵活性高因此可以把 其中设置路径的代码抽出来定义一个方法createLinePath
因为可以指定路径因此还可以用在核心动画中,比如说指定视图运动的轨迹
*/
#pragma mark 利用上下文绘制直线
- (void)drawLineWithContext
{
// 1.获取上下文
CGContextRef context =UIGraphicsGetCurrentContext();
// 2.直接在上下文中设置路径
// 2.1 将上下文中的默认原点移动到100 100
CGContextMoveToPoint(context,100, 100);
// 2.2 将上下文中点再移动到100 110
CGContextAddLineToPoint(context,200, 200);
// 3.为绘制的图形指定颜色
[[UIColorredColor] setStroke];
// 4.绘制上下文如果不指定颜色 默认是黑色
CGContextDrawPath(context,kCGPathFillStroke);
}
#pragma mark 创建路径
- (CGPathRef)createLinePath
{
CGMutablePathRef path =CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 0, 0);
CGPathAddLineToPoint(path,NULL, 100, 100);
return path;
}
#pragma mark 直接绘制直线
- (void)drawLine
{
// 1获取当前视图中的上下文 右边方法将原点修改为左上角(0,0)包含状态栏
CGContextRef context =UIGraphicsGetCurrentContext();
// 2创建一个自由路径 含有create使用完毕必须释放
CGMutablePathRef path =CGPathCreateMutable();
// 两点确定一条直线 那就得两个点了
//2.1移动到某一个点 NUll表示不使用形变(形变指的是图形的颜色的改变)后俩个参数指的是:将路径中默认的原点移动到 x=100 y=100
CGPathMoveToPoint(path, NULL, 0, 0);
// 2.2 增加一条直线
CGPathAddLineToPoint(path,NULL,360,200);
// 3 将路径添加到上下文
CGContextAddPath(context,path);
// 4设置上下文的属性 设置线条颜色为红色
CGContextSetRGBStrokeColor(context,1.0, 0, 0,1);
// 5将上下文中的路径绘制出来
CGContextDrawPath(context,kCGPathStroke);
// 6释放路径 这句代码涉及到内存管理:在C语言中含有creat或者copy函数所创建的对象,使用完毕后必须释放否则内存泄漏
CGPathRelease(path);
}
@end