import UIKit
open class GradientView: UIView {
fileprivate struct AnimationKey {
static let colors = "colors"
static let colorChange = "ColorChange"
}
public enum Point {
case left, right
case top, bottom
/// 上部分邊角
case upperLeft, upperRight
/// 下部分邊角
case lowerLeft, lowerRight
case custom(position: CGPoint)
var point: CGPoint {
switch self {
case .left: return CGPoint(x: 0, y: 0.5)
case .right: return CGPoint(x: 1, y: 0.5)
case .top: return CGPoint(x: 0.5, y: 0)
case .bottom: return CGPoint(x: 0.5, y: 1)
case .upperLeft: return CGPoint(x: 0, y: 0)
case .upperRight: return CGPoint(x: 1, y: 0)
case .lowerLeft: return CGPoint(x: 0, y: 1)
case .lowerRight: return CGPoint(x: 1, y: 1)
case .custom(position: let point): return point
}
}
}
open var startPoint: Point = .upperRight
open var endPoint: Point = .lowerLeft
open var animationDuration: CFTimeInterval = 3.0
fileprivate let gradientLayer = CAGradientLayer()
fileprivate var currentGradient = 0
fileprivate var colors = [#colorLiteral(red: 0.6117647059, green: 0.1529411765, blue: 0.6901960784, alpha: 1), #colorLiteral(red: 1, green: 0.2509803922, blue: 0.5058823529, alpha: 1), #colorLiteral(red: 0.4823529412, green: 0.1215686275, blue: 0.6352941176, alpha: 1), #colorLiteral(red: 0.1254901961, green: 0.2980392157, blue: 1, alpha: 1), #colorLiteral(red: 0.1254901961, green: 0.6196078431, blue: 1, alpha: 1), #colorLiteral(red: 0.3529411765, green: 0.4705882353, blue: 0.4980392157, alpha: 1), #colorLiteral(red: 0.2274509804, green: 1, blue: 0.8509803922, alpha: 1)]
open override func removeFromSuperview() {
super.removeFromSuperview()
gradientLayer.removeAllAnimations()
gradientLayer.removeFromSuperlayer()
}
}
extension GradientView {
open func startAnimation() {
gradientLayer.removeAllAnimations()
setupGradientLayer()
setupAnimation()
}
open func set(colors: [UIColor]) {
guard colors.count > 0 else { return }
self.colors = colors
}
open func add(color: UIColor) {
colors.append(color)
}
}
extension GradientView {
fileprivate func setupGradientLayer() {
gradientLayer.frame = self.bounds
gradientLayer.colors = convertToCGColor()
gradientLayer.startPoint = startPoint.point
gradientLayer.endPoint = endPoint.point
gradientLayer.drawsAsynchronously = true
self.layer.insertSublayer(gradientLayer, at: 0)
}
fileprivate func convertToCGColor() -> [CGColor]? {
guard colors.count > 0 else { return nil }
return [colors[currentGradient % colors.count].cgColor,
colors[(currentGradient + 1) % colors.count].cgColor]
}
fileprivate func setupAnimation() {
currentGradient += 1
let animation = CABasicAnimation(keyPath: AnimationKey.colors)
animation.duration = animationDuration
animation.toValue = convertToCGColor()
animation.fillMode = kCAFillModeForwards
animation.isRemovedOnCompletion = false
animation.delegate = self
gradientLayer.add(animation, forKey: AnimationKey.colorChange)
}
}
extension GradientView: CAAnimationDelegate {
public func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
if flag {
gradientLayer.colors = convertToCGColor()
setupAnimation()
}
}
}
動態漸變動畫界面
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- 前言 最近一直想寫個app,可是不知道想些啥,今天給大家分享一下 漸變動起來的效果 效果 因為gif圖比較大,所有...
- 本人ios初學者,為自己學習方便,復制各位大神的學習性文章放在自己簡書里,僅作為自己學習方便使用,如果作者疑此行為...
- ???????????????????????????????????????<????????>????????...