2013-07-17 16 views
13

私はUIScrollViewを持っています。UIButtonsがあり、UIButtonのアクションでは、それぞれUIButtonUIImageが強調表示されています。UIScrollview delayContentTouches問題

私は、私は非常に高速UIButtonをタッチアップ場合UIButtonUIImageが示されていないだろう強調さdelaysContentTouchesNOとして設定されていない場合。 delaysContentTouchesプロパティをNOと設定した後は、UIButtonが強調表示されたUIImageのみが表示されます。

delaysContentTouchesプロパティをUIScrollViewにNOと設定した後、 UIButtonsをドラッグして私のUIScrollViewをスクロールすることはできません。今、どうすればこの問題を解決できますか?

私に助言を与えてください。

ありがとうございます。

+3

delayContentTouchesは、スクロールビューが常にタッチを最初に取得し、スライドするかどうかによってスクロールするかどうかを決定することを意味します。この最初のテストは、このプロパティをNOに設定したときに表示される遅延です。スクロールビューに最初にタッチしないようにしているが、すべてのサブビューはタッチを受け入れる必要があると言います。 –

+0

ボタンが本当に小さいですし、そのボタンがどこで動くかをスクロールしないでください。あなたが本当に大きなボタンを持っているが、まだボタンがタッチを最初に取るが、あなたが指をスライドさせるときにスクロールすることを望むなら、私はそれを考えることができる唯一の方法は、スライドの誤ったスワイプのジェスチャ認識機能を追加することです。ジェスチャ認識ツールはタッチイベントを無効にします。ジェスチャのメソッドを呼び出すと、scrollviewのコンテンツを設定し直すだけです。私はこれを試していないので、私はそれが動作するかどうかわからない.... –

+0

私は私のタッチを下にスクロールビューに渡され、私のボタンを長くタッチするときのような何かをすることはできますか?出来ますか?どのように私はこれを達成することができますか? –

答えて

5

OK、私は法の下に実装することで解決してきた:

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

    if ([view isKindOfClass:[UIButton class]]) 
     return NO; 
    else 
     return YES; 
} 
+0

残念なことに(私はscrollviewsデリゲートを設定しました) – Chris

+0

あなたがuiscrollview(これはデリゲートメソッドではありません)をサブクラス化し、上のNO/YES値を逆にしてもうまくいきます。 – Chris

+0

まず、ビューが 'UIButton'の場合は' YES'を返します。 'NO'はすでにデフォルトの動作です。次に、else節に '[super touchesShouldCancelInContentView:view]'を返します。 – devios1

2

(と、Appleがこの問題を無視していることのようです)、これまでのオンライン満足のいく解決策を見つけることができません。アップルのデベロッパーフォーラムにスレッドを見つけました。そこにはいくつかの助言があります:UIScrollView: 'delaysContentTouches' ignored

私はこのリンクから回避策を使用することができました。回避策を要約すると(私はここで引用しています):

UIEventオブジェクトにはタイムスタンプが含まれています。

埋め込みサブビューには、touchesBegan時にタイムスタンプを記録できます。

scrollviewのサブビューのtouchesMovedでは、タイムスタンプと の位置をもう一度見てください。

タッチが非常に遠くに移動していない場合や、たとえば0.135秒を超えた場合は、ユーザがサブビューに触れたとみなし、 の動きが遅れたとみなすことができます。

この場合、UIScrollViewは、 とは別に、これが を通知することはありませんが、スクロールアクションではないと判断します。

したがって、 遅延移動が発生し、サブビューが受け取ったイベントを処理するというフラグを立てるためのローカルステート変数を持つことができます。ここで

は私のコードです:ここで

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    // store the timestamp 
    _beginDragTimeStamp = event.timestamp;  

    // your embedded subview's touches begin code 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    // compare and ignore drag if time passed between tap and drag is less than 0.5s 
    if(event.timestamp - _beginDragTimeStamp < 0.5) return; 

    // your drag code 
} 
26

は私のためにどのような作品です。サブクラスUIScrollViewの、そして唯一のこのメソッドを実装:次に

- (BOOL)touchesShouldCancelInContentView:(UIView *)view { 
    return YES; 
} 

delaysContentTouches = NO;

出来上がりを設定!ホーム画面と同じように動作します:ただちにボタンをハイライトしてスクロールすることができます:)

+1

これは私のために働く、ありがとう! – benck

+0

クリスおかげさよ、これは唯一の解決策です。 – Andy

+0

これは私のために働いた。以下の他の解決策はありませんでした(tableView.delaysContentTouches = YESと組み合わせて) –

8

iOS 8では、UIScrollViewの基になるUIPanGestureRecognizerがUIScrollViewのdelayContentTouchesプロパティを尊重していません。私はこれをiOS 8バグだと考えています。ここに私の回避策はあります:

は同じのUITableViewCellにUIButtonのためにNOにdelaysContentTouchesの設定:

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches 
+0

私はあなたがtheScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouchesを意味すると信じています。 これは私の助けになりました。私はそれが他の何かを壊すことを望む – Lope

+0

ありがとうございます。あなたは正しいです。私は、PanGestureRecognizerのdelayTouchesBeganプロパティがUIScrollViewのdelayContentTouchesプロパティを反映する必要があることを意味しました。 – lifjoy

+0

FYI;私はレーダーのバグレポートをアップルに提出しました。彼らは重複としてマークしました。 – lifjoy

0

私はそれを使用し、最新のSDKを使用して、同じ問題に意見の&同じ階層を持っていました。

self.scrollview.delaysContentTouches = NO 
関連する問題