Skip to content

Commit 49489a5

Browse files
authored
Merge pull request #6 from ChiliLabs/refactoring/layout
layout improvements
2 parents f74a40d + 65db58f commit 49489a5

21 files changed

+95
-67
lines changed

CHIPageControl.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'CHIPageControl'
3-
s.version = '0.0.1'
3+
s.version = '0.0.2'
44
s.summary = 'CHIPageControl is a set of cool animated page controls written in Swift to replace boring UIPageControl.'
55

66
s.ios.deployment_target = '8.0'

CHIPageControl/CHIPageControlAji.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,16 @@ open class CHIPageControlAji: CHIBasePageControl {
5252
}
5353

5454
self.layer.addSublayer(active)
55-
layout()
56-
update(for: progress)
55+
setNeedsLayout()
5756
self.invalidateIntrinsicContentSize()
5857
}
5958

60-
override func layout() {
59+
override open func layoutSubviews() {
60+
super.layoutSubviews()
6161

6262
let floatCount = CGFloat(inactive.count)
63-
let x = (self.frame.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
64-
let y = (self.frame.size.height - self.diameter)*0.5
63+
let x = (self.bounds.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
64+
let y = (self.bounds.size.height - self.diameter)*0.5
6565
var frame = CGRect(x: x, y: y, width: self.diameter, height: self.diameter)
6666

6767
active.cornerRadius = self.radius
@@ -78,6 +78,7 @@ open class CHIPageControlAji: CHIBasePageControl {
7878
layer.frame = frame
7979
frame.origin.x += self.diameter + self.padding
8080
}
81+
update(for: progress)
8182
}
8283

8384
override func update(for progress: Double) {

CHIPageControl/CHIPageControlAleppo.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ open class CHIPageControlAleppo: CHIBasePageControl {
3535

3636
fileprivate lazy var active: CHILayer = { [unowned self] in
3737
let layer = CHILayer()
38-
layer.frame = CGRect(origin: .zero, size: CGSize(width: self.diameter, height: self.diameter))
3938
layer.backgroundColor = self.tintColor.cgColor
4039
layer.cornerRadius = self.radius
40+
self.layer.addSublayer(layer)
4141
return layer
4242
}()
4343

@@ -57,10 +57,7 @@ open class CHIPageControlAleppo: CHIBasePageControl {
5757
self.layer.addSublayer(layer)
5858
return layer
5959
}
60-
61-
self.layer.addSublayer(active)
62-
layout()
63-
update(for: progress)
60+
setNeedsLayout()
6461
self.invalidateIntrinsicContentSize()
6562
}
6663

@@ -80,10 +77,12 @@ open class CHIPageControlAleppo: CHIBasePageControl {
8077
active.frame = frame
8178
}
8279

83-
override func layout() {
80+
override open func layoutSubviews() {
81+
super.layoutSubviews()
82+
8483
let floatCount = CGFloat(inactive.count)
85-
let x = (self.frame.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
86-
let y = (self.frame.size.height - self.diameter)*0.5
84+
let x = (self.bounds.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
85+
let y = (self.bounds.size.height - self.diameter)*0.5
8786
var frame = CGRect(x: x, y: y, width: self.diameter, height: self.diameter)
8887

8988
active.cornerRadius = self.radius
@@ -100,6 +99,7 @@ open class CHIPageControlAleppo: CHIBasePageControl {
10099
layer.frame = frame
101100
frame.origin.x += self.diameter + self.padding
102101
}
102+
update(for: progress)
103103
}
104104

105105
override open var intrinsicContentSize: CGSize {

CHIPageControl/CHIPageControlChimayo.swift

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,27 +53,28 @@ open class CHIPageControlChimayo: CHIBasePageControl {
5353
inactive = [CHILayer]()
5454
inactive = (0..<count).map {_ in
5555
let layer = CHILayer()
56-
layer.backgroundColor = self.tintColor.cgColor
5756
self.layer.addSublayer(layer)
5857
return layer
5958
}
6059

61-
layout()
62-
update(for: progress)
60+
setNeedsLayout()
6361
self.invalidateIntrinsicContentSize()
6462
}
6563

66-
override func layout() {
64+
override open func layoutSubviews() {
65+
super.layoutSubviews()
6766
let floatCount = CGFloat(inactive.count)
68-
let x = (self.frame.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
69-
let y = (self.frame.size.height - self.diameter)*0.5
67+
let x = (self.bounds.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
68+
let y = (self.bounds.size.height - self.diameter)*0.5
7069
var frame = CGRect(x: x, y: y, width: self.diameter, height: self.diameter)
7170

7271
inactive.forEach() { layer in
7372
layer.cornerRadius = self.radius
7473
layer.frame = frame
7574
frame.origin.x += self.diameter + self.padding
75+
layer.backgroundColor = self.tintColor.cgColor
7676
}
77+
update(for: progress)
7778
}
7879

7980
override func update(for progress: Double) {

CHIPageControl/CHIPageControlFresno.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,16 @@ open class CHIPageControlFresno: CHIBasePageControl {
5454
return layer
5555
}
5656

57-
layout()
58-
update(for: progress)
57+
setNeedsLayout()
5958
self.invalidateIntrinsicContentSize()
6059
}
6160

62-
override func layout() {
61+
override open func layoutSubviews() {
62+
super.layoutSubviews()
63+
6364
let floatCount = CGFloat(elements.count)
64-
let x = (self.frame.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
65-
let y = (self.frame.size.height - self.diameter)*0.5
65+
let x = (self.bounds.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
66+
let y = (self.bounds.size.height - self.diameter)*0.5
6667
var frame = CGRect(x: x, y: y, width: self.diameter, height: self.diameter)
6768

6869
elements.forEach() { layer in
@@ -85,6 +86,7 @@ open class CHIPageControlFresno: CHIBasePageControl {
8586
max = elements.last?.frame
8687

8788
self.frames = elements.map { $0.frame }
89+
update(for: progress)
8890
}
8991

9092
override func update(for progress: Double) {

CHIPageControl/CHIPageControlJalapeno.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ open class CHIPageControlJalapeno: CHIBasePageControl {
6060

6161
self.layer.addSublayer(active)
6262

63-
layout()
64-
update(for: progress)
63+
setNeedsLayout()
6564
self.invalidateIntrinsicContentSize()
6665
}
6766

@@ -126,10 +125,12 @@ open class CHIPageControlJalapeno: CHIBasePageControl {
126125
}
127126
}
128127

129-
override func layout() {
128+
override open func layoutSubviews() {
129+
super.layoutSubviews()
130+
130131
let floatCount = CGFloat(inactive.count)
131-
let x = (self.frame.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
132-
let y = (self.frame.size.height - self.diameter)*0.5
132+
let x = (self.bounds.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
133+
let y = (self.bounds.size.height - self.diameter)*0.5
133134
var frame = CGRect(x: x, y: y, width: self.diameter, height: self.diameter)
134135

135136
inactive.forEach() { layer in
@@ -143,6 +144,7 @@ open class CHIPageControlJalapeno: CHIBasePageControl {
143144
frame.origin.x += self.diameter + self.padding
144145
}
145146
self.active.fillColor = self.tintColor.cgColor
147+
update(for: progress)
146148
}
147149

148150
override open var intrinsicContentSize: CGSize {

CHIPageControl/CHIPageControlJaloro.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ open class CHIPageControlJaloro: CHIBasePageControl {
3838

3939
@IBInspectable open var elementWidth: CGFloat = 20 {
4040
didSet {
41-
layout()
41+
setNeedsLayout()
4242
}
4343
}
4444

4545
@IBInspectable open var elementHeight: CGFloat = 6 {
4646
didSet {
47-
layout()
47+
setNeedsLayout()
4848
}
4949
}
5050

@@ -70,15 +70,16 @@ open class CHIPageControlJaloro: CHIBasePageControl {
7070

7171
self.layer.addSublayer(active)
7272

73-
layout()
74-
update(for: progress)
73+
setNeedsLayout()
7574
self.invalidateIntrinsicContentSize()
7675
}
7776

78-
override func layout() {
77+
override open func layoutSubviews() {
78+
super.layoutSubviews()
79+
7980
let floatCount = CGFloat(inactive.count)
80-
let x = (self.frame.size.width - self.elementWidth*floatCount - self.padding*(floatCount-1))*0.5
81-
let y = (self.frame.size.height - self.elementHeight)*0.5
81+
let x = (self.bounds.size.width - self.elementWidth*floatCount - self.padding*(floatCount-1))*0.5
82+
let y = (self.bounds.size.height - self.elementHeight)*0.5
8283
var frame = CGRect(x: x, y: y, width: self.elementWidth, height: self.elementHeight)
8384

8485
active.cornerRadius = self.radius
@@ -95,6 +96,7 @@ open class CHIPageControlJaloro: CHIBasePageControl {
9596
layer.frame = frame
9697
frame.origin.x += self.elementWidth + self.padding
9798
}
99+
update(for: progress)
98100
}
99101

100102
override func update(for progress: Double) {

CHIPageControl/CHIPageControlPaprika.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,16 @@ open class CHIPageControlPaprika: CHIBasePageControl {
5555
return layer
5656
}
5757

58-
layout()
59-
update(for: progress)
58+
setNeedsLayout()
6059
self.invalidateIntrinsicContentSize()
6160
}
6261

63-
override func layout() {
62+
override open func layoutSubviews() {
63+
super.layoutSubviews()
64+
6465
let floatCount = CGFloat(elements.count)
65-
let x = (self.frame.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
66-
let y = (self.frame.size.height - self.diameter)*0.5
66+
let x = (self.bounds.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
67+
let y = (self.bounds.size.height - self.diameter)*0.5
6768
var frame = CGRect(x: x, y: y, width: self.diameter, height: self.diameter)
6869

6970
elements.forEach() { layer in
@@ -85,6 +86,7 @@ open class CHIPageControlPaprika: CHIBasePageControl {
8586
max = elements.last?.frame
8687

8788
self.frames = elements.map { $0.frame }
89+
update(for: progress)
8890
}
8991

9092
override func update(for progress: Double) {

CHIPageControl/CHIPageControlPuya.swift

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,16 @@ open class CHIPageControlPuya: CHIBasePageControl {
5454
return layer
5555
}
5656

57-
layout()
58-
update(for: progress)
57+
setNeedsLayout()
5958
self.invalidateIntrinsicContentSize()
6059
}
6160

62-
override func layout() {
61+
override open func layoutSubviews() {
62+
super.layoutSubviews()
63+
6364
let floatCount = CGFloat(elements.count)
64-
let x = (self.frame.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
65-
let y = (self.frame.size.height - self.diameter)*0.5
65+
let x = (self.bounds.size.width - self.diameter*floatCount - self.padding*(floatCount-1))*0.5
66+
let y = (self.bounds.size.height - self.diameter)*0.5
6667
var frame = CGRect(x: x, y: y, width: self.diameter, height: self.diameter)
6768

6869
elements.forEach() { layer in
@@ -85,6 +86,7 @@ open class CHIPageControlPuya: CHIBasePageControl {
8586
max = elements.last?.frame
8687

8788
self.frames = elements.map { $0.frame }
89+
update(for: progress)
8890
}
8991

9092
override func update(for progress: Double) {
@@ -98,6 +100,14 @@ open class CHIPageControlPuya: CHIBasePageControl {
98100
let dist = max.origin.x - min.origin.x
99101
let percent = CGFloat(progress / total)
100102
let page = Int(progress)
103+
104+
for (index, _) in self.frames.enumerated() {
105+
if page > index {
106+
self.elements[index+1].frame = self.frames[index]
107+
} else if page < index {
108+
self.elements[index].frame = self.frames[index]
109+
}
110+
}
101111

102112
let offset = dist * percent
103113
guard let active = elements.first else { return }

CHIPageControl/Core/CHIBasePageControl.swift

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,40 +47,40 @@ import UIKit
4747

4848
@IBInspectable open var padding: CGFloat = 5 {
4949
didSet {
50-
layout()
50+
setNeedsLayout()
5151
update(for: progress)
5252
}
5353
}
5454

5555
@IBInspectable open var radius: CGFloat = 10 {
5656
didSet {
57-
layout()
57+
setNeedsLayout()
5858
update(for: progress)
5959
}
6060
}
6161

6262
@IBInspectable open var inactiveTransparency: CGFloat = 0.4 {
6363
didSet {
64-
layout()
64+
setNeedsLayout()
6565
update(for: progress)
6666
}
6767
}
6868

6969
@IBInspectable open var hidesForSinglePage: Bool = true {
7070
didSet {
71-
layout()
71+
setNeedsLayout()
7272
}
7373
}
7474

7575
@IBInspectable open var borderWidth: CGFloat = 0 {
7676
didSet {
77-
layout()
77+
setNeedsLayout()
7878
}
7979
}
8080

8181
override open var tintColor: UIColor! {
8282
didSet {
83-
layout()
83+
setNeedsLayout()
8484
}
8585
}
8686

@@ -145,10 +145,6 @@ import UIKit
145145
fatalError("Should be implemented in child class")
146146
}
147147

148-
func layout() {
149-
fatalError("Should be implemented in child class")
150-
}
151-
152148
func update(for progress: Double) {
153149
fatalError("Should be implemented in child class")
154150
}

0 commit comments

Comments
 (0)