iOS学习笔记之CoreGraphics框架
2013-03-19 18:21
393 查看
很多时候,当你需要设计更高级的UI或者是减少设计师的工作量的时候,我们就需要用代码自行绘制UI,而自行绘制UI就需要用到CoreGraphics这个框架(OpenGL更高阶,目前还没达到这个水准)。
CGContext类,相当于Android里面的Canvas,使用UIGraphicsGetCurrentContext()获取当前CGContext的引用CGContextRef。我们在每一次的绘制之前都应该保存下原来的状态,待绘制完成后再恢复回原来的状态。所以CGContextSaveGState(ctx);… CGContextRestoreGState(ctx);都应该成对的出现,在他们之间的是绘制UI的代码。
CGPath类用于描述绘制的区域或者路线。在CGContext中addLine,addRect,其实都是在添加path,在添加完成path以后我们可以选择是fill该path,还是stroke该path。设置相应的颜色以及线宽即可。如果我们只需要在某个区域中绘制,我们可以在描述完path以后使用CGContextClip(ctx)来裁剪当前画布。
CGAffineTransform是一个仿射变换的结构体,相当于一个矩阵,用于进行二维平面的几何变换(平移,旋转,缩放),而且这些几何变换都已经有封装好的函数可调用,变换的顺序就是矩阵连乘的顺序,切不可把矩阵连乘的顺序放反,否则得到的结果可能不一样。
CGColorSpace类是用于界面颜色显示,通常颜色组成为RGBA(红,绿,蓝,透明度)四种,使用CGColorSpaceCreateDeviceRGB获取CGColorSpace的引用CGColorSpaceRef,需要注意的是,在CoreGraphics中,使用create方法生成的引用,最后都需要调用release方法释放掉,如CGColorSpaceCreateDeviceRGB()对应的就是CGColorSpaceRelease(rgb)。
CGContext类,相当于Android里面的Canvas,使用UIGraphicsGetCurrentContext()获取当前CGContext的引用CGContextRef。我们在每一次的绘制之前都应该保存下原来的状态,待绘制完成后再恢复回原来的状态。所以CGContextSaveGState(ctx);… CGContextRestoreGState(ctx);都应该成对的出现,在他们之间的是绘制UI的代码。
CGPath类用于描述绘制的区域或者路线。在CGContext中addLine,addRect,其实都是在添加path,在添加完成path以后我们可以选择是fill该path,还是stroke该path。设置相应的颜色以及线宽即可。如果我们只需要在某个区域中绘制,我们可以在描述完path以后使用CGContextClip(ctx)来裁剪当前画布。
CGAffineTransform是一个仿射变换的结构体,相当于一个矩阵,用于进行二维平面的几何变换(平移,旋转,缩放),而且这些几何变换都已经有封装好的函数可调用,变换的顺序就是矩阵连乘的顺序,切不可把矩阵连乘的顺序放反,否则得到的结果可能不一样。
CGColorSpace类是用于界面颜色显示,通常颜色组成为RGBA(红,绿,蓝,透明度)四种,使用CGColorSpaceCreateDeviceRGB获取CGColorSpace的引用CGColorSpaceRef,需要注意的是,在CoreGraphics中,使用create方法生成的引用,最后都需要调用release方法释放掉,如CGColorSpaceCreateDeviceRGB()对应的就是CGColorSpaceRelease(rgb)。
展开代码+ (UIImage *)gradientCircleImgWithCenterColor:(UIColor *)centerColor endColor:(UIColor *)endColor radius:(CGFloat)radius { UIColor *colors[] = {centerColor, endColor}; UIGraphicsBeginImageContext(CGSizeMake(radius*2.0f, radius*2.0f)); [[UIColor clearColor] setFill]; CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB(); size_t numberOfComponents = CGColorGetNumberOfComponents(centerColor.CGColor); int numberOfColors = sizeof(colors)/sizeof(colors[0]); CGFloat colorComponents[numberOfColors*numberOfComponents]; for (int i=0; i<numberOfColors; i++) { UIColor *color = colors[i]; const CGFloat *components = CGColorGetComponents(color.CGColor); for (int j=0; j<numberOfComponents; j++) { colorComponents[i*numberOfComponents+j] = components[j]; } } CGFloat locations[] = {0.0f, 1.0f}; CGGradientRef gradient = CGGradientCreateWithColorComponents(rgb, colorComponents, locations, sizeof(locations)/sizeof(locations[0])); CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSaveGState(ctx); CGContextAddRect(ctx, CGRectMake(0.0f, 0.0f, radius*2.0f, radius*2.0f)); CGContextClip(ctx); // CGContextSetShadowWithColor(ctx, CGSizeMake(-10.0f, -5.0f), 10.0, UIColorFromHex(0x222222).CGColor); // CGContextDrawRadialGradient(ctx, gradient, CGPointMake(radius, radius), 0.0f, CGPointMake(radius, radius), radius-30.0f, 0); CGFloat offset = 10.0f; CGFloat radiusOffset = 12.0f; CGContextSetShadowWithColor(ctx, CGSizeMake(10.0f, 5.0f), 7.0f, UIColorFromHex(0x222222).CGColor); CGContextDrawRadialGradient(ctx, gradient, CGPointMake(radius*1.5f-offset, radius*1.5f-offset), 0.0f, CGPointMake(radius*1.5f-offset, radius*1.5f-offset), radius*0.5f-radiusOffset, 0); CGContextSetShadowWithColor(ctx, CGSizeMake(-10.0f, -5.0f), 7.0f, UIColorFromHex(0x222222).CGColor); CGContextDrawRadialGradient(ctx, gradient, CGPointMake(radius*0.5f+offset, radius*0.5f+offset), 0.0f, CGPointMake(radius*0.5f+offset, radius*0.5f+offset), radius*0.5f-radiusOffset, 0); CGContextSetShadowWithColor(ctx, CGSizeMake(-10.0f, 5.0f), 7.0f, UIColorFromHex(0x222222).CGColor); CGContextDrawRadialGradient(ctx, gradient, CGPointMake(radius*0.5f+offset, radius*1.5f-offset), 0.0f, CGPointMake(radius*0.5f+offset, radius*1.5f-offset), radius*0.5f-radiusOffset, 0); CGContextSetShadowWithColor(ctx, CGSizeMake(10.0f, -5.0f), 7.0f, UIColorFromHex(0x222222).CGColor); CGContextDrawRadialGradient(ctx, gradient, CGPointMake(radius*1.5f-offset, radius*0.5f+offset), 0.0f, CGPointMake(radius*1.5f-offset, radius*0.5f+offset), radius*0.5f-radiusOffset, 0); CGGradientRelease(gradient); CGColorSpaceRelease(rgb); CGContextSetShadow(ctx, CGSizeMake(0.0f, 0.0f), 1.0f); CGContextSetFillColorWithColor(ctx, UIColorFromHex(0x00ff00).CGColor); CGContextBeginPath(ctx); CGContextAddArc(ctx, radius*0.5f+offset, radius*0.5f+offset, radius*0.5f-radiusOffset, M_PI_2, 0.0, 1); CGContextAddArc(ctx, radius*1.5f-offset, radius*0.5f+offset, radius*0.5f-radiusOffset, M_PI, M_PI_2, 1); CGContextAddArc(ctx, radius*1.5f-offset, radius*1.5f-offset, radius*0.5f-radiusOffset, -M_PI_2, -M_PI, 1); CGContextAddArc(ctx, radius*0.5f+offset, radius*1.5f-offset, radius*0.5f-radiusOffset, 0.0, -M_PI_2, 1); CGContextClosePath(ctx); CGContextFillPath(ctx); CGContextSetLineWidth(ctx, 2.0f); CGContextSetStrokeColorWithColor(ctx, UIColorFromHex(0xeeeeee).CGColor); CGContextStrokeRect(ctx, CGRectMake(radius*0.5f+offset, radius*0.5f+offset, radius-2.0f*offset, radius-2.0f*offset)); CGContextRestoreGState(ctx); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // [UIImagePNGRepresentation(image) writeToFile:[kCachePath stringByAppendingPathComponent:@"circle.png"] atomically:YES]; return image; }
相关文章推荐
- iOS学习笔记之CoreGraphics框架
- iOS学习笔记之CoreGraphics框架
- 【IOS学习】Core Graphics 框架学习笔记,以及demo
- 【IOS学习】Core Graphics 框架学习笔记,以及demo
- iOS学习笔记之QuartzCore框架
- iOS学习笔记之QuartzCore框架
- iOS学习笔记之QuartzCore框架
- Core Graphics 框架学习笔记,以及demo
- iOS学习笔记之QuartzCore框架
- iOS学习笔记之QuartzCore框架
- iOS学习笔记之QuartzCore框架
- 媒体层图形技术之Core Graphics 框架 学习笔记
- IOS Core Animation Advanced Techniques的学习笔记(五)
- iOS底层绘图机制,CoreGraphics框架,和Context使用详解
- IOS学习之 CoreFoundation框架
- Core Graphics框架学习之在图片上绘制文字
- ios 框架学习笔记
- iOS开发CoreGraphics核心图形框架之七——图像处理
- iOS绘图框架CoreGraphics分析
- IOS学习笔记 运用Quartz 2D框架绘图理论基础(1)