Skip to content

Instantly share code, notes, and snippets.

@kylebshr
Created January 29, 2019 19:02
Show Gist options
  • Save kylebshr/2bbdcce79eb40919b0215456a7a48bca to your computer and use it in GitHub Desktop.
Save kylebshr/2bbdcce79eb40919b0215456a7a48bca to your computer and use it in GitHub Desktop.
Playing around with getting a scroll view to snap a side panel open or closed. `decelerationRate` is really cool!
import UIKit
class ViewController: UIViewController, UIScrollViewDelegate {
private let blueView = UIView()
private let redView = UIView()
private let scrollView = UIScrollView()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
scrollView.addSubview(redView)
scrollView.addSubview(blueView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.decelerationRate = .fast
scrollView.delegate = self
redView.translatesAutoresizingMaskIntoConstraints = false
redView.backgroundColor = #colorLiteral(red: 0.5725490451, green: 0, blue: 0.2313725501, alpha: 1)
blueView.translatesAutoresizingMaskIntoConstraints = false
blueView.backgroundColor = #colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 1)
NSLayoutConstraint.activate([
scrollView.leftAnchor.constraint(equalTo: view.leftAnchor),
scrollView.rightAnchor.constraint(equalTo: view.rightAnchor),
scrollView.topAnchor.constraint(equalTo: view.topAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
redView.heightAnchor.constraint(equalTo: view.heightAnchor),
redView.widthAnchor.constraint(equalToConstant: 240),
redView.leftAnchor.constraint(equalTo: scrollView.leftAnchor),
redView.topAnchor.constraint(equalTo: scrollView.topAnchor),
redView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
redView.rightAnchor.constraint(equalTo: blueView.leftAnchor),
blueView.heightAnchor.constraint(equalTo: view.heightAnchor),
blueView.widthAnchor.constraint(equalTo: view.safeAreaLayoutGuide.widthAnchor),
blueView.rightAnchor.constraint(equalTo: scrollView.rightAnchor),
blueView.topAnchor.constraint(equalTo: scrollView.topAnchor),
blueView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
])
}
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
let expandedX = scrollView.contentSize.width - scrollView.frame.width
if velocity.x == 0 && (targetContentOffset.pointee.x == 0 || targetContentOffset.pointee.x == expandedX) {
return
} else if velocity.x < 0 {
targetContentOffset.pointee = CGPoint.zero
} else {
targetContentOffset.pointee = CGPoint(x: expandedX, y: 0)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment