2
3

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 3 years have passed since last update.

【Swift5】UIScrollView上のUIButton上でスクロールできない

Posted at

##事象
個人開発で、スクロールビュー上に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に設定しておくことで、
この条件式が使える。

##終わりに
壁にぶつかっている時はスムーズに開発できずに苦しいけど、
できることをやっている時は成長していない時だと思えば
壁に立ち向かいやすくなるかもしれない。

2
3
0

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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?