Skip to content

Instantly share code, notes, and snippets.

@xmhafiz
Last active June 27, 2023 21:00
Show Gist options
  • Save xmhafiz/e4cda411ded7a841385cfcb803fc6b91 to your computer and use it in GitHub Desktop.
Save xmhafiz/e4cda411ded7a841385cfcb803fc6b91 to your computer and use it in GitHub Desktop.
class BottomSheetViewController: UIViewController {
// ...
private var minTopSpacing: CGFloat = 80
// MARK: - View Setup
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
animatePresent()
}
private func setupViews() {
view.backgroundColor = .clear
view.addSubview(dimmedView)
NSLayoutConstraint.activate([
// Set dimmedView edges to superview
dimmedView.topAnchor.constraint(equalTo: view.topAnchor),
dimmedView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
dimmedView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
dimmedView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
])
// Container View
// All sides are set without spacing, except the top edge have a minimum space
// So the bottom sheet view won't go higher
view.addSubview(mainContainerView)
NSLayoutConstraint.activate([
mainContainerView.topAnchor.constraint(greaterThanOrEqualTo: view.topAnchor, constant: minTopSpacing)
mainContainerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
mainContainerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
mainContainerView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
])
// Top draggable bar view
mainContainerView.addSubview(topBarView)
NSLayoutConstraint.activate([
topBarView.topAnchor.constraint(equalTo: mainContainerView.topAnchor),
topBarView.leadingAnchor.constraint(equalTo: mainContainerView.leadingAnchor),
topBarView.trailingAnchor.constraint(equalTo: mainContainerView.trailingAnchor),
topBarView.heightAnchor.constraint(equalToConstant: 54)
])
// Add fancy bar line
topBarView.addSubview(barLineView)
NSLayoutConstraint.activate([
barLineView.centerXAnchor.constraint(equalTo: topBarView.centerXAnchor),
barLineView.topAnchor.constraint(equalTo: topBarView.topAnchor, constant: 8),
barLineView.widthAnchor.constraint(equalToConstant: 40),
barLineView.heightAnchor.constraint(equalToConstant: 6)
])
// Content View
// This is where content can be dynamically set
mainContainerView.addSubview(contentView)
contentView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
contentView.leadingAnchor.constraint(equalTo: mainContainerView.leadingAnchor, constant: 24),
contentView.trailingAnchor.constraint(equalTo: mainContainerView.trailingAnchor, constant: -24),
contentView.topAnchor.constraint(equalTo: topBarView.bottomAnchor, constant: 16),
contentView.bottomAnchor.constraint(equalTo: mainContainerView.bottomAnchor, constant: -32)
])
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment