Skip to content

Instantly share code, notes, and snippets.

@bricklife
Created March 8, 2018 01:45
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save bricklife/cc2fd7a2075edec3ff6117985a7bbf14 to your computer and use it in GitHub Desktop.
Save bricklife/cc2fd7a2075edec3ff6117985a7bbf14 to your computer and use it in GitHub Desktop.
UIPanGestureRecognizer on UIScrollView
//
// ViewController.swift
// PanOnScroll
//
// Created by Shinichiro Oba on 2018/03/08.
// Copyright © 2018 bricklife.com. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var topMargin: NSLayoutConstraint!
weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
let pan = UIPanGestureRecognizer(target: self, action: #selector(pan(_:)))
pan.delegate = self
scrollView.addGestureRecognizer(pan)
move(0)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let nav = segue.destination as! UINavigationController
let table = nav.childViewControllers.first as! UITableViewController
scrollView = table.tableView
}
func move(_ y: CGFloat) {
topMargin.constant = 100 + y
}
var start: CGFloat = 0
@objc func pan(_ pan: UIPanGestureRecognizer) {
let position = pan.location(in: view)
switch pan.state {
case .began:
start = position.y + scrollView.contentOffset.y
case .changed:
let diff = position.y - start
if diff > 0 {
move(diff)
scrollView.contentOffset = .zero
scrollView.showsVerticalScrollIndicator = false
} else {
move(0)
scrollView.showsVerticalScrollIndicator = true
}
default:
move(0)
scrollView.showsVerticalScrollIndicator = true
UIView.animate(withDuration: 0.2) {
self.view.layoutIfNeeded()
}
}
}
}
extension ViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment