首先,我們來分解一下iPhone鎖屏文字動畫效果是怎樣實現(xiàn)的:
iPhone鎖屏效果.gif
1.首先我們要做一個CAGradientLayer,如下圖
第一步.png
2.然后瞪慧,讓這個CAGradientLayer像下面這樣動起來
第二步.gif
3.最后搔谴,給這個CAGradientLayer加個遮罩層,這個遮罩層用文字來做,最終達到我們想要實現(xiàn)的效果夯秃。
往下所有代碼全部由swift 3實現(xiàn).
下面,我們來實現(xiàn)一下,這里是初始工程,當(dāng)然仓洼,你也可以自己新建一個工程介陶,新建一個類繼承自UIView,然后在Storyboard里面拖拽一個UIView跟它關(guān)聯(lián)即可。
1.首先色建,我們來實現(xiàn)第一步哺呜,添加一個CAGradientLayer
打開AnimateView.swift,添加以下代碼箕戳,關(guān)于CAGradientLayer的基本知識某残,可以參考CAGradientLayer最簡使用
let grandientLayer: CAGradientLayer = {
let grandientLayer = CAGradientLayer()
grandientLayer.colors = [
UIColor.darkGray().cgColor,
UIColor.white().cgColor,
UIColor.darkGray().cgColor
]
grandientLayer.locations = [0.0, 0.5, 1.0]
grandientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
grandientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
return grandientLayer
}()
override func layoutSubviews() {
super.layoutSubviews()
grandientLayer.frame = bounds
}
override func didMoveToWindow() {
super.didMoveToWindow()
layer.addSublayer(grandientLayer)
}
執(zhí)行結(jié)果如下:
Simulator Screen Shot 2016年8月10日 下午1.57.51.png
2.給grandientLayer添加一個動畫,讓它像步驟二那樣動起來
在didMoveToWindow()的最后添加一下代碼
let animate = CABasicAnimation(keyPath: "locations")
animate.fromValue = [0.0, 0.0, 0.2]
animate.toValue = [0.8,1.0, 1.0]
animate.duration = 2.5
animate.repeatCount = Float.infinity
grandientLayer.add(animate, forKey: nil)
這里通過改變grandientLayer的locations來達到漸變顏色移動的效果陵吸。
執(zhí)行結(jié)果如下:
執(zhí)行結(jié)果.gif
3.最后玻墅,來實現(xiàn)文字層遮罩
聲明一個text變量,@IBInspectable表示可以直接在storyboard中進行配置該屬性壮虫。(如下圖所示)
@IBInspectable var text: String!
let textAttributes : NSDictionary = {
let style = NSMutableParagraphStyle()
style.alignment = .center
return [
NSFontAttributeName: UIFont(name: "Verdana-Italic", size: 28.0)!,
NSParagraphStyleAttributeName: style
]
}()
可配置屬性.png
在layoutSubviews()的最后添加以下代碼
UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0)
let nsstringText = text as NSString
nsstringText.draw(in: bounds, withAttributes: textAttributes as? [String : AnyObject])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
let maskLayer = CALayer()
maskLayer.frame = bounds
maskLayer.contents = image?.cgImage
grandientLayer.mask = maskLayer
執(zhí)行結(jié)果如下:
執(zhí)行結(jié)果.gif
最終的demo工程可以從這里下載最終工程