##事象
個人開発で、スクロールビュー上にUIButtonを配置して
ドロワーを実装した時、UIButton上でスクロールできない問題に
ぶつかったのでその時の解決策をメモ
##原因
まず、UIControlに準拠するUIButton上では、
スクロールイベントが発火しない。
[UIScrollView touchesShouldCancelInContentView:] The default returned value is YES if view is not a UIControl object; otherwise, it returns NO.
これはどういうことかというと、タッチ対象がUIControlオブジェクトの時、
UIButtonの時は、touchesShouldCancelがfalseで返ってくる。
つまり、タップイベントがキャンセルされない。
##解決
この問題を解決するには、UIScrollView上のUIButton上では
touchesShouldCancelInContentViewでtrueを返してあげれば良い
###カスタムクラスを作成
class CustomScrollView: UIScrollView {
/// ScrollView上のボタン上でドラッグした時、ドラッグを優先する(tagを1にしておく
override func touchesShouldCancel(in view: UIView) -> Bool {
if view.tag == 1 {
return true
}
return super.touchesShouldCancel(in: view)
}
}
###tagを設定しておく
カスタムクラスの
view.tag == 1
を見ると、"tagが1の時"という条件がついている。
storyboard、もしくはコード上で対象のUIButtonオブジェクトのtagを1に設定しておくことで、
この条件式が使える。
##終わりに
壁にぶつかっている時はスムーズに開発できずに苦しいけど、
できることをやっている時は成長していない時だと思えば
壁に立ち向かいやすくなるかもしれない。