CoreAnimation之CALayer细说
首先CGImageRef 与 UIImage相互转换
//CGImageRef转换成UIImage CGImageRef iOffscreen = CGBitmapContextCreateImage(context); UIImage* image = [UIImage imageWithCGImage: iOffscreen]; //UIImage转换成CGImageRef UIImage *loadImage=[UIImage imageNamed:@"comicsplash.png"]; CGImageRef cgimage=loadImage.CGImage;
之所以需要转换,渲染这张图片一定是目的了,CGImage和CGImageRef这两个应当是用来重绘图形的类,它们在应用时是按照图像的像素矩阵来绘制图片的。
继续,将图片放入CALayer准备渲染
CALayer *theLayer; // create the layer and set the bounds and position theLayer=[CALayer layer]; theLayer.position=CGPointMake(50.0f,50.0f); theLayer.bounds=CGRectMake(0.0f,0.0f,100.0f,100.0f); theLayer.contents=theImage;
委托函数
首次加载(首次绘制时调用),也可以手动调用(setNeedsDisplay或者setNeedsDisplayInRect:的消息,或者把图层的needsDisplayOnBoundsChange属性值设置为YES)同样会调用委托函数
//绘制图层内容(图片)
- (void)displayLayer:(CALayer *)theLayer { // check the value of the layer's state key if ([[theLayer valueForKey:@"state"] boolValue]) { // display the yes image theLayer.contents=[someHelperObject loadStateYesImage]; } else { // display the no image theLayer.contents=[someHelperObject loadStateNoImage]; } }
如果你必须重绘图层的内容,而不是通过加载图片
- (void)drawLayer:(CALayer *)theLayer inContext:(CGContextRef)theContext { CGMutablePathRef thePath = CGPathCreateMutable(); CGPathMoveToPoint(thePath,NULL,15.0f,15.f); CGPathAddCurveToPoint(thePath, NULL, 15.f,250.0f, 295.0f,250.0f, 295.0f,15.0f); CGContextBeginPath(theContext); CGContextAddPath(theContext, thePath ); CGContextSetLineWidth(theContext, [[theLayer valueForKey:@"lineWidth"] floatValue]); CGContextStrokePath(theContext); // release the path CFRelease(thePath); }
Layer的 contentsGravity
属性的缩放常量
kCAGravityResize -- 缩放内容图像以填充层边界,可能无视内容的自然比例,这是默认值。
kCAGravityResizeAspect -- 缩放内容图像使其竟可能占满层边界显示,但他仍然保持自然比例。
kCAGravityResizeAspectFill -- 缩放内容图片使其占满层显示,但仍保持自然比例。这可能导致内容超越到层边界之外。
CALayer的contentsGravity允许你在层的边界内定位和缩放层的contents图像。内容图像默认填充整个层的边界,忽略图像自然的宽高比例。
kCAGravityTopLeft 将内容图像定位到层的左上角。
kCAGravityTop 将内容图像定位到层的上边缘的水平居中位置。
kCAGravityTopRight 将内容图像定位到层的右上角。
kCAGravityLeft 将内容图像定位到层的左边缘的垂直居中位置。
kCAGravityCenter 将内容图像定位到层的中心。
kCAGravityRight 将内容图像定位到层的右边缘的垂直居中位置。
kCAGravityBottomLeft 将内容图像定位到层的左下角。
kCAGravityBottom 将内容图像定位到层的下边缘的水平居中位置。
kCAGravityBottomRight 将内容图像定位到层的右下角。
UIView使用layer属性
UIView *viewWaitting = [[[UIView alloc] initWithFrame:CGRect_ViewWaiting_Frame] autorelease]; [viewWaitting setBackgroundColor:[UIColor blackColor]]; [viewWaitting setAlpha:0.8]; //设置透明度 viewWaitting.layer.masksToBounds = YES; viewWaitting.layer.cornerRadius = 8;//设置圆角弧度