UISCrollViewがタッチできない時の対処法
iPhone上で何かスクロールするような処理を実装したい!
と思ってUIScrollViewを使った際に「タッチできない」案件が発生して結構苦戦しました...
Swift4向けの記事が他に見当たらなかったので残しておきます。
開発環境
Swift4
Xcode9.2
問題点
先に挙げた問題点として「UIScrollViewがタッチできない」というものがあります。
が、これ実はもともとそういう仕様みたいです。
つまり、タッチできなくて当然と言うことです。
だったら自分でタッチできるようにするしかない!ってことでしてみます。
方法① 新しいクラスを自分で作成
UIScrollViewにはないタッチできる機能を追加するために、以下ような形で新たなクラスMyScrollViewを作成します。そして必要に応じてUIScrollViewではなくMyScrollViewを使用すると言うものです!
/// 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って本来スクロールするはずなのになんで元からタッチできないようになってるんだろう。。。不思議で仕方ない。
誰か詳しい人いたら教えてください。