quartz2D:
1.模态modal===========================
//在跳转之前的页面设置模态页面 CHTwoController *two = [[CHTwoController alloc] init]; //给即将要弹出的模态控制器包装一个导航控制器 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewContrller:two]; //弹出模态视图 [self presentViewController:nav animated:YES completion:^{} //关闭模态视图:由于一个控制器是以模态形式展现出来,在关闭时,可以调用该控制器或者该控制器的自控制器让控制器消失 //self dismissViewControllerAnimated:YES completion:^{} self.navigationController dismissViewControllerAnimated:YES completion:^{}
2.绘制基本图形:===========================
//获取图形上下文(保存图形,并且决定输出目标)
CGContextRef ctx = UIGraphicsGetCurrentContext();
2.1线条:
//起点: CGContextMoveToPoint(ctx,10,100); //终点: CGContextAddLineToPoint(ctx,100,100); //状态: CGContextSetRGBStrokeColor(ctx,1.0,0,0,1.0);//红色,1.0,0,0 是比例值:255/255.0 最后的1.0表示alpha CGContextSetLineCap(ctx,kCGLineCapRound);//线段两端的样式 CGContextSetLineJoin(ctx,kCGLineJoinRound);//线段转角的样式 CGContextStrokePath(ctx);//空心的线段 ,CGContextFillPath(ctx) 实心的样式
2.2三角形:
//由于是封闭的形状,可以使用关闭起点和终点的方法完成最后的封闭
CGContextClosePath(ctx);
2.3四边形:
//只需要提供起点和宽高就可以 CGContextAddRect(ctx,CGRectMake(10,10,150,100)); //使用c语言方法颜色绘制 CGContextSetRGBStrokeColor(); CGContextSetRGBFillColor(); //可以使用OC的方法进行颜色绘制 [[UIColor purpleColor] setFill]; [[UIColor blueColor] setStroke];// 这两种方法,只能一次设置空心/实心一种方式 [[UIColor black] set];//这种方式可以同时设置空心和实心
2.4画圆:
//第一种方式,使用限定矩形框范围
CGContextAddEllipseInRect(ctx,CGRectMake(50,100,50,50));
//使用旋转,圆心在100,100 半径50 从0角度开始,到360结束,1为逆时针方向画
CGContextAddArc(ctx,100,100,50,0,2*M_PI,1);
2.5画弧:
//思路就是线画一个圆弧线,在自动关闭,填充
CGContextAddArc(ctx,100,100,50,M_PI_2,M_PI,0);
CGContextClosePath(ctx);
2.6画饼:
//思路就是画一条线,接着画一个弧,最后自动关闭
CGContextMoveToPoint(ctx,100,100); CGContextAddLineToPoint(ctx,100,150); CGContextAddArc(ctx,100,100,50,M_PI_2,M_PI,0); CGContextClosePath(cxt);
2.7画文字:
//第一种,只在一行显示,不换行
//Attribute是一个字典类型,存储的是各种颜色,大小等设置 NSMutableDictionary *md = [NSMutableDictionary dictionary]; md[NSForegroundColorAttributeName] = [UIColor redColor]; md[NSFontAttributeName] = [UIFont systemFontOfSize:20]; [str drawAtPoint:CGPointMake(10,10) withAttributes:md];
//第二种,将文字绘制到一个指定的范围内,可以换行,但超出后不显示
[str drawInRect:CGRectMake(50,50,100,100) withAttributes:nil];
//2.8画图:
//第一种方式:从指定位置开始画图 [image drawAtPoint:CGPointMake(0,0)]; //第二种方式:绘制图片到layer,图片有所拉伸 [image drawInRect:CGRectMake(0,0,200,200)]; //第三种方式:绘制到layer,图片平铺 [[image drawPatternInRect:CGRectMake(0,0,320,480)]; //设置图片的阴影,最后一个参数blur表示模糊度,越大越模糊 CGContextSetShadow(ctx,CGSizeMake(10,10),10);
3.图形上下文栈 :===========================
//由于要在同一个画布上可能会绘制很多不同的形状,这个时候需要使用图形上下文栈来复制并保存出来纯净的上下文来绘制其他的形状
CGContextRef ctx = UIGraphicsGetCurrentContext(); //保存第一份图形上下文 CGContextSaveGState(ctx); //保存第二份图形上下文 CGContextSaveGState(ctx); //在原来图形上下文中绘制 。。。。。 //还原第一份 CGContextRestoreGState(ctx); //绘制第一份 CGContextMoveToPoint(ctx,80,30); CGContextAddLineToPoint(ctx,80,150); //还原第二份 CGContextRestoreGState(ctx); //绘制第二份 CGContextMoveToPoint(ctx, 200, 30); CGContextAddLineToPoint(ctx, 80, 150); //渲染 CGContextStrokePath(ctx);
4.矩阵操作:===========================
CGContextRef ctx = UIGraphicsGetCurrentContext();
//设置矩阵操作 必须 在添加矩阵之前调用
//这个操作就是让矩阵进行形变
CGContextRotateCTM(ctx,M_PI_4);//转角度 CGContextScaleCTM(ctx,1.8,1.8);//放大缩小 CGContextTranslateCTM(ctx,0,250);//移动位置 CGContextAddRect(ctx,CGRectMake(200,100,100,100)); CGContextStrokePath(ctx);
5.刷帧:===========================
//通过Slider的移动,来改变圆的大小说明刷帧
/*
1.移动Slider,通过触发的事件,传入了移动的sender值
2.在控制器中接受这个数据来设置圆的半径,调用引入的self.circleView.radius = sender.value,调用了圆这个视图
3.在圆视图中,重写setRadius方法,设置完_radius = radius,通知自定义view重新绘制图形
[self setNeedsDisplay];
4.一调用继承UIVIew的自定义view,就会调用drawRect方法,在这个方法中重新绘制
5.图片第一次调用时,调用了awakeFromNib方法,可以在这里设置圆的初始半径大小
*/
6.刷帧动画:===========================
//第一种方法:NSTime
//这个方法可以写在initWithCoder中,initWithCoder是在当前View由StoryBoard或Xib创建时会自动调用
[NSTime scheduledTimerWithTimeInterval: 0.1 target:self selector:@selector(updataImage) userInfo:nil repeats:YES];
//第二种方法:CADisplayLink,默认60帧/秒
//这个方法也可以写在awakeFromNib(只调用一次)中,可以通过以下方式循环使用 CADisplayLink *display = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateImage)]; [display addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; //方法updateImage,这个方法中执行重新绘图操作 [ self setNeedsDisplay];
7.路径:===========================
//在CGContextMoveToPoint(ctx,10,10)方法中,默认创建了路径 //这里手动创建路径看看 CGMutablePathRef pathCtx = CGPathCreateMutable(); CGPathMoveToPoint(pathCtx,NULL,10,10); CGPathAddLineToPoint(pathCtx,NULL,100,100); CGContextAddPath(ctx,pathCtx); //最后渲染 CGContextStrokePath(ctx); //这里注意: //凡是通过quartz2D中带有create/copy/retain方法创建出来的值,都要手动释放,一定记住了 CGPathRelease(path);//或者CFRelease(path);
8.绘制bitmap:===========================
//加载图片 //创建一个bitmap上下文,参数1:将来创建出bitmap大小,参数2:透明,参数3:缩放比例 UIGraphicsBeginImageContextWithOptions(CGSizeMake(200,200),NO,0); //获取刚创建的bitmap上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); //在这个上下文中绘图 CGContextAddEllipseInRect(ctx,CGRectMake(0,0,300,300)); //渲染 CGContextStrokePath(ctx); //最后可以获取到生成的图片 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); //还可以保存生成的图片到文件中,先转化成二进制数据,再写入文件 NSData *data = UIImagePNGRepresentation(image);//UIImageJPEGRepresentation(image,1); [data writeToFile:@"/Users/apple/Desktop/abc.png" atomically:YES];
9.图片剪切:===========================
这里完成一个大圆内部绘制一个小圆,让图片显示在小圆内
关键步骤:
//加载图片 UIImage *image = [UIImage imageName:icon]; //创建图片上下文 CGFloat margin = 10 CGSize size = CGSizeMake(image.size.width +margin,image.size.height+margin); UIGraphicsBeginImageContextWithOptions(size,NO,0); //绘制大圆,获取刚创建bitmap上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextAddEllipseInRect(ctx,CGRectMake(0,0,size.width,size.height)); [[UIColor greenColor] set]; CGContextFillPath(ctx); //绘制小圆,由于使用的方块画圆,所以方块的起点小一点就可以了 CGContextAddEllipseInRect(ctx,margin*0.5,margin*0.5,image.size.width,image.size.height); //指定范围, CGContextClip(ctx); //绘制图片,把图片的宽高设置为小圆的宽高 [image drawInRect:CGRectMake()]; //取出图片显示 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();