10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Swift】UIScrollViewがタッチできない時の対処法

Last updated at Posted at 2018-07-28

UISCrollViewがタッチできない時の対処法

iPhone上で何かスクロールするような処理を実装したい!
と思ってUIScrollViewを使った際に「タッチできない」案件が発生して結構苦戦しました...
Swift4向けの記事が他に見当たらなかったので残しておきます。

開発環境

Swift4
Xcode9.2

問題点

先に挙げた問題点として「UIScrollViewがタッチできない」というものがあります。
が、これ実はもともとそういう仕様みたいです。
つまり、タッチできなくて当然と言うことです。
だったら自分でタッチできるようにするしかない!ってことでしてみます。

方法① 新しいクラスを自分で作成

UIScrollViewにはないタッチできる機能を追加するために、以下ような形で新たなクラスMyScrollViewを作成します。そして必要に応じてUIScrollViewではなくMyScrollViewを使用すると言うものです!

MyScrollView.swift
/// UIScrollViewクラスのデフォルトではタッチイベントが取得できるメソッドが実装されていないので拡張する
class MyScrollView: UIScrollView {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        superview?.touchesBegan(touches, with: event)
    }
}

使い方はこんな感じ↓

// スクロールView
var scrollView: MyScrollView!
scrollView = MyScrollView(frame: CGRect (x: 0, y: 0, width: selectView.frame.size.width, height: 100))
scrollView.isUserInteractionEnabled = true
selectView.addSubview(scrollView)

これだけでタッチできるようになります!

方法② UIScrollViewの機能を拡張する

拡張といえばextensionですよね!もちろんextensionを使って実装することもできます。
むしろ①よりもSwiftらしい書き方になるのではないでしょうか。

extension UIScrollView {
    override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.next?.touchesBegan(touches, with: event)
        print("touchesBegan")
    }
}

こんな感じです。使い方はextensionのため、UIScrollViewを使うことでそのまま使うことができます。

まとめ

ここまでこんな感じでUIScrollViewをタッチできるようにする方法を考えてきました。
結論から言うと新しいクラスを使うなり、クラスを拡張するなりで自分で実装することが必要になります。
同じ問題で困っている人の力に少しでもなれたら光栄です。

それにしてもUIScrollViewって本来スクロールするはずなのになんで元からタッチできないようになってるんだろう。。。不思議で仕方ない。
誰か詳しい人いたら教えてください。

10
7
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
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?