专项使用图层

往期回看:序章第一章 - 图层树第二章 - 寄宿图第三章 - 图层几何第四章 - 视觉效果第五章 - 转换项目中央银行使的代码

前些天来学习某个专门的学业图层

本章节非常重要切磋了CALayer的一对子类以及用法,由于内容相当多,所谓分成上下两章,另外本章初始笔者会尽量多穿插一些与UIKit相关API的对比。

CAShapeLayer

CAShapeLayer能够说是个人感到最实用的二个CALayer的子类了,因为大家通过CGPath和CAShapeLayer来成立差异造型的图层。CAShapeLayer的帮助和益处如下:

事先我们学习到了不选取图片的场馆下用CGPath去组织大肆形状的阴影。假如大家能用一样的艺术创设一样形状的图层就好了。

  • 渲染火速。绘制同一图形比选用CoreGraphics更加快。
  • 内部存款和储蓄器利用率高。 CAShapeLayer不像经常的CALayer供给一个寄宿图形,所以无论CAShapeLayer多大都不会占有太多的内部存款和储蓄器。
  • 不会被图层边界剪开掉。
  • 不会像素化。

CAShapeLayer是一个透过矢量图形并不是bitmap来绘制的图层子类。你内定诸如颜色和线宽等属性,用CGPath来定义想要绘制的图样,最后CAShapeLayer就机关渲染出来了。当然,你也能够用Core Graphics直接向原始的CALyer的剧情中绘制五个路线,比较直下,使用CAShapeLayer有以下部分亮点:

创设多个CGPath

使用CAShapeLayer绘制分化形态的图层时大家注重运用CGPath来代表造型,同时还亟需弹指间多少个常用的质量:

  • lineWith 线宽
  • lineCap 线条的最后
  • lineJoin 线条之间的连接点必要小心的是那一个属性同三个图层只好设置三次。上面大家来绘制多个火柴人:

图片 1绘制血红的火柴人

使用CAShapeLayer绘制:

- viewDidLoad { [super viewDidLoad]; NSLog(@"Core Animation 开始绘制"); UIBezierPath *path = [[UIBezierPath alloc] init]; //这里使用了UIBezierPath 而不是像前几章直接使用 CGPathRef 可以有效地利用ARC来帮助我们管理内存 [path moveToPoint:CGPointMake]; [path addArcWithCenter:CGPointMake radius:25 startAngle:0 endAngle:2*M_PI clockwise:YES]; [path moveToPoint:CGPointMake]; [path addLineToPoint:CGPointMake]; [path addLineToPoint:CGPointMake]; [path moveToPoint:CGPointMake]; [path addLineToPoint:CGPointMake]; [path moveToPoint:CGPointMake]; [path addLineToPoint:CGPointMake]; CAShapeLayer *shapeLayer = [CAShapeLayer layer]; shapeLayer.strokeColor = [UIColor redColor].CGColor; shapeLayer.fillColor = [UIColor clearColor].CGColor; shapeLayer.lineWidth = 5; shapeLayer.lineJoin = kCALineJoinRound; shapeLayer.lineCap = kCALineCapRound; shapeLayer.path = path.CGPath; [self.containerView.layer addSublayer:shapeLayer]; NSLog(@"Core Animation 结束绘制");}

使用CoreGraphics绘制:

- drawRect:rect { NSLog(@"Core Graphics 开始绘制"); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineCap(context, kCGLineCapRound); CGContextSetLineWidth(context, 5); CGContextSetLineJoin(context, kCGLineJoinRound); CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); CGContextBeginPath; CGContextMoveToPoint(context, 175, 100); CGContextAddArc(context, 150, 100, 25, 0, 2*M_PI, NO); CGContextMoveToPoint(context, 150, 125); CGContextAddLineToPoint(context, 150, 175); CGContextAddLineToPoint(context, 125, 225); CGContextMoveToPoint(context, 150, 175); CGContextAddLineToPoint(context, 175, 225); CGContextMoveToPoint(context, 100, 150); CGContextAddLineToPoint(context, 200, 150); CGContextStrokePath; NSLog(@"Core Graphics 结束绘制");}

