CALayer CAScrollLayer CATextLayer Guide(一)

CALayer

Layer的基本屬性:

  • Layers像Views有subviews一樣,也有sublayers溶褪;
  • 當(dāng)你改變Layer的屬性時(shí)币旧,layer會(huì)自動(dòng)動(dòng)畫,你也可以自定義動(dòng)畫時(shí)間猿妈;
  • Layers比view更輕量級(jí)吹菱,所有它有更高的性能;
  • Layers有很多有用的屬性彭则,接下來看一下這些屬性鳍刷。
// 1
let layer = CALayer()
layer.frame = someView.bounds

// 2
layer.contents = UIImage(named: "star")?.CGImage
layer.contentsGravity = kCAGravityCenter

// 3
layer.magnificationFilter = kCAFilterLinear
layer.geometryFlipped = false

// 4
layer.backgroundColor = UIColor(red: 11/255.0, green: 86/255.0, blue: 14/255.0, alpha: 1.0).CGColor
layer.opacity = 1.0
layer.hidden = false
layer.masksToBounds = false

// 5
layer.cornerRadius = 100.0
layer.borderWidth = 12.0
layer.borderColor = UIColor.whiteColor().CGColor

// 6
layer.shadowOpacity = 0.75
layer.shadowOffset = CGSize(width: 0, height: 3)
layer.shadowRadius = 3.0
someView.layer.addSublayer(layer)

在上面的代碼中:

  1. 創(chuàng)建一個(gè)layer,給layer設(shè)置frame;
  2. 設(shè)置layer的content俯抖,居中输瓜,content中的image為CGImage;
  3. 通過contentGravity設(shè)置圖片時(shí),可以用這個(gè)屬性前痘;
  4. maskToBounds屬性為false時(shí)layer的size比image小時(shí)凛捏,image不會(huì)被裁掉;
  5. 設(shè)置cornerRadius為layer的寬度的一半時(shí)芹缔,成了圓形坯癣,borderColor也要用CGColor;
  6. 創(chuàng)建layer的陰影。

CALayer還有兩個(gè)附加屬性:shouldRasterize,drawsAsynchronously:

  • shouldRasterize默認(rèn)為false, 當(dāng)設(shè)置為true時(shí)可以提高性能因?yàn)閘ayer的contents只需要渲染一次最欠,這種適合在屏幕周圍做動(dòng)畫但是不展現(xiàn)在屏幕上的對(duì)象示罗;
  • drawsAsynachronously 跟shouldRasterize相反,默認(rèn)也為false, 當(dāng)layer的contents需要不停地重繪時(shí)芝硬,需要設(shè)置為true以提高性能蚜点,例如:用emitter layer不停地渲染動(dòng)畫粒子時(shí)。

CAScrollLayer

UIScrollView 不用CAScrollLayer來工作拌阴,直接改變layer的bounds绍绘,可以對(duì)CAScrollLayer做的是設(shè)置滾動(dòng)模式為水平或者垂直, 可以在程序中告訴它滾動(dòng)到的點(diǎn)或者區(qū)域迟赃,

import UIKit

class ScrollingView: UIView {
// 1
override class func layerClass() -> AnyClass {
return CAScrollLayer.self
}
}

// In CAScrollLayerViewController.swift
import UIKit

class CAScrollLayerViewController: UIViewController {
@IBOutlet weak var scrollingView: ScrollingView!

// 2
var scrollingViewLayer: CAScrollLayer {
return scrollingView.layer as CAScrollLayer
}

override func viewDidLoad() {
super.viewDidLoad()
// 3
scrollingViewLayer.scrollMode = kCAScrollBoth
}

@IBAction func tapRecognized(sender: UITapGestureRecognizer) {
// 4
var newPoint = CGPoint(x: 250, y: 250)
UIView.animateWithDuration(0.3, delay: 0, options: .CurveEaseInOut, animations: {
[unowned self] in
self.scrollingViewLayer.scrollToPoint(newPoint)
}, completion: nil)
}
}

如果想用更輕量級(jí)的滾動(dòng)陪拘,并且用程序設(shè)置滾動(dòng),可以用CAScrollLayer;
如果想用戶自己滾動(dòng)纤壁,最好用UIScrollView;
如果想滾動(dòng)一個(gè)非常大的圖片左刽,考慮用CATiledLayer,在下文中有提到。

CATextLayer

CATextLayer 可以快速的渲染字符串酌媒,它不用 UIFont, 只用CTFontRef欠痴, CGFontRef

// 1
let textLayer = CATextLayer()
textLayer.frame = someView.bounds

// 2
var string = ""
for _ in 1...20 {
string += "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor arcu quis velit congue dictum. "
}

textLayer.string = string

// 3
let fontName: CFStringRef = "Noteworthy-Light"
textLayer.font = CTFontCreateWithName(fontName, fontSize, nil)

// 4
textLayer.foregroundColor = UIColor.darkGrayColor().CGColor
textLayer.wrapped = true
textLayer.alignmentMode = kCAAlignmentLeft
textLayer.contentsScale = UIScreen.mainScreen().scale
someView.layer.addSublayer(textLayer)
  1. 創(chuàng)建一個(gè)CATextLayer實(shí)例
  2. 創(chuàng)建一個(gè)重復(fù)字符串
  3. 把字體賦值給它
  4. 設(shè)置字體的對(duì)齊方式
    所有l(wèi)ayer的類,默認(rèn)為1倍渲染秒咨,當(dāng)加到視圖上時(shí)喇辽,layers自動(dòng)為當(dāng)前屏幕設(shè)置合適的contentsScale倍數(shù),自己手動(dòng)創(chuàng)建的layer需要明確的設(shè)置contentsScale, 否則它的倍數(shù)會(huì)為1拭荤,在高清屏上會(huì)失真茵臭。
    可以設(shè)置很多參數(shù),字體類型舅世,字體大小,對(duì)齊方式奇徒,截?cái)嗟奈恢茫ㄩ_始雏亚,結(jié)束,早間)摩钙。github代碼

下一篇寫繼續(xù)寫AVPlayerLayer

微信公眾號(hào)

開發(fā)者思維 devthinking
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罢低,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌网持,老刑警劉巖宜岛,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異功舀,居然都是意外死亡萍倡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門辟汰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來列敲,“玉大人,你說我怎么就攤上這事帖汞〈鞫” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵翩蘸,是天一觀的道長(zhǎng)所意。 經(jīng)常有香客問我,道長(zhǎng)催首,這世上最難降的妖魔是什么扁眯? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮翅帜,結(jié)果婚禮上姻檀,老公的妹妹穿的比我還像新娘。我一直安慰自己涝滴,他們只是感情好绣版,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歼疮,像睡著了一般杂抽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上韩脏,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天缩麸,我揣著相機(jī)與錄音,去河邊找鬼赡矢。 笑死杭朱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吹散。 我是一名探鬼主播弧械,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼空民!你這毒婦竟也來了刃唐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎画饥,沒想到半個(gè)月后衔瓮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抖甘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年热鞍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片单山。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碍现,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出米奸,到底是詐尸還是另有隱情昼接,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布悴晰,位于F島的核電站慢睡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铡溪。R本人自食惡果不足惜漂辐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棕硫。 院中可真熱鬧髓涯,春花似錦、人聲如沸哈扮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)滑肉。三九已至包各,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間靶庙,已是汗流浹背问畅。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留六荒,地道東北人护姆。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像恬吕,于是被迫代替她去往敵國(guó)和親签则。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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