Swift下‘有趣的’漸變和遮罩

很長時間沒有寫文章了笼裳,人變懶惰了须尚。
很早之前看見一個公式:每天進步一點點,一年下來侍咱,你會發(fā)現(xiàn)進步很多耐床。每天不進步,一年下來就會倒退很多楔脯×煤洌“逆水行舟,不進則退”昧廷,說的就是這個道理堪嫂。

計算公式

好了,閑話不多說木柬。 今天的主角是 CAGradientLayer皆串。我將這篇文章歸類為iOS Animation,因為在后續(xù)的教程中眉枕,我將會講解如何利用CAGradientLayer創(chuàng)建動畫`后續(xù)會有系列教程恶复,敬請期待。

一速挑、開始

文章中使用的開發(fā)環(huán)境是xcode9.1 谤牡, 用的是swift語言。關(guān)于CAGradientLayer是什么姥宝,這里就不做過多解釋了翅萤,想要了解的朋友們,可以自己下去看蘋果文檔腊满,或者百度一下套么。 最終效果鍵本文最后面附的圖 完整項目下載地址.

  • 1.1 首先我們在viewDidAppear()方法中創(chuàng)建一個漸變。
let gradient = CAGradientLayer() // 創(chuàng)建一個漸變層
gradient.frame = view.bounds     // 設(shè)置frame(全屏顯示)
gradient.startPoint = CGPoint(x: 0, y: 0) // 設(shè)置開始點
gradient.endPoint = CGPoint(x: 1, y: 1)   // 設(shè)置結(jié)束點

可能有朋友會有疑問碳蛋,開始點和結(jié)束點為什么是 (0, 0)和(1, 1)呢胚泌? 別急,看看下圖就知道了疮蹦。


開始點和結(jié)束點

當我們運行代碼后诸迟,發(fā)現(xiàn)什么都沒有。 當然啦,你要設(shè)置漸變色阵苇,首先你得設(shè)置CAGradientLayer的顏色壁公,最重要的一步,你還要把它添加到View的layer上面绅项。下圖是顯示效果

  • 1.2 將gradient添加到控制器視圖的layer上
// 設(shè)置漸變色(這里需要傳遞一個color數(shù)組)
gradient.colors = [UIColor(red: 0.0, green: 1.0, blue: 0.752, alpha: 1.0).cgColor, 
                   UIColor(red: 0.949, green: 0.03, blue: 0.913, alpha: 1.0).cgColor]
// 將gradient添加到控制器視圖的layer上 
view.layer.addSublayer(gradient)

[圖片上傳失敗...(image-c1eb26-1511180450498)]


效果圖

看紊册,是不是很漂亮?你也可以設(shè)置你自己喜歡的顏色快耿。

二囊陡、漸變和UILabel結(jié)合

接下來,我們看看掀亥,當漸變和UILabel結(jié)合會是什么樣子的撞反。

按住鍵盤上的control+command 點擊CAGradientLayer,會跳到它的定義搪花。我們發(fā)現(xiàn)CAGradientLayer是繼承CALayer的遏片,CALayer有一個mask屬性,mask屬性撮竿?吮便??什么鬼幢踏?

CALayer的頭文件關(guān)于mask的說明髓需,mask實際上layer內(nèi)容的一個遮罩,如果我們把mask是透明的房蝉,實際看到的layer是完全透明的僚匆,也就是說只有mask的內(nèi)容不透明的部分和layer疊加的部分才會顯示出來。

為了方便惨驶,我直接在storyBoard上拖了一個UILabel白热,并設(shè)置gradient.mask = label.layer;敛助。 再次運行項目可以看到的單詞“文本”不是以其原始的黑色顯示粗卜,而是在顯示上文中我們設(shè)置的漸變顏色。為了使效果更酷纳击,我們添加了一些動畫续扔,讓其看起來更加有趣。

// UILabel動畫焕数, 需要傳入一個字符串
func animateText(text: String) {
    // text的長度大于0才會運行這個動畫
    if text.characters.count > 0 { 
        // startIndex : 第一個字符的位置 
        // text.index(after: text.startIndex) 給定位置之后的字符位置 
        // 下面兩句的組合起來完成了本動畫:label的文本從傳入的字符串的第一個字符開始纱昧,每隔0.05秒添加一個字符到label上面,直至結(jié)束堡赔。
        label.text = "\(label.text!)\(text.substring(to: text.index(after: text.startIndex)))"
        delay(0.05, task: { // delay 是封裝的一個延時方法识脆,后面工程中會給出這部分封裝的代碼。
            self.animateText(text: text.substring(from: text.index(after: text.startIndex)))
        })
        
    } else {
        // 結(jié)束Label動畫,如果要做別的操作灼捂,在這里添加代碼
    }
}

關(guān)于上面動畫的說明:每0.05秒添加一個字符到label上离例,直到有字符添加。 它會自己遞歸地調(diào)用悉稠,所以你只需要用全文調(diào)用一次宫蛆,然后讓它自己工作。別忘記了在 viewDidAppear方法中調(diào)用 animateText(text: "需要顯示的內(nèi)容") 這個方法的猛。下面是運行效果:


效果圖

是不是很酷耀盗???????。 我們還可以為gradient添加更多的mask卦尊,比如說添加一個按鈕動畫:

func addButtonRing() {
    let side: CGFloat = 60.0
    let button = CAShapeLayer() // CAShapeLayer 繪制圓環(huán)
    button.position = CGPoint(x: label.bounds.width * 0.5 - side/2, y: label.bounds.height * 0.85) // 設(shè)置圓環(huán)的位置 
    button.strokeColor = UIColor.black.cgColor // 設(shè)置圓環(huán)邊框的顏色 
    button.fillColor = UIColor.clear.cgColor // 設(shè)置圓環(huán)的填充顏色
    button.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: side, height: side)).cgPath // 設(shè)置路徑
    button.lineWidth = 1.0 // 邊框?qū)挾?    button.opacity = 0.5 // 透明度
    label.layer.addSublayer(button) // 將圓環(huán)添加到label的layer上面 
    
    // 縮放動畫
    let scale = CABasicAnimation(keyPath: "transform.scale") // 創(chuàng)建縮放動畫
    scale.fromValue = 1.0 // 開始值
    scale.toValue = 0.67  // 結(jié)束值
    scale.duration = 2.0 // 動畫時間
    scale.repeatCount = Float.infinity // 重復次數(shù)
    scale.autoreverses = true // 逆向運行動畫
    button.add(scale, forKey: nil) // 為圓環(huán)添加動畫

    }

寫好上面這些代碼后叛拷,我們在哪里調(diào)用呢? 別急岂却,還記得上面為UILabel添加動畫的那個方法嗎胡诗?(animateText),只需要在else里面調(diào)用這個方法就行了淌友。

func animateText(text: String) {
    if text.characters.count > 0 { 
        ...
        
    } else {
        // 結(jié)束Label動畫煌恢,如果要做別的操作,在這里添加代碼 
        // 添加幾個就是幾個圓環(huán)
        delay(0.1, task: {self.addButtonRing()})
        delay(1.2, task: {self.addButtonRing()})        delay(2.4, task: {self.addButtonRing()})
    }
}

現(xiàn)在讓我們來看一下成果吧震庭,見證奇跡的時候到了瑰抵,哇咔咔。


效果圖

我們還可以為它加一個imageView的遮罩器联,比如像這樣, 最終效果見下圖:

    let imageView = UIImageView(image: UIImage(named: "dog3"))
    imageView.center.x = label.bounds.width/2
    label.addSubview(imageView)
效果圖

圖片的顏色也發(fā)生了漸變二汛。

至此,今天的內(nèi)容就到這里了拨拓。合理的運用CAGradientLayer肴颊,還可以做很多有意思的小應(yīng)用,等著聰明的你們?nèi)グl(fā)掘渣磷。如果你喜歡這篇文章婿着,就請獻上你們的小星星吧~~。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末醋界,一起剝皮案震驚了整個濱河市竟宋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌形纺,老刑警劉巖丘侠,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逐样,居然都是意外死亡蜗字,警方通過查閱死者的電腦和手機打肝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挪捕,“玉大人闯睹,你說我怎么就攤上這事〉I瘢” “怎么了楼吃?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妄讯。 經(jīng)常有香客問我孩锡,道長,這世上最難降的妖魔是什么亥贸? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任躬窜,我火速辦了婚禮,結(jié)果婚禮上炕置,老公的妹妹穿的比我還像新娘荣挨。我一直安慰自己,他們只是感情好朴摊,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布默垄。 她就那樣靜靜地躺著,像睡著了一般甚纲。 火紅的嫁衣襯著肌膚如雪口锭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天介杆,我揣著相機與錄音鹃操,去河邊找鬼。 笑死春哨,一個胖子當著我的面吹牛荆隘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赴背,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼椰拒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了癞尚?” 一聲冷哼從身側(cè)響起耸三,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浇揩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體憨颠,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡胳徽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年积锅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片养盗。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡缚陷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出往核,到底是詐尸還是另有隱情箫爷,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布聂儒,位于F島的核電站虎锚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衩婚。R本人自食惡果不足惜窜护,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望非春。 院中可真熱鬧柱徙,春花似錦、人聲如沸奇昙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽储耐。三九已至概行,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弧岳,已是汗流浹背凳忙。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禽炬,地道東北人涧卵。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像腹尖,于是被迫代替她去往敵國和親柳恐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

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

  • 轉(zhuǎn)載:http://www.reibang.com/p/32fcadd12108 每個UIView有一個伙伴稱為l...
    F麥子閱讀 6,216評論 0 13
  • 每個UIView有一個伙伴稱為layer热幔,一個CALayer乐设。UIView實際上并沒有把自己畫到屏幕上;它繪制本身...
    shenzhenboy閱讀 3,110評論 0 17
  • >復雜的組織都是專門化的 >Catharine R. Stimpson 到目前為止,我們已經(jīng)探討過`CALayer...
    夜空下最亮的亮點閱讀 1,022評論 0 2
  • 在iOS中隨處都可以看到絢麗的動畫效果绎巨,實現(xiàn)這些動畫的過程并不復雜近尚,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,113評論 5 13
  • 我愛過一個美麗的朋友场勤,她如春天的風夏日的荷戈锻,她孤獨起來有秋的寂寥歼跟,也不失冬的傲雪寒霜。多希望她生命中有一部...
    鮮研閱讀 286評論 0 4