Skip to content

Commit eb80b9d

Browse files
Merge pull request #7 from zmian/master
Fix a bug to remove `hidden` value KVO observers on arranged subviews
2 parents 6bdabd3 + db9e912 commit eb80b9d

1 file changed

Lines changed: 24 additions & 23 deletions

File tree

Example/TZStackView-Example/TZStackView/TZStackView.swift

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ import UIKit
1111
struct TZAnimationDidStopQueueEntry: Equatable {
1212
let view: UIView
1313
let hidden: Bool
14-
init(view: UIView, hidden: Bool) {
15-
self.view = view
16-
self.hidden = hidden
17-
}
1814
}
1915

2016
func ==(lhs: TZAnimationDidStopQueueEntry, rhs: TZAnimationDidStopQueueEntry) -> Bool {
@@ -41,19 +37,15 @@ public class TZStackView: UIView {
4137

4238
public var spacing: CGFloat = 0
4339

44-
public var arrangedSubviews: [UIView] {
45-
return _arrangedSubviews
46-
}
47-
4840
var layoutMarginsRelativeArrangement = false
4941

5042
private var stackViewConstraints = [NSLayoutConstraint]()
5143
private var subviewConstraints = [NSLayoutConstraint]()
5244

53-
private var _arrangedSubviews: [UIView] {
45+
private(set) var arrangedSubviews: [UIView] = [] {
5446
didSet {
5547
setNeedsUpdateConstraints()
56-
registerHiddenListeners()
48+
registerHiddenListeners(oldValue)
5749
}
5850
}
5951

@@ -66,21 +58,28 @@ public class TZStackView: UIView {
6658
private var animatingToHiddenViews = [UIView]()
6759

6860
public init(arrangedSubviews: [UIView] = []) {
69-
self._arrangedSubviews = arrangedSubviews
7061
super.init(frame: CGRectZero)
71-
7262
for arrangedSubview in arrangedSubviews {
7363
arrangedSubview.setTranslatesAutoresizingMaskIntoConstraints(false)
7464
addSubview(arrangedSubview)
7565
}
76-
registerHiddenListeners()
77-
registerHiddenListeners()
66+
67+
// Closure to invoke didSet()
68+
{ self.arrangedSubviews = arrangedSubviews }()
7869
}
7970

80-
private func registerHiddenListeners() {
81-
for arrangedSubview in arrangedSubviews {
82-
removeHiddenListener(arrangedSubview)
83-
addHiddenListener(arrangedSubview)
71+
deinit {
72+
// This removes `hidden` value KVO observers using didSet()
73+
arrangedSubviews = []
74+
}
75+
76+
private func registerHiddenListeners(previousArrangedSubviews: [UIView]) {
77+
previousArrangedSubviews.map {[weak self] in
78+
self?.removeHiddenListener($0)
79+
}
80+
81+
arrangedSubviews.map {[weak self] in
82+
self?.addHiddenListener($0)
8483
}
8584
}
8685

@@ -133,7 +132,7 @@ public class TZStackView: UIView {
133132
addHiddenListener(arrangedSubview)
134133
}
135134

136-
public func hiddenAnimationStopped() {
135+
func hiddenAnimationStopped() {
137136
var queueEntriesToRemove = [TZAnimationDidStopQueueEntry]()
138137
for entry in animationDidStopQueueEntries {
139138
let view = entry.view
@@ -150,17 +149,19 @@ public class TZStackView: UIView {
150149
}
151150

152151
public func addArrangedSubview(view: UIView) {
153-
_arrangedSubviews.append(view)
152+
view.setTranslatesAutoresizingMaskIntoConstraints(false)
153+
addSubview(view)
154+
arrangedSubviews.append(view)
154155
}
155156

156157
public func removeArrangedSubview(view: UIView) {
157-
if let index = find(_arrangedSubviews, view) {
158-
_arrangedSubviews.removeAtIndex(index)
158+
if let index = find(arrangedSubviews, view) {
159+
arrangedSubviews.removeAtIndex(index)
159160
}
160161
}
161162

162163
public func insertArrangedSubview(view: UIView, atIndex stackIndex: Int) {
163-
_arrangedSubviews.insert(view, atIndex: stackIndex)
164+
arrangedSubviews.insert(view, atIndex: stackIndex)
164165
}
165166

166167
override public func updateConstraints() {

0 commit comments

Comments
 (0)