UITableViewやUICollectionViewなどはUIScrollViewが親クラスとなっています。UIScrollViewにはスクロールのしたことをキャッチするイベントとしてscrollViewDidScrollがありますが、それらを使って、スクロール方向を検知してみたいと思います。
ポイントとなるコードだけ下記に記述しました。
var scrollBeginingPoint: CGPoint!
func scrollViewWillBeginDragging(scrollView: UIScrollView) {
scrollBeginingPoint = scrollView.contentOffset;
}
func scrollViewDidScroll(scrollView: UIScrollView) {
var currentPoint = scrollView.contentOffset;
if(scrollBeginingPoint.y < currentPoint.y){
println("下へスクロール")
}else{
println("上へスクロール")
}
}
スクロールが始まった時に scrollViewWillBeginDraggingイベントが発生するので、その時の位置をscrollBeginingPoint(始点)へ入れておきます。
次に、scrollViewDidScrollで始点から現在地が大きいかどうか比較します。今回は縦方向の動きのためY座標値で判定します。
これらを組み合わせることで、横だったり、斜めだったりも場合によっては取得可能かと思います。
以下にUITableViewを使ったサンプルコードを貼り付けておきます。
storyboardでTableViewを追加し、var tableViewにConnect Outletした状態です。
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var scrollBeginingPoint: CGPoint!
func scrollViewWillBeginDragging(scrollView: UIScrollView) {
scrollBeginingPoint = scrollView.contentOffset;
}
func scrollViewDidScroll(scrollView: UIScrollView) {
var currentPoint = scrollView.contentOffset;
if(scrollBeginingPoint.y < currentPoint.y){
println("下へスクロール")
}else{
println("上へスクロール")
}
}
@IBOutlet weak var tableView: UITableView!
var items = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
tableView.delegate = self
tableView.dataSource = self
for i in 1..<100{
items.append("item \(i)")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
cell.textLabel.text = items[indexPath.row]
return cell
}
}