web-dev-qa-db-ja.com

ボタンをドラッグしてもScrollViewがスクロールしない

全体にボタンがないときにスクロールしていたスクロールビューがあります。今ではそうなり、(シミュレーターで)マウスをドラッグしても何も起こりません(ボタンが押されているためだと思います)。どうすればこれを正しくすることができますか?

39
DanielaM

これは、UIButtonUIScrollViewサブビュー(あなたの場合はボタンがサブビューとして追加されていると思います)がスクロールビューではなくタッチを追跡しているために発生しています。ここで重要なのはUIScrollViewメソッドtouchesShouldCancelInContentViewです。その説明によると、「ビューがUIControlオブジェクトでない場合、デフォルトの戻り値はYESです。それ以外の場合は、NOを返します。」つまり、UIControlオブジェクト(ボタン)の場合、UIScrollViewは、スクロールを妨げるタッチをキャンセルしようとはしません。

したがって、ボタンでスクロールできるようにするには:

  1. UIScrollViewプロパティcanCancelContentTouchesYESに設定されていることを確認してください。
  2. 次のように、コンテンツビューオブジェクトがUIScrollViewの場合、サブクラスtouchesShouldCancelInContentViewとオーバーライドYESを使用してUIButtonを返します。
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    if ( [view isKindOfClass:[UIButton class]] ) {
        return YES;
    }

    return [super touchesShouldCancelInContentView:view];
}
98

私はこの問題のSwift解決策を探してこの質問を見つけました、私はそれを次のように「翻訳」しました:

Swift 5

class UIButtonScrollView: UIScrollView {

    override func touchesShouldCancel(in view: UIView) -> Bool {
        if view.isKind(of: UIButton.self) {
          return true
        }

        return super.touchesShouldCancel(in: view)
    }    
}

これが役立つことを願っています

10
pugia

Swift 3ソリューション

override func touchesShouldCancel(in view: UIView) -> Bool {
    if view is UIButton {
        return true
    }
    return super.touchesShouldCancel(in: view)
}
6
Gregg

私の場合、この方法で解決しました。

ViewDidLoad内

self.scrollView.panGestureRecognizer.delaysTouchesBegan = self.scrollView.delaysContentTouches;

。m

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    if ([view isKindOfClass:[UIControl class]]) return YES;
    return NO;
}
0
User18474728

シミュレーターでこれが表示されている場合に試すことの1つは、実際の電話で実行することです。シミュレーターでスクロールできませんでしたが、電話に問題はありませんでした。

0