54

アプリで小さな問題が発生しています。

私は基本的に、ペン先の一部であるUIButtonsサブビューとして一連の追加を持っています。UIScrollViewボタンをタップするたびに、ボタンが強調表示されるまでにかなりの遅延があります。ボタンが暗くなり、選択された状態で表示されるまで、基本的に約0.5秒間押し続ける必要があります。

UIScrollViewこれは、タッチが巻物なのか、それともサブビュー用のタッチなのかを判断する必要があるためだと思います。

とにかく、どうすればいいのかわからない。ボタンをタップするとすぐに選択された状態で表示されるようにしたいだけです。

どんな助けでも大歓迎です!

編集:

NOdelaysContentTouchesに設定しようとしましたが、scrollViewの大部分がで埋められているため、スクロールがほぼ不可能になります。UIButtons

4

7 に答える 7

58

ジェフのソリューションは私にとってはうまく機能していませんでしたが、これと同様のソリューションは機能します:http: //charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state

スクロールビューサブクラスでオーバーライドすることに加えて、に設定するtouchesShouldCancelInContentView必要があります。最後に、ボタンではなく戻る必要があります。上記のリンクから変更された例を次に示します。コメント提供者が示唆したように、この動作がすべてのタイプのコントロールに適用されるように、具体的にではなく、のサブクラスをチェックします。delaysContentTouchesfalsetruefalseUIControlUIButton

Objective-C:

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.delaysContentTouches = false;
    }

    return self;
}

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    if ([view isKindOfClass:UIControl.class]) {
        return true;
    }

    return [super touchesShouldCancelInContentView:view];
}

スウィフト4:

override func touchesShouldCancel(in view: UIView) -> Bool {
    if view is UIControl {
        return true
    }
    return super.touchesShouldCancel(in: view)
}
于 2013-10-29T11:10:34.687 に答える
40

UIScrollViewわかりました、サブクラス化してオーバーライドすることでこれを解決しましたtouchesShouldCancelInContentView

これで、UIButton99としてタグ付けされたものが適切にハイライトされ、スクロールビューがスクロールします。

myCustomScrollView.h

@interface myCustomScrollView : UIScrollView  {

}

@end

およびmyCustomScrollView.m

@implementation myCustomScrollView

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view
    {
        NSLog(@"touchesShouldCancelInContentView");

        if (view.tag == 99)
            return NO;
        else 
            return YES;
    }
于 2010-09-04T16:24:35.640 に答える
28

UIScrollViewdelaysContentTouchesプロパティをNOに設定してみてください。

于 2010-09-04T14:22:14.167 に答える
3

ストーリーボードソリューション:スクロールビューを選択し、[属性インスペクター]を開いて、[コンテンツタッチの遅延]のチェックを外します

ここに画像の説明を入力してください

于 2017-01-17T09:54:47.663 に答える
2

Swift 3:

import UIKit

class ScrollViewWithButtons: UIScrollView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        myInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        myInit()
    }

    private func myInit() {
        self.delaysContentTouches = false
    }

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

その後、これScrollViewWithButtonsをIBまたはコードで使用できます。

于 2017-07-21T17:16:59.250 に答える
1

スウィフト3:

scrollView.delaysContentTouches = false
于 2017-05-27T14:29:05.413 に答える
0

既存のソリューションはどれも私にはうまくいきませんでした。たぶん私の状況はもっとユニークです。

UIButtons内にたくさんありますUIScrollView。aUIButtonを押すと、新しいUIViewControllerものがユーザーに表示されます。ボタンを十分長く押し続けると、ボタンは押された状態を示します。私のクライアントは、タップが速すぎると落ち込んだ状態が表示されないと不満を言っていました。

私の解決策:UIButtons'tapメソッド内で、新しいものをロードしUIViewControllerて画面に表示します。

[self performSelector:@selector(loadNextScreenWithOptions:) 
           withObject:options 
           afterDelay:0.]

UIViewControllerこれにより、次のイベントループでの次のロードがスケジュールされます。UIButton再描画するための時間を確保します。これUIButtonで、次をロードする前に、押し下げられた状態が表示されますUIViewController

于 2012-07-23T14:58:26.660 に答える