iOS專用圖層解析

CAShapeLayer

CAShapeLayer是一個(gè)通過(guò)矢量圖形而不是bitmap來(lái)繪制的圖層子類慈省。你指定諸如顏色和線寬等屬性砂竖,用CGPath來(lái)定義想要繪制的圖形,最后CAShapeLayer就自動(dòng)渲染出來(lái)了。當(dāng)然,你也可以用Core Graphics直接向原始的CALyer的內(nèi)容中繪制一個(gè)路徑刹衫,相比直下,使用CAShapeLayer有以下一些優(yōu)點(diǎn):

  • 渲染快速搞挣。
  • 高效使用內(nèi)存带迟。
  • 不會(huì)被圖層邊界剪裁掉。
  • 不會(huì)出現(xiàn)像素化囱桨。

創(chuàng)建一個(gè)path畫(huà)一個(gè)圓

 UIBezierPath *path = [[UIBezierPath alloc] init];
        [path addArcWithCenter:CGPointMake(100, 100) radius:25 startAngle:0 endAngle:2*M_PI clockwise:YES];
        
        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;
        //add it to our view
        [self.layer addSublayer:shapeLayer];
E77C36FF-D39B-4C59-B6D2-273B72E45533.png

還可以利用CAShapeLayer畫(huà)一些不規(guī)則圖形

CAShapeLayer為創(chuàng)建圓角視圖提供了一個(gè)方法仓犬,就是CALayercornerRadius屬性。雖然使用CAShapeLayer類需要更多的工作舍肠,但是它有一個(gè)優(yōu)勢(shì)就是可以單獨(dú)指定每個(gè)角搀继。

       //define path parameters
        CGRect rect = CGRectMake(50, 50, 100, 100);
        CGSize radii = CGSizeMake(20, 20);
        UIRectCorner corners = UIRectCornerTopRight | UIRectCornerBottomRight | UIRectCornerBottomLeft;
        //create path
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];        
        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;
        //add it to our view
        [self.layer addSublayer:shapeLayer];
24A5C5BB-DF86-44B2-991A-FFB1375D854A.png

CATextLayer

CATextLayer是CALayer的子類,它以圖層的形式包含了UILabel幾乎所有的繪制特性翠语,并且額外的提供了一些新的特性叽躯,并且額外的提供了一些新的特性。同樣CATextLayerUILabel渲染得快得多肌括。

嘗試用CATextLayer實(shí)現(xiàn)一個(gè)UILabel的功能

        CATextLayer *textLayer = [CATextLayer layer];
        textLayer.frame = self.bounds;
        //此處要注意設(shè)置Layer的比例点骑,不然字看起來(lái)會(huì)失幀
        textLayer.contentsScale = [UIScreen mainScreen].scale;
        [self.layer addSublayer:textLayer];
        
        //set text attributes
        textLayer.foregroundColor = [UIColor blackColor].CGColor;
        textLayer.alignmentMode = kCAAlignmentJustified;
        textLayer.wrapped = YES;
        
        //choose a font
        UIFont *font = [UIFont systemFontOfSize:15];
        
        //set layer font
        CFStringRef fontName = (__bridge CFStringRef)font.fontName;
        CGFontRef fontRef = CGFontCreateWithFontName(fontName);
        textLayer.font = fontRef;
        textLayer.fontSize = font.pointSize;
        CGFontRelease(fontRef);
        
        textLayer.string = text;

CATextLayerfont屬性不是一個(gè)UIFont類型,而是一個(gè)CFTypeRef類型谍夭。這樣可以根據(jù)你的具體需要來(lái)決定字體屬性應(yīng)該是用CGFontRef類型還是CTFontRef類型(Core Text字體)黑滴。同時(shí)字體大小也是用fontSize屬性單獨(dú)設(shè)置的,因?yàn)?code>CTFontRef和CGFontRef并不像UIFont一樣包含點(diǎn)大小紧索。這個(gè)例子會(huì)告訴你如何將UIFont轉(zhuǎn)換成CGFontRef袁辈。
另外,CATextLayerstring屬性并不是你想象的NSString類型珠漂,而是id類型晚缩。這樣你既可以用NSString也可以用NSAttributedString來(lái)指定文本了(注意,NSAttributedString并不是NSString的子類)媳危。屬性化字符串是iOS用來(lái)渲染字體風(fēng)格的機(jī)制橡羞,它以特定的方式來(lái)決定指定范圍內(nèi)的字符串的原始信息,比如字體济舆,顏色卿泽,字重,斜體等滋觉。

富文本

讓我們編輯一下示例使用到NSAttributedString.iOS 6及以上我們可以用新的NSTextAttributeName實(shí)例來(lái)設(shè)置我們的字符串屬性签夭,但是練習(xí)的目的是為了演示在iOS 5及以下,所以我們用了Core Text椎侠,也就是說(shuō)你需要把Core Text framework添加到你的項(xiàng)目中第租。否則,編譯器是無(wú)法識(shí)別屬性常量的我纪。

 //create a text layer
  CATextLayer *textLayer = [CATextLayer layer];
  textLayer.frame = self.labelView.bounds;
  textLayer.contentsScale = [UIScreen mainScreen].scale;
  [self.labelView.layer addSublayer:textLayer];

  //set text attributes
  textLayer.alignmentMode = kCAAlignmentJustified;
  textLayer.wrapped = YES;

  //choose a font
  UIFont *font = [UIFont systemFontOfSize:15];

  //choose some text
  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];

  //convert UIFont to a CTFont
  CFStringRef fontName = (__bridge CFStringRef)font.fontName;
  CGFloat fontSize = font.pointSize;
  CTFontRef fontRef = CTFontCreateWithName(fontName, fontSize, NULL);

  //set text attributes
  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(6, 5)];

  //release the CTFont we created earlier
  CFRelease(fontRef);

  //set layer text
  textLayer.string = string;
}
@end

未完....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慎宾,一起剝皮案震驚了整個(gè)濱河市丐吓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趟据,老刑警劉巖券犁,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異汹碱,居然都是意外死亡粘衬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)咳促,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稚新,“玉大人,你說(shuō)我怎么就攤上這事跪腹」由荆” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵冲茸,是天一觀的道長(zhǎng)笤妙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)噪裕,這世上最難降的妖魔是什么蹲盘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮膳音,結(jié)果婚禮上召衔,老公的妹妹穿的比我還像新娘。我一直安慰自己祭陷,他們只是感情好苍凛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著兵志,像睡著了一般醇蝴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上想罕,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天悠栓,我揣著相機(jī)與錄音,去河邊找鬼按价。 笑死惭适,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的楼镐。 我是一名探鬼主播癞志,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼框产!你這毒婦竟也來(lái)了凄杯?” 一聲冷哼從身側(cè)響起错洁,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戒突,沒(méi)想到半個(gè)月后屯碴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妖谴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年窿锉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酌摇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膝舅。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窑多,靈堂內(nèi)的尸體忽然破棺而出仍稀,到底是詐尸還是另有隱情,我是刑警寧澤埂息,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布技潘,位于F島的核電站,受9級(jí)特大地震影響千康,放射性物質(zhì)發(fā)生泄漏享幽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一拾弃、第九天 我趴在偏房一處隱蔽的房頂上張望值桩。 院中可真熱鬧,春花似錦豪椿、人聲如沸奔坟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咳秉。三九已至,卻和暖如春鸯隅,著一層夾襖步出監(jiān)牢的瞬間澜建,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蝌以, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霎奢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓饼灿,卻偏偏與公主長(zhǎng)得像幕侠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碍彭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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