質問

アプリで小さな問題に遭遇しています。

私は本質的に一連のシリーズを持っています UIButtons aのサブビューとして追加されました UIScrollView これはペン先の一部です。ボタンをタップするたびに、ボタンが強調表示される前に顕著な遅延があります。ボタンが暗くて選択されているように見える前に、本質的に約0.5秒間保持する必要があります。

私はこれがだからだと思います UIScrollView タッチが巻物であるかどうか、それともサブビュー用のタッチであるかどうかを判断する必要があります。

とにかく、私はどのように進むかについて少し確信が持てません。タップしたらすぐにボタンを選択したいだけです。

どんな助けも感謝します!

編集:

設定を試みました delaysContentTouchesいいえ しかし、私のscrollviewの大部分が満たされているので、スクロールはほとんど不可能になります UIButtons.

役に立ちましたか?

解決 2

わかりました、私はこれをサブクラス化によって解決しました UIScrollView そしてオーバーライド touchesShouldCancelInContentView

今私 UIButton 99のハイライトが適切にタグ付けされ、ScrollViewがスクロールしています!

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;
    }

他のヒント

ジェフの解決策は私にとってはうまく機能していませんでしたが、これに似たものは次のとおりです。 http://charlesharley.com/2013/programming/ubutton-in-uitableviewcell-has-no-highlight-state

オーバーライドに加えて touchesShouldCancelInContentView スクロールビューサブクラスでは、まだ設定する必要があります delaysContentTouchesfalse. 。最後に、返す必要があります true それよりも false あなたのボタン用。上記のリンクの修正された例を次に示します。コメンターが示唆したように、それはのサブクラスをチェックします UIControl それよりも UIButton 具体的には、この動作があらゆる種類のコントロールに適用されるように。

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];
}

Swift4:

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

uiscrollviewを設定してみてください delaysContentTouches 財産への財産。

ストーリーボードソリューション:スクロールビューを選択し、「属性インスペクター」を開き、「コンテンツのタッチを遅延させる」チェックを解除する

enter image description here

スウィフト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またはコードで。

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

私はたくさん持ってる UIButtons 間に UIScrollView. 。 a UIButton 新しいものが押されています UIViewController ユーザーに提示されます。ボタンを押して十分に長く保持している場合、ボタンには落ち込んだ状態が表示されます。私のクライアントは、タップが速すぎると、落ち込んだ状態が表示されないと不平を言っていました。

私の解決策:内部 UIButtons'メソッドをタップします。ここで、新しいロードをロードします UIViewController 画面に表示すると、使用します

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

これにより、次のロードがスケジュールされます UIViewController 次のイベントループ。の時間を許可します UIButton 再描画する。 UIButton 次の状態をロードする前に、うつ状態を示しています UIViewController.

SWIFT 3:

scrollView.delaysContentTouches = false
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top