-
Notifications
You must be signed in to change notification settings - Fork 46
Expand file tree
/
Copy pathContainerViewController.swift
More file actions
108 lines (84 loc) · 3.58 KB
/
ContainerViewController.swift
File metadata and controls
108 lines (84 loc) · 3.58 KB
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//
// ContainerViewController.swift
// ZShare
//
// Created by Michal Rentka on 18.01.2021.
// Copyright © 2021 Corporation for Digital Scholarship. All rights reserved.
//
import UIKit
final class ContainerViewController: UIViewController {
@IBOutlet private weak var containerView: UIView!
private weak var containerHeight: NSLayoutConstraint?
private var constraints: [NSLayoutConstraint] = []
private var didAppear = false
private static let regularWidth: CGFloat = 500
override func viewDidLoad() {
super.viewDidLoad()
setupLayoutForCurrentTraits()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
didAppear = true
}
override func preferredContentSizeDidChange(forChildContentContainer container: UIContentContainer) {
super.preferredContentSizeDidChange(forChildContentContainer: container)
guard let containerHeight else { return }
containerHeight.constant = container.preferredContentSize.height
guard didAppear else { return }
UIView.animate(withDuration: 0.2) {
self.view.layoutIfNeeded()
}
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
guard previousTraitCollection?.horizontalSizeClass != traitCollection.horizontalSizeClass else { return }
clearLayout()
setupLayoutForCurrentTraits()
func clearLayout() {
NSLayoutConstraint.deactivate(constraints)
constraints = []
containerHeight = nil
}
}
private func setupLayoutForCurrentTraits() {
switch traitCollection.horizontalSizeClass {
case .regular:
constraints = setupForHorizontalSizeClassRegular()
case .compact:
constraints = setupForHorizontalSizeClassCompact()
case .unspecified:
break
@unknown default:
break
}
func setupForHorizontalSizeClassRegular() -> [NSLayoutConstraint] {
view.backgroundColor = .clear
containerView.layer.cornerRadius = 8
containerView.layer.masksToBounds = true
let containerHeight = containerView.heightAnchor.constraint(equalToConstant: 100)
containerHeight.priority = .defaultHigh
self.containerHeight = containerHeight
let constraints = [
containerView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
containerView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
containerView.heightAnchor.constraint(lessThanOrEqualTo: view.heightAnchor),
containerHeight,
containerView.widthAnchor.constraint(equalToConstant: Self.regularWidth)
]
NSLayoutConstraint.activate(constraints)
return constraints
}
func setupForHorizontalSizeClassCompact() -> [NSLayoutConstraint] {
containerView.layer.cornerRadius = 0
containerView.layer.masksToBounds = false
let constraints = [
containerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
containerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
containerView.topAnchor.constraint(equalTo: view.topAnchor),
containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
]
NSLayoutConstraint.activate(constraints)
return constraints
}
}
}