附带相比较一下双面绘制的时日,能够看来正是是如此简约的图纸,两个都早已反映出了一线的出入。CoreGraphics必要1到3阿秒的大运而ShapeLayer则只须要不到1微秒。

图片 2制图图形消耗时间

渲染急迅。CAShapeLayer使用了硬件加快,绘制同一图形会比用Core Graphics快非常多。

圆角

上文中涉嫌过cornerRadius属性,可感觉图层设置圆角,而CAShapeLayer能够绘制钦点的圆角,比如大家绘制三个有多个圆角和贰个直角的矩形:

CGRect rect = CGRectMake(50, 50, 100, 100);CGSize radii = CGSizeMake;UIRectCorner corners = UIRectCornerTopRight | UIRectCornerBottomRight | UIRectCornerBottomLeft;UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];

看名称就能够想到其意义,CATextLayer是用来绘制文字的。书中关系iOS6.0在此以前的UILabel是通过WebKit来贯彻绘制的,也正是说当文字量极大的时候绘制压力会十分大,使用CATextLayer渲染速度会比UILabel快相当多因为CATextLayer使用了Core Text,当然以往大家已经主导都适配到了iOS7.0上述,不过稍后作者要么会来相比较一下当下CATextLayerUILabel的渲染速度。

- viewDidLoad { [super viewDidLoad]; CATextLayer *textLayer = [CATextLayer layer]; textLayer.frame = self.labelView.bounds; [self.labelView.layer addSublayer:textLayer]; textLayer.foregroundColor = [UIColor blackColor].CGColor; textLayer.alignmentMode = kCAAlignmentJustified; textLayer.wrapped = YES; UIFont *font = [UIFont systemFontOfSize:15]; CFStringRef fontName = (__bridge CFStringRef)font.fontName; CGFontRef fontRef = CGFontCreateWithFontName; //CATextLayer的字体与字号是分开设置的 textLayer.font = fontRef; textLayer.fontSize = font.pointSize; CGFontRelease; NSString *text = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."; textLayer.string = text; }

图片 3行使CATextLayer渲染文字

能够看来大家的文件有点像素画了,大家得以应用前面提到的contentScale来调动一下。

textLayer.contentsScale = [UIScreen mainScreen].scale;

图片 4修补像素化后的文书

另外,CATextLayerstring性子并不是您想像的NSString类型,而是id类型。那样您不仅可以够用NSString也足以用NSAttributedString来内定文本了(注意,NSAttributedString并不是NSString的子类)。富文本字符串是iOS用来渲染字体风格的建制,它以一定的章程来支配钦命范围内的字符串的原本新闻,比如字体,颜色,字重,斜体等。

UILabel拓宽对照的结果如下:

- viewDidLoad { [super viewDidLoad]; NSLog(@"UILabel 开始渲染"); UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]; label.center = self.view.center; [self.view addSubview:label]; label.font = [UIFont systemFontOfSize:15]; label.numberOfLines = 0; label.textAlignment = NSTextAlignmentJustified; label.text = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."; NSLog(@"UILabel 结束渲染");}

图片 5UILabel与CATextLayer渲染速度相比

能够看出CATextLayer开支的年华反而越来越长,原因如下:

  • 最近运作的模拟器遭逢大于iOS6.0,所以UILabel也曾经应用了CoreText打开渲染,因为CATextLayer在渲染速度方面并不曾别的优势。
  • CATextLayer安装字体等属性必要特别创造非常多指标,并且须求自身管理内部存款和储蓄器,这导致了CATextLayer的一体化进程比现行的UILabel要慢。

故此小同伴们只要不是须求适配到iOS6.0以下的话是能够忽略掉CATextLayer的。

神速利用内部存储器。三个CAShapeLayer无需像一般CALayer一样创造一个投宿图形,所以不管有多大,都不会据有太多的内部存款和储蓄器。

富文本

上面大家来尝试用CATextLayer来渲染四个富文本字符串。须要注意的是大家使用了一些Core Text中的常量,所以您须求先引进Core Text才得以健康编译。

- viewDidLoad { [super viewDidLoad]; NSLog(@"CATextLayer 开始渲染"); CATextLayer *textLayer = [CATextLayer layer]; textLayer.frame = self.labelView.bounds; textLayer.contentsScale = [UIScreen mainScreen].scale; [self.labelView.layer addSublayer:textLayer]; textLayer.alignmentMode = kCAAlignmentJustified; textLayer.wrapped = YES; UIFont *font = [UIFont systemFontOfSize:15]; NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque massa arcu, eleifend vel varius in, facilisis pulvinar leo. Nunc quis nunc at mauris pharetra condimentum ut ac neque. Nunc elementum, libero ut porttitor dictum, diam odio congue lacus, vel fringilla sapien diam at purus. Etiam suscipit pretium nunc sit amet lobortis"; //create attributed string NSMutableAttributedString *string = nil; string = [[NSMutableAttributedString alloc] initWithString:text]; CFStringRef fontName = (__bridge CFStringRef)font.fontName; CGFloat fontSize = font.pointSize; CTFontRef fontRef = CTFontCreateWithName(fontName, fontSize, NULL); NSDictionary *attribs = @{ (__bridge id)kCTForegroundColorAttributeName:(__bridge id)[UIColor blackColor].CGColor, (__bridge id)kCTFontAttributeName: (__bridge id)fontRef }; [string setAttributes:attribs range:NSMakeRange(0, [text length])]; attribs = @{ (__bridge id)kCTForegroundColorAttributeName: (__bridge id)[UIColor redColor].CGColor, (__bridge id)kCTUnderlineStyleAttributeName: @(kCTUnderlineStyleSingle), (__bridge id)kCTFontAttributeName: (__bridge id)fontRef }; [string setAttributes:attribs range:NSMakeRange]; CFRelease; textLayer.string = string; NSLog(@"CATextLayer 结束渲染");}

图片 6CATextLayer渲染富文本字符串

同样的此处也奉上UILabel对应的本子。

- viewDidLoad { [super viewDidLoad]; NSLog(@"UILabel 开始渲染"); UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]; label.center = self.view.center; [self.view addSubview:label]; label.font = [UIFont systemFontOfSize:15]; label.numberOfLines = 0; label.textAlignment = NSTextAlignmentJustified; NSString *text = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."; NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:text]; NSDictionary *attribs = @{ NSForegroundColorAttributeName:[UIColor blackColor], NSFontAttributeName: label.font }; [string setAttributes:attribs range:NSMakeRange(0, [text length])]; attribs = @{ NSForegroundColorAttributeName: [UIColor redColor], NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle), NSFontAttributeName: label.font }; [string setAttributes:attribs range:NSMakeRange]; label.attributedText = string; NSLog(@"UILabel 结束渲染");}

不会被图层边界剪开掉。四个CAShapeLayer可以在边界之外绘制。你的图层路线不会像在利用Core Graphics的平日CALayer一样被剪开除。

营造一个UILabel的替代品

纵使现行反革命的UILabel曾经完全不逊色于CATextLayer了,大家依旧可以像书中那样自个儿用CATextLayer营造三个UILabel的替代品,尽管用处非常的小,可是很风趣不是啊。

咱俩创立三个UILabel的子类LayerLabel,由于UILabel使用的layer是中间类 _UILabelLayer,所以大家供给选取 +layerClass办法来暗自替换为大家的CATextLayer

@implementation LayerLabel+ layerClass{ //将默认的layer替换为CATextLayer return [CATextLayer class];}- (CATextLayer *)textLayer{ return (CATextLayer *)self.layer;}- setUp{ //从label中获取默认的属性 self.text = self.text; self.textColor = self.textColor; self.font = self.font; //按理来说对齐方式也应该使用label中原有的值 //但是那么做有些太过麻烦,所以这里先写死 [self textLayer].alignmentMode = kCAAlignmentJustified; [self textLayer].wrapped = YES; [self.layer display];}- initWithFrame:frame{ if (self = [super initWithFrame:frame]) { [self setUp]; } return self;}- awakeFromNib{ //让我们的label支持Interface Builder [self setUp];}- setText:(NSString *)text{ super.text = text; [self textLayer].string = text;}- setTextColor:(UIColor *)textColor{ super.textColor = textColor; [self textLayer].foregroundColor = textColor.CGColor;}- setFont:font{ super.font = font; CFStringRef fontName = (__bridge CFStringRef)font.fontName; CGFontRef fontRef = CGFontCreateWithFontName; [self textLayer].font = fontRef; [self textLayer].fontSize = font.pointSize; CGFontRelease;}@end

CATransformLayer 允许你将3D模型模块化,例如我们接下去要做的,创立三个四方。

- (CALayer *)faceWithTransform:(CATransform3D)transform{ //create cube face layer CALayer *face = [CALayer layer]; face.frame = CGRectMake(-50, -50, 100, 100); //apply a random color CGFloat red =  / INT_MAX); CGFloat green =  / INT_MAX); CGFloat blue =  / INT_MAX); face.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor; face.transform = transform; return face;}- (CALayer *)cubeWithTransform:(CATransform3D)transform{ //create cube layer CATransformLayer *cube = [CATransformLayer layer]; //add cube face 1 CATransform3D ct = CATransform3DMakeTranslation; [cube addSublayer:[self faceWithTransform:ct]]; //add cube face 2 ct = CATransform3DMakeTranslation; ct = CATransform3DRotate(ct, M_PI_2, 0, 1, 0); [cube addSublayer:[self faceWithTransform:ct]]; //add cube face 3 ct = CATransform3DMakeTranslation(0, -50, 0); ct = CATransform3DRotate(ct, M_PI_2, 1, 0, 0); [cube addSublayer:[self faceWithTransform:ct]]; //add cube face 4 ct = CATransform3DMakeTranslation; ct = CATransform3DRotate(ct, -M_PI_2, 1, 0, 0); [cube addSublayer:[self faceWithTransform:ct]]; //add cube face 5 ct = CATransform3DMakeTranslation(-50, 0, 0); ct = CATransform3DRotate(ct, -M_PI_2, 0, 1, 0); [cube addSublayer:[self faceWithTransform:ct]]; //add cube face 6 ct = CATransform3DMakeTranslation(0, 0, -50); ct = CATransform3DRotate(ct, M_PI, 0, 1, 0); [cube addSublayer:[self faceWithTransform:ct]]; //center the cube layer within the container CGSize containerSize = self.containerView.bounds.size; cube.position = CGPointMake(containerSize.width / 2.0, containerSize.height / 2.0); //apply the transform and return cube.transform = transform; return cube;}- viewDidLoad { [super viewDidLoad]; //设置灭点 CATransform3D pt = CATransform3DIdentity; pt.m34 = -1.0 / 500.0; self.containerView.layer.sublayerTransform = pt; //添加方块1 CATransform3D c1t = CATransform3DIdentity; c1t = CATransform3DTranslate(c1t, -100, 0, 0); CALayer *cube1 = [self cubeWithTransform:c1t]; [self.containerView.layer addSublayer:cube1]; //添加方块2 CATransform3D c2t = CATransform3DIdentity; c2t = CATransform3DTranslate(c2t, 100, 0, 0); c2t = CATransform3DRotate(c2t, -M_PI_4, 1, 0, 0); c2t = CATransform3DRotate(c2t, -M_PI_4, 0, 1, 0); CALayer *cube2 = [self cubeWithTransform:c2t]; [self.containerView.layer addSublayer:cube2];}

图片 7

此番先介绍了三种专项使用图层:能够长足绘制分化造型的CAShapeLayer,过去用于高效渲染文字的CATextLayer以及组织3D组件的CATransformLayer

不会产出像素化。当你给CAShapeLayer做3D调换时,它不像二个有寄宿图的家常图层同样变得像素化。

开创贰个CG帕特h

CAShapeLayer能够用来绘制全部能够通过CGPath来表示的形态。那一个形象不自然要关掉,图层路线也不肯定要不可破,事实上你能够在一个图层上制图好多少个不等的造型。你能够调控一些性质举个例子lineWith(线宽,用点表示单位),lineCap(线条结尾的标准),和lineJoin(线条之间的结合点的理所当然);但是在图层层面你独有二遍机会设置这个属性。倘诺您想用不相同颜色或风格来绘制七个形状,就只可以为每一种造型筹算三个图层了。

用贰个CAShapeLayer渲染二个简练的火柴人。CAShapeLayer属性是CGPathRef类型,但是大家用UIBezier帕特h扶助类创设了图层路线,那样我们就不用思虑人工释放CG帕特h了。

圆角

其次章里面涉及了CAShapeLayer为创制圆角视图提供了一个方式,便是CALayer的cornerRadius属性(译者注:其实是在第四章提到的)。尽管选择CAShapeLayer类须求越多的做事,然则它有贰个优势正是能够独立钦定每种角。

大家制造圆角举行其实正是人为绘制单独的直线和弧度,可是实际上UIBezierPath有机关绘制圆角矩形的构造方法,上面这段代码绘制了一个有多个圆角三个直角的矩形:

我们得以经过那些图层路线绘制四个既有直角又有圆角的视图。假诺我们想安分守己此图片来剪裁视图内容,大家能够把CAShapeLayer作为视图的宿主图层,并不是丰富三个子视图。

CATextLayer

顾客分界面是无能为力从二个独立的图纸里面营造的。一个设计精美的Logo能够很好地显示二个开关或控件的筹算,但是你迟早都要索要一个精确的老一套风格的文本标签。

举个例子您想在贰个图层里面显示文字,完全能够借助图层代理直接将字符串使用Core Graphics写入图层的剧情(这正是UILabel的雅观)。假诺通过寄宿于图层的视图,直接在图层上操作,那其实一定麻烦。你要为每叁人作品显示文字的图层成立二个能像图层代理一样干活的类,还要逻辑上判定哪些图层供给体现哪个字符串,更别提还要记下差异的书体,颜色等一名目许多一塌糊涂的事物。

侥幸的是那些都以不须求的,Core Animation提供了八个CALayer的子类CATextLayer,它以图层的款型包罗了UILabel差相当少具备的绘图天性,况兼额外提供了有个别新的风味。

无差别于,CATextLayer也要比UILabel渲染得快得多。相当少有人知晓在iOS 6及在此以前的版本,UILabel其实是透过WebKit来落到实处绘制的,这样就招致了当有数不胜数文字的时候就能够有高大的性质压力。而CATextLayer使用了Core text,并且渲染得十三分快。

万一你自习看这几个文件,你会意识多个奇异的地方:这几个文件有部分像素化了。那是因为并不曾以Retina的点子渲染,第二章提到了那个contentScale属性,用来调整图层内容应当以怎么着的分辨率来渲染。contentsScale并不关切显示器的拉伸因素而三番五次默感觉1.0。假设大家想以Retina的品质来展现文字,我们就得手动地安装CATextLayer的contentsScale属性

textLayer.contentsScale = [UIScreen mainScreen].scale;

CATextLayer的font属性不是二个UIFont类型,而是四个CFTypeRef类型。那样能够依据你的切实可行要求来支配字体属性应该是用CGFontRef类型照旧CTFontRef类型(Core Text字体)。同一时候字体大小也是用fontSize属性单独设置的,因为CTFontRef和CGFontRef并不像UIFont同样包涵点大小。这么些事例会告诉你什么样将UIFont调换来CGFontRef。

除此以外,CATextLayer的string属性实际不是你想象的NSString类型,而是id类型。那样您不只能够用NSString也得以用NSAttributedString来钦赐文本了(注意,NSAttributedString实际不是NSString的子类)。属性化字符串是iOS用来渲染字体风格的体制,它以特定的格局来决定钦命范围内的字符串的原始新闻,比方字体,颜色,字重,斜体等。

富文本

iOS 6中,Apple给UILabel和其余UIKit文本视图增加了第一手的性质化字符串的支撑,应该说那是二个很有益于的个性。不超过实际在从iOS3.2初步CATextLayer就曾经支撑属性化字符串了。那样的话,假若你想要支持更低版本的iOS系统,CATextLayer无疑是你向分界面中增添富文本的好点子,并且也不用去跟复杂的Core Text打交道,也省了用UIWebView的费力。

让我们编辑一下示范使用到NSAttributedString(见清单6.3).iOS 6及以上大家得以用新的NSTextAttributeName实例来安装大家的字符串属性,可是练习的指标是为了演示在iOS 5及以下,所以大家用了Core Text,也便是说你须要把Core Text framework增多到您的档案的次序中。不然,编写翻译器是无力回天识别属性常量的。

于今着力不用了。

行距和字距

有供给提一下的是,由于绘制的落到实处机制分歧(Core Text和WebKit),用CATextLayer渲染和用UILabel渲染出的文件行距和字距亦非不尽同样的。

三头的差别程度(由运用的书体和字符决定)总的来讲挺小,不过假若您想准确的展现普通便签和CATextLayer就势要求铭记那一点。

UILabel的代替品

咱俩早就认证了CATextLayer比UILabel有着更加好的习性表现,同期还应该有相当的布局选项何况在iOS 5上支撑富文本。然则与一般的价签相比来讲会越加繁琐一些。假若大家真的在急需八个UILabel的可用代替品,最佳是能够在Interface Builder上创造我们的价签,何况尽量地像一般的视图同样健康干活。

大家相应继承UILabel,然后增加贰个子图层CATextLayer天公地道写呈现文本的办法。不过依然会有由UILabel的-drawRect:方法成立的空寄宿图。而且由于CALayer不辅助活动缩放和自行布局,子视图并非积极追踪视图边界的大小,所以每一遍视图大小被改成,大家不得不手动更新子图层的分界。

咱俩真的想要的是二个用CATextLayer作为宿主图层的UILabel子类,那样就可以趁机视图自动调度大小並且也绝非冗余的寄宿图啦。

就如大家在率先章『图层树』钻探的一致,每一个UIView都是借宿在三个CALayer的事必躬亲上。那个图层是由视图自动创造和治本的,那我们得以用别的图层类型代替他么?一旦被创建,大家就不能够代表这么些图层了。不过一旦大家一而再了UIView,那我们就能够重写+layerClass方法使得在创造的时候能回到四个两样的图层子类。UIView会在初步化的时候调用+layerClass方法,然后用它的归来类型来成立宿主图层。

倘让你运营代码,你会发掘文本并不曾像素化,而笔者辈也尚无安装contentsScale属性。把CATextLayer作为宿主图层的另一益处正是视图自动安装了contentsScale属性。

在那么些轻巧的例证中,我们只是实现了UILabel的一有些风格和布局属性,可是有一点再改进一下大家就能够创建贰个支撑UILabel全数机能依然越来越多职能的LayerLabel类。

要是您计划扶助iOS 6及以上,基于CATextLayer的竹签或然就有稍许局限性。但是总得来讲,假如想在app里面丰富利用CALayer子类,用+layerClass来创立基于分化图层的视图是一个简短可复用的方法。

明日读书3d图形和更复杂的动画变幻。

本文由华夏彩票发布于编程应用,转载请注明出处:专项使用图层

您可能还会对下面的文章感兴趣: