LoginSignup
62
56

More than 5 years have passed since last update.

SwiftでUIScrollViewやUITableViewなどでスクロール方向を取得する

Last updated at Posted at 2014-12-08

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
    }

}
62
56
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
62
56