Layer

1. CALayer.transform和UIView.transform

* CALayer.transform屬性是是個CATransform3D類型的數(shù)據(jù),默認值為CATransform3DIdentity

* CGAffineTransform 是用于2D層面的, 操作的是UIView或者其他 2D Core Graphics 元素惑申。

* CATransform3D 是 Core Animation的結(jié)構(gòu)體,是用來做更復(fù)雜的關(guān)于 CALayer 的3D操作具伍。

* CATransform3D定義了一個三維變換(4x4的矩陣),用于圖層的偏移圈驼、旋轉(zhuǎn)人芽,縮放,歪斜和透視等效果绩脆。

* 需要了解相關(guān)的3D變換方法:CATransform3DMakeTranslation萤厅,CATransform3DMakeScale,CATransform3DMakeRotation衙伶,以及CATransform3DTranslate祈坠,CATransform3DScale,CATransform3DRotate矢劲。

* CATransform3D.m34表示透視效果赦拘,但需要和CATransform3DRotate配合使用才有效果。也就是前提是z方向上有變化(即沿x軸或者y軸旋轉(zhuǎn)之后)。




Q:如何做出圓角


切圓角


CALayer

1.圖層

2.顯示和做動畫

3.UIView背后的TA




是同樣的效果





Layer也是以左上角作為原點的长豁。



1.第一句話意思是設(shè)置半徑是10 2.第二句是不會讓子view超過父view的范圍系羞,或者說是子layer超過父layer的范圍癣蟋。



1.position是這個點在superlayer的位置坐標志衍。anchorPoint是layer在進行動畫的過程當中一個很重要的參照點谢肾“颍可以根據(jù)anchorPoint進行旋轉(zhuǎn)黔漂。







1.第一行 會把self.view.layer里所有的layer都打印


CALayer 和 UIview的區(qū)別

1.UIView :負責接收用戶點擊的觸摸屏view扮演的角色

2.CALayer :負責展示界面

3.UIView是對CALayer的一個封裝


UIResponder響應(yīng)用戶的各種事件






Layer使用


一捎谨、不規(guī)則形狀的圖片


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

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

? ? imageView.contentMode = UIViewContentModeScaleAspectFill;

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

? ? [self.viewaddSubview:imageView];


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

//? ? imageViewMask.image = [[UIImage imageNamed:@"imageMask.png"] stretchableImageWithLeftCapWidth:54 topCapHeight:48];

#warning aware!!

? ? //這里需要勘誤一下民效。錄制時當時沒用3x切圖,所以圓角處有點模糊

? ? imageViewMask.image = [[UIImage imageNamed:@"imageMask.png"] stretchableImageWithLeftCapWidth:18 topCapHeight:16];

? ? imageViewMask.frame= imageView.bounds;//將這個不規(guī)則的范圍設(shè)置成imageview的范圍涛救。

? ? imageView.layer.mask= imageViewMask.layer;將這個layer到layer.mask

二畏邢、漸變








?上圖效果代碼如下


CAGradientLayer *layer = [CAGradientLayer layer];

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

? ? [layersetColors:@[

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

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

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

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

? ? ? ? ? ? ? ? ? ? ? ]]; //設(shè)置從左到右的顏色


? ? [layersetLocations:@[@0.25, @0.5, @0.75,@0.95]];//默認分割線,從左到右設(shè)置需要逐級遞增,取值范圍0-1

? ? [layersetStartPoint:CGPointMake(0, 0)];//起點

? ? [layersetEndPoint:CGPointMake(1, 1)];//終點

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


CAGradientLayer? 常用mask layer

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

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

? ? imageView.contentMode = UIViewContentModeScaleAspectFill;

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

? ? [self.viewaddSubview:imageView];


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

? ? mirrorImageView.image= imageView.image;

? ? mirrorImageView.contentMode = UIViewContentModeScaleAspectFill;//內(nèi)容類型

