再次說明本系列文章是我在通攔學(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);
}