Skip to content

Commit 0c4a10f

Browse files
Merge pull request #67 from touchlane/FramesLayout
Frames layout
2 parents b26fa4f + d02ebac commit 0c4a10f

9 files changed

+261
-389
lines changed

Example/Source/Controllers/CarouselController/Menu/CircularTitleScrollView.swift

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,6 @@ class CarouselTitleScrollView: TitleScrollView<CarouselTitleItem> {
8585

8686
private typealias PrivateCarouselTitleScrollView = CarouselTitleScrollView
8787
private extension PrivateCarouselTitleScrollView {
88-
func activateBackgroundViewConstraints(view: UIView, position: CGFloat, width: CGFloat) {
89-
var constraints: [NSLayoutConstraint] = []
90-
constraints.append(view.topAnchor.constraint(equalTo: topAnchor, constant: itemOffsetTop + itemHeight))
91-
let leading = view.leadingAnchor.constraint(equalTo: leadingAnchor, constant: position)
92-
constraints.append(leading)
93-
let width = view.widthAnchor.constraint(equalToConstant: width)
94-
constraints.append(width)
95-
NSLayoutConstraint.activate(constraints)
96-
}
97-
9888
func activateConstraints(view: UIView, prevView: UIView?, isLast: Bool) {
9989
var constraints: [NSLayoutConstraint] = []
10090
constraints.append(view.topAnchor.constraint(equalTo: topAnchor, constant: itemOffsetTop))

Source/SlideContainerController.swift

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,44 +10,53 @@ import UIKit
1010

1111
///SlideContainerController do control for specific container view
1212
final class SlideContainerController {
13-
private var internalView = UIView()
13+
private var internalView = InternalView()
1414
private var isViewLoaded = false
1515

1616
///Property to indicate if target view mounted to container
1717
var hasContent: Bool {
18-
return isViewLoaded
18+
return self.isViewLoaded
1919
}
2020

2121
///Implements lazy load, add target view as subview to container view when needed and set hasContent = true
2222
func load(view: UIView) {
23-
guard !isViewLoaded else {
23+
guard !self.isViewLoaded else {
2424
return
2525
}
26-
isViewLoaded = true
27-
view.translatesAutoresizingMaskIntoConstraints = false
28-
internalView.addSubview(view)
29-
NSLayoutConstraint.activate([
30-
view.topAnchor.constraint(equalTo: internalView.topAnchor),
31-
view.leadingAnchor.constraint(equalTo: internalView.leadingAnchor),
32-
view.bottomAnchor.constraint(equalTo: internalView.bottomAnchor),
33-
view.trailingAnchor.constraint(equalTo: internalView.trailingAnchor)
34-
])
26+
self.isViewLoaded = true
27+
self.internalView.addSubview(view)
28+
view.frame = self.internalView.bounds
3529
}
3630

3731
///Removes view from container and sets hasContent = false
3832
func unloadView() {
39-
guard isViewLoaded else {
33+
guard self.isViewLoaded else {
4034
return
4135
}
42-
isViewLoaded = false
43-
internalView.subviews.forEach({ $0.removeFromSuperview() })
36+
self.isViewLoaded = false
37+
self.internalView.subviews.forEach({ $0.removeFromSuperview() })
4438
}
4539
}
4640

4741
///Viewable protocol implementation
4842
private typealias ViewableImplementation = SlideContainerController
4943
extension ViewableImplementation: Viewable {
5044
var view: UIView {
51-
return internalView
45+
return self.internalView
46+
}
47+
}
48+
49+
///Internal view for SlideContainerController
50+
private final class InternalView: UIView {
51+
private var oldSize: CGSize = .zero
52+
53+
override func layoutSubviews() {
54+
guard self.oldSize != self.bounds.size else {
55+
return
56+
}
57+
super.layoutSubviews()
58+
59+
self.subviews.first?.frame = self.bounds
60+
self.oldSize = self.bounds.size
5261
}
5362
}

Source/SlideContainerView.swift

Lines changed: 16 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -9,114 +9,35 @@
99
import UIKit
1010

1111
///Represents container view for one page content
12-
final class SlideContainerView {
12+
final class SlideContainerView: UIView {
1313
private var internalView: UIView
14-
private let containerView = UIView()
15-
16-
///Constraints for internal view, allow to change UI positioning for container view
17-
var constraints = [NSLayoutConstraint]()
1814

15+
private var oldSize: CGSize = .zero
16+
1917
/// - Parameter view: The view to show as content.
2018
init(view: UIView) {
21-
containerView.clipsToBounds = true
22-
containerView.translatesAutoresizingMaskIntoConstraints = false
23-
containerView.addSubview(view)
24-
NSLayoutConstraint.activate([
25-
view.topAnchor.constraint(equalTo: containerView.topAnchor),
26-
view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
27-
view.widthAnchor.constraint(equalTo: containerView.widthAnchor),
28-
view.heightAnchor.constraint(equalTo: containerView.heightAnchor)
29-
])
30-
internalView = view
19+
self.internalView = view
20+
super.init(frame: .zero)
21+
self.clipsToBounds = true
22+
self.addSubview(view)
3123
}
3224

33-
///Sets container view frame width or height to 0,
34-
///internal view saves frame size to avoid unnecessary layout work
35-
func hide(direction: SlideDirection) {
36-
var removeConstraints: [NSLayoutConstraint] = []
37-
var addConstraints: [NSLayoutConstraint] = []
38-
39-
let layoutAttribute: NSLayoutConstraint.Attribute
40-
let containerViewAnchor: NSLayoutDimension
41-
let internalViewAnchor: NSLayoutDimension
42-
let constraintConstant: CGFloat
43-
switch direction {
44-
case .horizontal:
45-
layoutAttribute = .width
46-
containerViewAnchor = containerView.widthAnchor
47-
internalViewAnchor = internalView.widthAnchor
48-
constraintConstant = containerView.frame.size.width
49-
case .vertical:
50-
layoutAttribute = .height
51-
containerViewAnchor = containerView.heightAnchor
52-
internalViewAnchor = internalView.heightAnchor
53-
constraintConstant = containerView.frame.size.height
54-
}
55-
56-
guard let constraintIndex = constraints.index(where: { $0.firstAttribute == layoutAttribute }),
57-
let viewConstraintIndex = containerView.constraints.index(where: { $0.firstAttribute == layoutAttribute }) else {
58-
return
59-
}
60-
removeConstraints.append(constraints[constraintIndex])
61-
constraints.remove(at: constraintIndex)
62-
let constraint = containerViewAnchor.constraint(equalToConstant: 0)
63-
addConstraints.append(constraint)
64-
constraints.append(constraint)
65-
66-
removeConstraints.append(containerView.constraints[viewConstraintIndex])
67-
let viewConstraint = internalViewAnchor.constraint(equalToConstant: constraintConstant)
68-
addConstraints.append(viewConstraint)
69-
NSLayoutConstraint.deactivate(removeConstraints)
70-
NSLayoutConstraint.activate(addConstraints)
25+
required init?(coder aDecoder: NSCoder) {
26+
fatalError("init(coder:) has not been implemented")
7127
}
7228

73-
///Returns container view frame width or height to match superview frame
74-
func show(direction: SlideDirection) {
75-
guard let superView = containerView.superview else {
29+
override func layoutSubviews() {
30+
guard self.oldSize != self.bounds.size else {
7631
return
7732
}
78-
var removeConstraints: [NSLayoutConstraint] = []
79-
var addConstraints: [NSLayoutConstraint] = []
80-
81-
let layoutAttribute: NSLayoutConstraint.Attribute
82-
let containerViewAnchor: NSLayoutDimension
83-
let internalViewAnchor: NSLayoutDimension
84-
let superviewAnchor: NSLayoutDimension
85-
switch direction {
86-
case .horizontal:
87-
layoutAttribute = .width
88-
containerViewAnchor = containerView.widthAnchor
89-
internalViewAnchor = internalView.widthAnchor
90-
superviewAnchor = superView.widthAnchor
91-
case .vertical:
92-
layoutAttribute = .height
93-
containerViewAnchor = containerView.heightAnchor
94-
internalViewAnchor = internalView.heightAnchor
95-
superviewAnchor = superView.heightAnchor
96-
}
9733

98-
guard let constraintIndex = constraints.index(where: { $0.firstAttribute == layoutAttribute }),
99-
let viewConstraintIndex = internalView.constraints.index(where: { $0.firstAttribute == layoutAttribute }) else {
34+
super.layoutSubviews()
35+
36+
guard !self.isHidden else {
10037
return
10138
}
102-
removeConstraints.append(constraints[constraintIndex])
103-
constraints.remove(at: constraintIndex)
104-
let constraint = containerViewAnchor.constraint(equalTo: superviewAnchor)
105-
addConstraints.append(constraint)
106-
constraints.append(constraint)
10739

108-
removeConstraints.append(internalView.constraints[viewConstraintIndex])
109-
let viewConstraint = internalViewAnchor.constraint(equalTo: containerViewAnchor)
110-
addConstraints.append(viewConstraint)
111-
NSLayoutConstraint.deactivate(removeConstraints)
112-
NSLayoutConstraint.activate(addConstraints)
113-
}
114-
}
115-
116-
///Viewable protocol implementation
117-
private typealias ViewableImplementation = SlideContainerView
118-
extension ViewableImplementation: Viewable {
119-
var view: UIView {
120-
return containerView
40+
self.internalView.frame = self.bounds
41+
self.oldSize = self.bounds.size
12142
}
12243
}

Source/SlideContentController.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,14 @@ final class SlideContentController {
3232
didSet {
3333
if isCarousel {
3434
addEdgeContainersIfNeeded()
35-
}
36-
else {
35+
} else {
3736
removeEdgeContainersIfNeeded()
3837
}
3938
}
4039
}
4140

4241
/// - Parameter pagesCount: number of pages
43-
/// - Parameter scrollDirection: indicates the target slide direction
42+
/// - Parameter slideDirection: indicates the target slide direction
4443
init(pagesCount: Int, slideDirection: SlideDirection) {
4544
self.slideDirection = slideDirection
4645
slideContentView = SlideContentView(slideDirection: slideDirection)

0 commit comments

Comments
 (0)