? ? mirrorImageView.transform = CGAffineTransformMakeScale(1, -1);//圖片向下翻轉(zhuǎn)達到一個鏡像的目的检吆。

? ? mirrorImageView.bounds= imageView.bounds;

? ? mirrorImageView.center=CGPointMake(imageView.center.x, imageView.center.y+ imageView.bounds.size.height); //找到圖片的中心

? ? [self.viewaddSubview:mirrorImageView];

//上面這部分是鏡像制作

==========================================================

? ? CAGradientLayer *gradientLayer = [CAGradientLayer layer];//制作遮罩

? ? gradientLayer.frame=CGRectMake(0, 0, imageView.frame.size.width, imageView.frame.size.height);

? ? [gradientLayersetColors:@[(id)[UIColor clearColor].CGColor,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (id)[UIColorcolorWithWhite:0alpha:0.4].CGColor]];

? ? gradientLayer.startPoint=CGPointMake(0, 0.7);

? ? gradientLayer.endPoint=CGPointMake(0, 1);

? ? mirrorImageView.layer.mask= gradientLayer;



CASHapeLayer

1.繪制普通的曲線


- (void)testCAShapeLayerWithoutBezier

{

? ? 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);

}



蘋果封裝好的貝塞爾曲線


- (void)testCAShapeLayerWithBezier

{

? ? CAShapeLayer *shapeLayer = [CAShapeLayer layer];

? ? CGPointstartPoint =CGPointMake(50, 200);

? ? CGPointendPoint =CGPointMake(300, 200);

? ? CGPointcontrolPoint1 =CGPointMake(100, 100);

? ? CGPointcontrolPoint2 =CGPointMake(250, 300);

?//設(shè)置路徑

? ? UIBezierPath *path = [UIBezierPath bezierPath];

? ? [path moveToPoint:startPoint]; //設(shè)置起點

? ? [pathaddCurveToPoint:endPointcontrolPoint1:controlPoint1controlPoint2:controlPoint2]; //用貝塞爾曲線繪制路徑

? ? shapeLayer.path= path.CGPath;

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

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

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

}


繪制一個正方形

- (void)testCAShapeLayerWithBezier//繪制一個正方形

{

? ? CAShapeLayer *shapeLayer = [CAShapeLayer layer];

? ? shapeLayer.strokeColor = [UIColor orangeColor].CGColor;//繪制線條顏色

? ? shapeLayer.fillColor = [UIColor clearColor].CGColor;//繪制圖形內(nèi)部顏色

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

? ? shapeLayer.path= path2.CGPath;

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

}

用貝塞爾曲線裁剪

- (void)testShapeLayerMask

{

? ? UIView*bgView = [[UIViewalloc]init];

? ? bgView.backgroundColor = [UIColor clearColor];

? ? bgView.frame=CGRectMake(50, 100, 300, 200);

? ? [self.viewaddSubview:bgView];


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

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

? ? imageView.contentMode = UIViewContentModeScaleAspectFill;

? ? imageView.frame= bgView.bounds;

? ? [bgViewaddSubview:imageView];


? ? UIBezierPath *maskPath = [UIBezierPath bezierPath];

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


? ? CGFloatcurveHeight = 40;

? ? CGFloatcurveBeginHeight = imageView.frame.size.height- curveHeight;

? ? [maskPath addLineToPoint:CGPointMake(0, curveBeginHeight)];


? ? CGPointcurveEndPoint =CGPointMake(imageView.frame.size.width, imageView.frame.size.height- curveHeight);

? ? CGPointcontrolPoint =CGPointMake(imageView.frame.size.width/ 2, imageView.frame.size.height+ 20);

? ? [maskPath addQuadCurveToPoint:curveEndPointcontrolPoint:controlPoint];


? ? [maskPath addLineToPoint:CGPointMake(imageView.frame.size.width, 0)];

? ? [maskPathclosePath];


? ? CAShapeLayer *maskLayer = [CAShapeLayer layer];

? ? maskLayer.frame= imageView.bounds;

? ? maskLayer.path= maskPath.CGPath;

? ? //you can try

//? ? [bgView.layer addSublayer:maskLayer];

? ? bgView.layer.mask= maskLayer;

}


貝塞爾動畫繪制圓形

- (void)testCAShapeLayerAnimation

{

? ? CAShapeLayer *shapeLayer = [CAShapeLayer layer];

? ? shapeLayer.frame=CGRectMake(100, 100, 100, 100);

? ? UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:shapeLayer.bounds];//定義了一個圓環(huán)形的路徑

? ? shapeLayer.path= path.CGPath;

? ? shapeLayer.fillColor = [UIColor clearColor].CGColor;//內(nèi)部顏色

? ? shapeLayer.lineWidth= 2.0f;//線條寬度

? ? shapeLayer.strokeColor = [UIColor orangeColor].CGColor;//繪制線條是橘黃色

? ? shapeLayer.strokeEnd= 0;//這樣設(shè)置一開始看不到線條的

? ? [self.view.layer addSublayer:shapeLayer];


? ? CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];

? ? pathAnimation.duration= 3.0f;

? ? pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

? ? pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f];//從0

? ? pathAnimation.toValue = [NSNumber numberWithFloat:1.0f];//到1

? ? pathAnimation.fillMode = kCAFillModeForwards;//向前進行繪制

? ? pathAnimation.removedOnCompletion=NO;

? ? [shapeLayeraddAnimation:pathAnimationforKey:@"strokeEndAnimation"];

}


復(fù)文本舒萎,CATextLayer比UILabel有更好的性能表現(xiàn)

- (void)testTextLayer

{

? ? CATextLayer *textLayer = [CATextLayer layer];

? ? textLayer.contentsScale = [UIScreen mainScreen].scale;

? ? textLayer.foregroundColor = [UIColor blackColor].CGColor;

? ? textLayer.backgroundColor = [UIColor orangeColor].CGColor;

? ? textLayer.wrapped=YES;

? ? textLayer.alignmentMode = kCAAlignmentLeft;


? ? //font

? ? UIFont *font = [UIFont systemFontOfSize:12];

? ? CGFontRef fontRef = CGFontCreateWithFontName((__bridge CFStringRef)font.fontName);

? ? textLayer.font= fontRef;

? ? textLayer.fontSize= font.pointSize;

? ? CGFontRelease(fontRef);//這里注意


? ? textLayer.frame=CGRectMake(50, 50, 200, 200);

? ? [self.view.layer addSublayer:textLayer];


? ? NSString *text = @"它聰明、熟悉每個用戶的喜好蹭沛,從海量音樂中挑選出你可能喜歡的音樂臂寝。它通過你每一次操作來記錄你的口味。你提供給云音樂的信息越多摊灭,它就越了解你的音樂喜好咆贬。";


? ? textLayer.string= text;


? ? //rich text 復(fù)文本

? ? NSMutableAttributedString *string = [[NSMutable AttributedString alloc] initWithString:text];

? ? [string addAttribute:(NSString *)kCTForegroundColorAttributeName

?? ? ? ? ? ? ? ? ? value:(__bridge id)[UIColor yellowColor].CGColor

?? ? ? ? ? ? ? ? ? range:NSMakeRange(1, 2)];//指定文本顏色是黃色,區(qū)域是從INdex為1的位置帚呼,向后兩個字展示為黃色


? ? [string addAttribute:(NSString *)kCTFontAttributeName

?? ? ? ? ? ? ? ? ? value:[UIFontfontWithName:@"Arial"size:20]

?? ? ? ? ? ? ? ? ? range:NSMakeRange(1, 2)];//同樣的區(qū)域素征,更改了一下字體。

//kCTUnderlineStyleAttributeName:@(kCTUnderlineStyleSingle)增加了下劃線的效果

//? (__bridge id)kCTForegroundColorAttributeName:(__bridge id)[UIColor blueColor].CGColor 更改了字體的顏色

? ? NSDictionary *attrs = @{(__bridge id)kCTUnderlineStyleAttributeName:@(kCTUnderlineStyleSingle),

? ? ? ? ? ? ? ? ? ? ? ? ? ? (__bridge id)kCTForegroundColorAttributeName:(__bridge id)[UIColor blueColor].CGColor};

? ? [stringsetAttributes:attrsrange:NSMakeRange(text.length- 5, 4)];


? ? textLayer.string= string;

}


