CALayer的應(yīng)用

再次說明本系列文章是我在通攔學(xué)習(xí)iOS開發(fā)中回顧時覺得有必要再加深印象的地方,如有不準確歡迎批評指正,如果幫到讀者理解學(xué)習(xí)就更好了。

CALayer

UIView VS CALayer

相對于UIView CALayer在更下面一層布局,view持有l(wèi)ayer 所以都有view.layer 來對view設(shè)置其layer 關(guān)于layer有哪些屬性及方法不再多說

CALayer旋轉(zhuǎn)tranform是3D的,UIview是2D的

CALayer可以做顯示(陰影、圓角、邊框、遮罩、變換...) 動畫

//CALayer展示

CALayer* layer1=[[CALayeralloc]init];

layer1.backgroundColor=[UIColor grayColor].CGColor;

layer1.frame=CGRectMake(100,100,150,150);

//layer的坐標系也是在左上角原點

//設(shè)置layer的邊框

layer1.borderColor=[UIColor blackColor].CGColor;

layer1.borderWidth=2;

// 設(shè)置layer的圓角

layer1.cornerRadius=20;

//contents可以用來設(shè)置圖片

layer1.contents=(id)[UIImage ImageNamed:@"..."];

//不讓子layer超出父layer的范圍

layer1.masksToBounds=YES;

屬性介紹position 與 anchorPoint

position相當于view的center ,但當anchorPoint改變時就不是center了而是錨點的坐標,anchorPoint相當于一張紙被一個圖釘定住只可以繞著圖釘轉(zhuǎn),這個圖釘?shù)奈恢镁褪莂nchorPoint這張紙就是layer,anchorPonit是CGPoint類型的取值范圍是(0-1,0-1)

默認情況下錨點是(0.5,0.5)

如上述代碼將layer1的錨點設(shè)置為(0,0),position的坐標就變成的(175,175) frame是(175,175,150,150);

公式position.x=anchorPonit.x*frame.size.width+frame.origin.x ? ? y值一樣,把x換y


Mask Layer

? ? UIImageView* image=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"1.jpg"]];

? ? image.frame=CGRectMake(50,150,200,250);

? ? image.contentMode=UIViewContentModeScaleAspectFill;

? ? [self.viewaddSubview:image];

? ? UIImageView*imageMask=[[UIImageViewalloc]init];

? ? imageMask.image=[[UIImage imageNamed:@"imageMask.png"]stretchableImageWithLeftCapWidth:14 topCapHeight:28];

? ? imageMask.frame=image.bounds;

? ? image.layer.mask=imageMask.layer;

GAGrandient Layer

? ? //漸變顏色

? ? CAGradientLayer*layer=[[CAGradientLayer alloc]init];

? ? layer.frame=CGRectMake(100,100,150,150);

? ? [layersetColors:@[

?? ? ? ? ? ? ? ? ? ? ? (id)[UIColoryellowColor].CGColor,

?? ? ? ? ? ? ? ? ? ? ? (id)[UIColorgreenColor].CGColor,

?? ? ? ? ? ? ? ? ? ? ? (id)[UIColorblueColor].CGColor

?? ? ? ? ? ? ? ? ? ? ? ]];

? ? //默認為從上至下

? ? //使用漸變分割線

? ? [layersetLocations:@[@0.25,@0.5,@0.75]];

? ? //漸變方向 startpoint endpoint (0-1,0-1);

? ? [layersetStartPoint:CGPointMake(0, 0)];

? ? [layersetEndPoint:CGPointMake(1, 0)];

? ? [self.view.layeraddSublayer:layer];

//作為mask

UIImageView *imageView=[[UIImageView alloc]init]; ?

imageView.image=[UIImage imageNamed:@"nature.jpg"]; ? ?

imageView.contentMode=UIViewContentModeScaleAspectFill; ??

imageView.frame=CGRectMake(100, 260,150,100); ? ?

?[self.view addSubview:imageView]; ?? ? ? ??

//鏡像效果 ? ?

UIImageView* mirrorImgView=[[UIImageView alloc]init]; ? ??

mirrorImgView.image=imageView.image; ? ??

