-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLinearGradientView.swift
91 lines (79 loc) · 2.43 KB
/
LinearGradientView.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//
// LinearGradientView.swift
// ViewBuilder
//
// Created by Abel Sanchez on 7/24/16.
// Copyright © 2016 Abel Sanchez. All rights reserved.
//
import UIKit
open class GradientStop: NSObject, DefaultConstructor {
@objc open var color: UIColor
@objc open var offset: Double
public override required init() {
color = UIColor.clear
offset = 1
}
}
open class LinearGradientView: UIView {
override open class var layerClass : AnyClass {
return CAGradientLayer.self
}
public override init(frame: CGRect) {
stops = nil
startPoint = CGPoint(x: 0, y: 0)
endPoint = CGPoint(x: 1, y: 1)
super.init(frame: frame)
}
public required init?(coder aDecoder: NSCoder) {
stops = nil
startPoint = CGPoint(x: 0, y: 0)
endPoint = CGPoint(x: 1, y: 1)
super.init(coder: aDecoder)
}
@objc open var stops: [GradientStop]? {
didSet {
guard let gradientLayer = layer as? CAGradientLayer else {
return
}
var colors: [AnyObject]? = nil
var locations: [NSNumber]? = nil
if var stops = self.stops {
// Sort gradients stop monotonically increasing as required in CAGradientLayer
stops.sort() { $0.offset < $1.offset }
colors = stops.map { $0.color.cgColor }
locations = stops.map { NSNumber(value: $0.offset as Double) }
}
gradientLayer.colors = colors
gradientLayer.locations = locations
}
}
@objc open var startPoint: CGPoint {
didSet {
guard let gradientLayer = layer as? CAGradientLayer else {
return
}
gradientLayer.startPoint = startPoint
}
}
@objc open var endPoint: CGPoint {
didSet {
guard let gradientLayer = layer as? CAGradientLayer else {
return
}
gradientLayer.endPoint = endPoint
}
}
// MARK: - DocumentChildsProcessor
open override func processDocument(childs: DocumentChildVisitor) {
super.processDocument(childs: childs)
var stops = [GradientStop]()
childs.visit { (child) -> Bool in
if let stop = child as? GradientStop {
stops.append(stop)
return true
}
return false
}
self.stops = stops
}
}