全体にボタンがないときにスクロールしていたスクロールビューがあります。今ではそうなり、(シミュレーターで)マウスをドラッグしても何も起こりません(ボタンが押されているためだと思います)。どうすればこれを正しくすることができますか?
これは、UIButton
のUIScrollView
サブビュー(あなたの場合はボタンがサブビューとして追加されていると思います)がスクロールビューではなくタッチを追跡しているために発生しています。ここで重要なのはUIScrollView
メソッドtouchesShouldCancelInContentView
です。その説明によると、「ビューがUIControl
オブジェクトでない場合、デフォルトの戻り値はYESです。それ以外の場合は、NO
を返します。」つまり、UIControl
オブジェクト(ボタン)の場合、UIScrollView
は、スクロールを妨げるタッチをキャンセルしようとはしません。
したがって、ボタンでスクロールできるようにするには:
UIScrollView
プロパティcanCancelContentTouches
がYES
に設定されていることを確認してください。UIScrollView
の場合、サブクラスtouchesShouldCancelInContentView
とオーバーライドYES
を使用してUIButton
を返します。- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
if ( [view isKindOfClass:[UIButton class]] ) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
私はこの問題の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)
}
}
これが役立つことを願っています
Swift 3ソリューション
override func touchesShouldCancel(in view: UIView) -> Bool {
if view is UIButton {
return true
}
return super.touchesShouldCancel(in: view)
}
私の場合、この方法で解決しました。
ViewDidLoad内
self.scrollView.panGestureRecognizer.delaysTouchesBegan = self.scrollView.delaysContentTouches;
。m
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:[UIControl class]]) return YES;
return NO;
}
シミュレーターでこれが表示されている場合に試すことの1つは、実際の電話で実行することです。シミュレーターでスクロールできませんでしたが、電話に問題はありませんでした。