- (void)testViewDrawRect

{

? ? NTESTestView *testView = [[NTESTestView alloc] init];//這個類實現(xiàn)了drawrect的方法

? ? [self.viewaddSubview:testView];


? ? testView.frame=CGRectMake(10, 10, 200, 200);

? ? testView.layer.backgroundColor = [UIColor orangeColor].CGColor;

? ? testView.opaque=NO;//當我們自定義UIVIew的drawrect方法時候萝挤,所以需要設(shè)置為NO,才能讓drawrect的方法生效

}

#import? "NTESTestView.h"

- (void)drawRect:(CGRect)rect { ? ?

// Drawing code? ? ?自定義的drawRect

CGContextRef ctx=UIGraphicsGetCurrentContext(); ?? ? ? ?

CGContextAddRect(ctx, CGRectMake(50, 50, 100, 100)); ?? ? ? ? CGContextSetRGBFillColor(ctx, 1, 0, 0, 1); ?? ? ?

? CGContextFillPath(ctx); ?? ? ?

? //avoid using if not override

// [self.layer drawInContext:ctx]; }


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

{

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


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


? ? CGContextFillPath(ctx);

}

#import "NTESCustomLayerViewController.h"

- (void)testViewDrawRect

{

? ? NTESTestView *testView = [[NTESTestView alloc] init];

? ? [self.viewaddSubview:testView];


? ? testView.frame=CGRectMake(10, 10, 200, 200);

? ? testView.layer.backgroundColor = [UIColor orangeColor].CGColor;

? ? testView.opaque=NO;

? ? [testView.layer setNeedsDisplay];//需要設(shè)置layer才能觸發(fā)UIView自定義的drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx

}


兩個方法都實現(xiàn)根欧,會使用drawLayer的方法怜珍,不實現(xiàn)drawrect的方法


1.第一步這樣實現(xiàn),調(diào)用會實現(xiàn)NTESTestLayer的方法


會執(zhí)行這個TestLayer方法凤粗,這樣就實現(xiàn)了調(diào)用自定義的draw的方法




最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酥泛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嫌拣,更是在濱河造成了極大的恐慌柔袁,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件异逐,死亡現(xiàn)場離奇詭異捶索,居然都是意外死亡,警方通過查閱死者的電腦和手機灰瞻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門腥例,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辅甥,“玉大人,你說我怎么就攤上這事燎竖×” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵构回,是天一觀的道長夏块。 經(jīng)常有香客問我,道長纤掸,這世上最難降的妖魔是什么脐供? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮茁肠,結(jié)果婚禮上患民,老公的妹妹穿的比我還像新娘。我一直安慰自己垦梆,他們只是感情好匹颤,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著托猩,像睡著了一般印蓖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上京腥,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天赦肃,我揣著相機與錄音,去河邊找鬼公浪。 笑死他宛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的欠气。 我是一名探鬼主播厅各,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼预柒!你這毒婦竟也來了队塘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宜鸯,失蹤者是張志新(化名)和其女友劉穎憔古,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淋袖,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鸿市,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灸芳。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡涝桅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烙样,到底是詐尸還是另有隱情冯遂,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布谒获,位于F島的核電站蛤肌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏批狱。R本人自食惡果不足惜裸准,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赔硫。 院中可真熱鬧炒俱,春花似錦、人聲如沸爪膊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽推盛。三九已至峦阁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耘成,已是汗流浹背榔昔。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瘪菌,地道東北人撒会。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像师妙,于是被迫代替她去往敵國和親茧彤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容