如果你還沒使用過ShapeLayer,一定要看看這篇

簡介

官方文檔對ShapeLayer的定義如下:

A layer that draws a cubic Bezier spline in its coordinate space.

可以理解為ShapeLayer是其坐標空間內(nèi)繪有貝塞爾曲線的圖層责掏。

使用ShapeLayer可以制作蒙板和圖層動畫,由于它繼承自CALayer,因此擁有CALayer的全部屬性涡拘。而ShapeLayer最大的不同在于它依賴于貝塞爾曲線UIBezierPath,用貝塞爾曲線可以定義ShapeLayer的形狀据德。

ShapeLayer還有兩個重要的屬性:StrokeStartStrokeEnd鳄乏,它控制ShapeLayercgPath路徑的繪制起點和終點跷车,區(qū)間都為0~1,0代表繪制的起始位置橱野,1代表繪制的終點位置朽缴。

下面就分別從圖形動畫和蒙版兩方面來講講ShapeLayer的使用。

目錄

  • ShapeLayer圖形動畫
  • ShapeLayer蒙版

本文demo的github地址:<a>https://github.com/zephyrw/ShapeLayerDemo.git</a>

使用

ShapeLayer圖形動畫

動畫簡介

使用ShapeLayer制作動畫原理是通過改變ShapeLayer的strokeEnd屬性值來改變ShapeLayer的path的繪制水援,strokeEnd值區(qū)間為0~1

下圖為使用ShapeLayer制作仿今日頭條下拉動畫效果

shapeLayer動畫

實現(xiàn)

把整個圖形分成三個部分:外邊框密强、左上角的框和所有的橫線,分別用貝塞爾曲線繪制這三個部分

外邊框
let draftPath = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: width, height: height), cornerRadius: 5)
左上角邊框
let squarePath = UIBezierPath(roundedRect: CGRect(x: margin, y: margin, width: smallSquareWH, height: smallSquareWH), cornerRadius: 2)
所有橫線
let linePath = UIBezierPath()       
for i in 0..<3 {
    linePath.move(to: CGPoint(x: shortLineLeft, y: margin + 2 + space * CGFloat(i)))
    linePath.addLine(to: CGPoint(x: shortLineRight, y: margin + 2 + space * CGFloat(i)))
}
for i in 0..<3 {
    linePath.move(to: CGPoint(x: margin, y: margin * 2 + 2 + smallSquareWH + space * CGFloat(i)))
    linePath.addLine(to: CGPoint(x: longLineRight, y: margin * 2 + 2 + smallSquareWH + space * CGFloat(i)))
}
將所有貝塞爾曲線繪制到ShapeLayer中
self.draftShapeLayer = CAShapeLayer()
self.draftShapeLayer!.frame = CGRect(x: 0, y: 0, width: width, height: height)
setupShapeLayer(shapeLayer: self.draftShapeLayer!, path: draftPath.cgPath)
        
self.squareShapeLayer = CAShapeLayer()
self.squareShapeLayer!.frame = CGRect(x: 0, y: 0, width: smallSquareWH, height: smallSquareWH)
setupShapeLayer(shapeLayer: self.squareShapeLayer!, path: squarePath.cgPath)
        
self.lineShapeLayer = CAShapeLayer()
self.lineShapeLayer!.frame = CGRect(x: 0, y: 0, width: width, height: height)
setupShapeLayer(shapeLayer: self.lineShapeLayer!, path: linePath.cgPath)

這里抽出了輔助方法來設置ShapeLayer和添加到控制器圖層

