IOS 中CALayer繪制圖片的實(shí)例詳解
IOS 中CALayer繪制圖片的實(shí)例詳解
CALayer渲染內(nèi)容圖層。與UIImageView相比,不具有事件響應(yīng)功能,且UIImageView是管理內(nèi)容。
注意事項(xiàng):如何使用delegate對象執(zhí)行代理方法進(jìn)行繪制,切記需要將delegate設(shè)置為nil,否則會導(dǎo)致異常crash。
CALayer繪制圖片與線條效果圖:

代碼示例:
CGPoint position = CGPointMake(160.0, 200.0); CGRect bounds = CGRectMake(0.0, 0.0, 150.0, 150.0); CGFloat cornerRadius = 150.0 / 2; CGFloat borderWidth = 2.0;
// 陰影層 CALayer *layerShadow = [[CALayer alloc] init]; layerShadow.position = position; layerShadow.bounds = bounds; layerShadow.cornerRadius = cornerRadius; layerShadow.borderWidth = borderWidth; layerShadow.borderColor = [UIColor whiteColor].CGColor; layerShadow.shadowColor = [UIColor grayColor].CGColor; layerShadow.shadowOffset = CGSizeMake(2.0, 1.0); layerShadow.shadowOpacity = 1.0; layerShadow.shadowRadius = 3.0; [self.view.layer addSublayer:layerShadow];
// 容器層 CALayer *layerContant = [[CALayer alloc] init]; // 添加到父圖層 [self.view.layer addSublayer:layerContant]; // 圖層中心點(diǎn)、大小(中心點(diǎn)和大小構(gòu)成frame) layerContant.position = position; layerContant.bounds = bounds; // 圖層背景顏色 layerContant.backgroundColor = [UIColor redColor].CGColor; // 圖層圓角半徑 layerContant.cornerRadius = cornerRadius; // 圖層蒙版、子圖層是否剪切圖層邊界 // layerContant.mask = nil; layerContant.masksToBounds = YES; // 邊框?qū)挾?、顏? layerContant.borderWidth = borderWidth; layerContant.borderColor = [UIColor whiteColor].CGColor; // 陰影顏色、偏移量、透明度、形狀、模糊半徑 // layerContant.shadowColor = [UIColor grayColor].CGColor; // layerContant.shadowOffset = CGSizeMake(2.0, 1.0); // layerContant.shadowOpacity = 1.0; // CGMutablePathRef path = CGPathCreateMutable(); // layerContant.shadowPath = path; // layerContant.shadowRadius = 3.0; // 圖層透明度 layerContant.opacity = 1.0;
// 繪制圖片顯示方法1 // 圖層形變 // 旋轉(zhuǎn)(angle轉(zhuǎn)換弧度:弧度=角度*M_PI/180;x上下對換、y左右對換、z先上下對換再左右對換;-1.0~1.0) // layerContant.transform = CATransform3DMakeRotation(M_PI, 0.0, 0.0, 0.0); // 縮放(0.0~1.0) // layerContant.transform = CATransform3DMakeScale(0.8, 0.8, 0.8); // 移動 // layerContant.transform = CATransform3DMakeTranslation(10.0, 1.0, 1.0); // 顯示內(nèi)容 [layerContant setContents:[UIImage imageNamed:@"header"].CGImage];
繪制圖片顯示方法2
layerContant.delegate = self;
[layerContant setNeedsDisplay];
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
// 繪圖
CGContextSaveGState(ctx);
// 圖形上下文形變,避免圖片倒立顯示
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextTranslateCTM(ctx, 0.0, -150.0);
// 圖片
UIImage *image = [UIImage imageNamed:@"header"];
CGContextDrawImage(ctx, CGRectMake(0.0, 0.0, 150.0, 150.0), image.CGImage);
CGContextRestoreGState(cox);
}
// 繪制實(shí)線、虛線
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
// 繪實(shí)線
// 線條寬
CGContextSetLineWidth(ctx, 1.0);
// 線條顏色
// CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);
CGContextSetStrokeColorWithColor(ctx, [UIColor greenColor].CGColor);
// 方法1
// 坐標(biāo)點(diǎn)數(shù)組
CGPoint aPoints[2];
aPoints[0] = CGPointMake(10.0, 50.0);
aPoints[1] = CGPointMake(140.0, 50.0);
// 添加線 points[]坐標(biāo)數(shù)組,和count大小
CGContextAddLines(ctx, aPoints, 2);
// 根據(jù)坐標(biāo)繪制路徑
CGContextDrawPath(ctx, kCGPathStroke);
// 方法2
CGContextSetLineWidth(ctx, 5.0);
CGContextSetStrokeColorWithColor(ctx, [UIColor purpleColor].CGColor);
CGContextMoveToPoint(ctx, 10.0, 60.0); // 起點(diǎn)坐標(biāo)
CGContextAddLineToPoint(ctx, 140.0, 60.0); // 終點(diǎn)坐標(biāo)
CGContextStrokePath(ctx); // 繪制路徑
// 繪虛線
// 線條寬
CGContextSetLineWidth(ctx, 2.0);
// 線條顏色
CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor);
// 虛線
CGFloat dashArray[] = {1, 1, 1, 1};
CGContextSetLineDash(ctx, 1, dashArray, 1);
// 起點(diǎn)
CGContextMoveToPoint(ctx, 10.0, 100.0);
// 終點(diǎn)
CGContextAddLineToPoint(ctx, 140.0, 100.0);
// 繪制路徑
CGContextStrokePath(ctx);
}
// 內(nèi)存管理,避免異常crash
- (void)dealloc
{
for (CALayer *layer in self.view.layer.sublayers)
{
if ([layer.delegate isEqual:self])
{
layer.delegate = nil;
}
}
NSLog(@"%@ 被釋放了~", self);
}
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
iOS Swift利用UICollectionView實(shí)現(xiàn)無限輪播功能(原理)詳解
無線輪播圖的實(shí)現(xiàn)方式有很多,下面這篇文章主要給大家介紹了關(guān)于iOS Swift利用UICollectionView實(shí)現(xiàn)無限輪播功能(原理)的相關(guān)資料,需要的朋友可以參考下2018-09-09
iOS用UITextField切換明文/密文顯示時末尾空白的問題解決
最近在工作中遇到一個問題,利用UITextField切換明文/密文顯示時發(fā)現(xiàn)字符串后面會出現(xiàn)一段空白,所以下面這篇文章主要給大家介紹了iOS用UITextField切換明文/密文顯示時末尾空白問題的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-05-05
iOS UIAlertController中UITextField添加晃動效果與邊框顏色詳解
這篇文章主要給大家介紹了關(guān)于iOS UIAlertController中UITextField添加晃動效果與邊框顏色的相關(guān)資料,實(shí)現(xiàn)后的效果非常適合在開發(fā)中使用,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來一起看看吧。2017-10-10
IOS開發(fā)Swift?與?OC相互調(diào)用詳解
這篇文章主要為大家介紹了IOS開發(fā)Swift?與?OC相互調(diào)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
IOS 自定義UICollectionView的頭視圖或者尾視圖UICollectionReusableView
這篇文章主要介紹了IOS 自定義UICollectionView的頭視圖或者尾視圖UICollectionReusableView的相關(guān)資料,需要的朋友可以參考下2017-01-01
iOS中UIAlertView3秒后消失的兩種實(shí)現(xiàn)方法
這篇文章主要介紹了iOS中UIAlertView3秒后消失的兩種實(shí)現(xiàn)方法,實(shí)現(xiàn)方法涉及到NSTimer和PerformSelector:withObject:afterDelay:方法的結(jié)合使用,需要的朋友可以參考下2017-12-12