mirrorImgView.contentMode=UIViewContentModeScaleAspectFill; ? ??

//翻轉(zhuǎn) ? ??

mirrorImgView.transform=CGAffineTransformMakeScale(1, -1); ? ?

mirrorImgView.frame=CGRectMake(0, 0, 150, 100); ? ??

mirrorImgView.center=CGPointMake(imageView.center.x, imageView.center.y+imageView.bounds.size.height); ??

[self.view addSubview:mirrorImgView]; ?? ? ? ??

CAGradientLayer* GDlayer=[CAGradientLayer layer]; ? ??

GDlayer.frame=CGRectMake(0, 0, 150, 100);?

[GDlayer setColors:@[(id)[UIColor clearColor].CGColor, ?(id)[UIColor colorWithWhite:0 alpha:0.5].CGColor ]]; ? ?

[GDlayer setStartPoint:CGPointMake(0, 0.7)]; ? ?

[GDlayer setEndPoint:CGPointMake(0, 1)]; ? ??

mirrorImgView.layer.mask=GDlayer;


CAShaperLayer

用以繪制形狀、CGPath

? ? CAShapeLayer *shapeLayer=[CAShapeLayer layer];

? ? shapeLayer.strokeColor=[UIColor redColor].CGColor;

? ? shapeLayer.fillColor=[UIColor clearColor].CGColor;

? ? [self.view.layeraddSublayer:shapeLayer];

? ? CGMutablePathRef path=CGPathCreateMutable();

? ? CGPathMoveToPoint(path,nil,50,200);

? ? CGPathAddCurveToPoint(path,nil,100,100,250,300,300,200);

? ? shapeLayer.path=path;

? ? CGPathRelease(path);

beizer曲線

? ? CAShapeLayer* slayer=[CAShapeLayer layer];

? ? CGPointstartPoint=CGPointMake(50,200);

? ? CGPointendPoint=CGPointMake(300,200);

? ? CGPointcontrolPoint1=CGPointMake(100,100);

? ? CGPointcontrolPoint2=CGPointMake(250,300);

? ? UIBezierPath* path=[UIBezierPath bezierPath];

? ? [pathmoveToPoint:startPoint];

? ? [pathaddCurveToPoint:endPointcontrolPoint1:controlPoint1controlPoint2:controlPoint2];

? ? slayer.path=path.CGPath;

? ? slayer.strokeColor=[UIColor redColor].CGColor;

? ? slayer.fillColor=[UIColor clearColor].CGColor;

? ? //矩形

? ? UIBezierPath* path2=[UIBezierPath bezierPathWithRect:CGRectMake(100, 100, 200, 200)];

? ? slayer.path=path2.CGPath;

? ? //[self.view.layer addSublayer:slayer];

? ? //帶圓角的矩形 還有圓形等其他圖形

? ? UIBezierPath* path3=[UIBezierPath bezierPathWithRoundedRect:CGRectMake(100, 100, 200, 200) cornerRadius:100];

? ? slayer.path=path3.CGPath;

? ? [self.view.layeraddSublayer:slayer];

//畫圖 ponit點我是隨便寫的主要想說明方法

UIBezierPath *bezierPath=[UIBezierPath bezierPath];

[bezierPath moveToPoint:CGPointMake(0, 0)]; ? ??

[bezierPath addLineToPoint:CGPointMake(10,20)]; ? ??

[bezierPath addCurveToPoint:CGPointMake(100, 200) controlPoint1:CGPointMake(50, 50) controlPoint2:CGPointMake(70, 120)]; ? ??

[bezierPath closePath];

自定義Layer?

調(diào)用時要將opaque置為0 當用法二時還要調(diào)用一下 setNeedDisplay ,法二的優(yōu)先級高

//方法1

- (void)drawRect:(CGRect)rect {

? ? CGContextRef ctx=UIGraphicsGetCurrentContext();

? ? CGContextAddRect(ctx, CGRectMake(50, 50, 100, 100));

? ? CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);

? ? CGContextFillPath(ctx);

}

//方法二

-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx{

? ? CGContextAddRect(ctx, CGRectMake(50, 50, 100, 100));

? ? CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);

? ? CGContextFillPath(ctx);

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容