private func setupShapeLayer(shapeLayer : CAShapeLayer, path : CGPath) {
    shapeLayer.path = path
    shapeLayer.strokeColor = UIColor.gray.cgColor
    shapeLayer.fillColor = UIColor.white.cgColor
    shapeLayer.lineWidth = 2
    shapeLayer.strokeStart = 0
    shapeLayer.strokeEnd = 0
    self.containerLayer.addSublayer(shapeLayer)
}
添加SliderView
private func addSlider() {
    let slider = UISlider(frame: CGRect(x: 20, y:   UIScreen.main.bounds.height - 50, width:    UIScreen.main.bounds.width - 40, height: 10))
    slider.minimumValue = 0
    slider.maximumValue = 1
    slider.addTarget(self, action: #selector(sliderValueChanged(sender:)), for: UIControlEvents.valueChanged)
    view.addSubview(slider)
    }
sliderValuerChanged方法實現(xiàn)
@objc private func sliderValueChanged(sender: UISlider) {
    guard let draftShapeLayer = self.draftShapeLayer else { return }
    guard let squareShapeLayer = self.squareShapeLayer else { return }
    guard let lineShapeLayer = self.lineShapeLayer else { return }
    draftShapeLayer.strokeEnd = CGFloat(sender.value)
    squareShapeLayer.strokeEnd = CGFloat(sender.value)
    lineShapeLayer.strokeEnd = CGFloat(sender.value)
}

至此蜗元,ShapeLayer圖形動畫就完成了

ShapeLayer蒙版

用ShapeLayer創(chuàng)建一個帶圖形的蒙版如下圖

思路

新建一個蒙版視圖View,然后將繪有貝塞爾曲線的ShapeLayer設置為蒙版視圖圖層的mask

實現(xiàn)

創(chuàng)建蒙版視圖并添加到控制器視圖
let maskView = UIView(frame: view.bounds)
maskView.backgroundColor = UIColor.red.withAlphaComponent(0.3)
maskView.alpha = 0.8
view.addSubview(maskView)
用貝塞爾曲線繪制蒙版的形狀
let bpath = UIBezierPath(roundedRect: CGRect(x: 10, y: 10, width: view.bounds.width - 20, height: view.bounds.height - 20), cornerRadius: 15)
let circlePath = UIBezierPath(arcCenter: view.center, radius: 100, startAngle: 0, endAngle: CGFloat(M_PI) * 2, clockwise: false)
bpath.append(circlePath)
創(chuàng)建ShapeLayer或渤,設置之前創(chuàng)建的貝塞爾曲線為cgPath
let shapeLayer = CAShapeLayer()
shapeLayer.path = bpath.cgPath
將ShapeLayer設為蒙版
maskView.layer.mask = shapeLayer

接下來就可以運行看效果了。

總結(jié)

ShapeLayer作為一個帶形狀的圖層许帐,作用不僅限于上面的圖層動畫和蒙版動畫劳坑。它還可以配合核心動畫CAAnimation做出很多很炫的效果,比如用ShapeLayercgPathCABasicAnimationkeyPath成畦,通過將fromValuetoValue設為不同的形狀路徑距芬,可以完成很自然的形變動畫,大家也可以自己動手實現(xiàn)一下循帐。

本文demo的github地址:<a>https://github.com/zephyrw/ShapeLayerDemo.git</a>

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末框仔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拄养,更是在濱河造成了極大的恐慌离斩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘪匿,死亡現(xiàn)場離奇詭異跛梗,居然都是意外死亡,警方通過查閱死者的電腦和手機棋弥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門核偿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人顽染,你說我怎么就攤上這事漾岳。” “怎么了粉寞?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵尼荆,是天一觀的道長。 經(jīng)常有香客問我唧垦,道長捅儒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮野芒,結(jié)果婚禮上蓄愁,老公的妹妹穿的比我還像新娘双炕。我一直安慰自己狞悲,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布妇斤。 她就那樣靜靜地躺著摇锋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪站超。 梳的紋絲不亂的頭發(fā)上荸恕,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音死相,去河邊找鬼融求。 笑死,一個胖子當著我的面吹牛算撮,可吹牛的內(nèi)容都是我干的生宛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肮柜,長吁一口氣:“原來是場噩夢啊……” “哼陷舅!你這毒婦竟也來了伊者?” 一聲冷哼從身側(cè)響起馆铁,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颁虐,沒想到半個月后芒澜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仰剿,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年痴晦,在試婚紗的時候發(fā)現(xiàn)自己被綠了南吮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡阅酪,死狀恐怖旨袒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情术辐,我是刑警寧澤砚尽,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站辉词,受9級特大地震影響必孤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一敷搪、第九天 我趴在偏房一處隱蔽的房頂上張望兴想。 院中可真熱鬧,春花似錦赡勘、人聲如沸嫂便。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毙替。三九已至,卻和暖如春践樱,著一層夾襖步出監(jiān)牢的瞬間厂画,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工拷邢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袱院,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓瞭稼,卻偏偏與公主長得像忽洛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子弛姜,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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

  • 在iOS中隨處都可以看到絢麗的動畫效果脐瑰,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌廷臼。在這里你可以看...
    每天刷兩次牙閱讀 8,488評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果苍在,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌荠商。在這里你可以看...
    F麥子閱讀 5,110評論 5 13
  • 目錄: 主要繪圖框架介紹 CALayer 繪圖 貝塞爾曲線-UIBezierPath CALayer子類 補充:i...
    Ryan___閱讀 1,673評論 1 9
  • CoreAnimation:Core Animation自身并不是一個繪圖系統(tǒng)寂恬。它只是一個負責在硬件上合成和操縱應...
    YGoooooooooal閱讀 580評論 0 1
  • 古裝武俠片,一直是多數(shù)人追捧的片子莱没。金庸也好初肉,古龍也罷,每個偉大創(chuàng)作者耗盡心血的眾多影片中饰躲,通常都會闡釋一個共同的...
    小汐0314閱讀 177評論 7 5