2012-06-12 12 views
10

私は(垂直)UISliderをUIScrollviewの中に持っています。私はスライダーの値を変更することができますし、私の指を離さずにスクロールビューを左右にスクロールしたいと思います。UISliderのタッチはUIScrollViewのスクロールを防ぎます

理想の行動:指でドラッグが続くダウン垂直UISlider内部

タッチは、左または右

実際の動作をスクロールするscrollviewの原因:ダウン垂直UISlider内部

タッチ、その後に左右に指をドラッグすると、UIScrollviewで動きが発生しません。タッチダウンの外に UISliderの後にドラッグすると、スクロールビューがスクロールします。

UIViewには私の問題に関連しているように見えるexclusiveTouchというプロパティがあります。私はそれをNOに設定しようとしましたが、運がありません。

私のUISliderは、UISlidersの下にあるスクロールビューがUISliders内で発生したタッチに反応するように、どのように設定できますか?

+5

+1希望/予想結果と実際の結果。より多くの質問がこれを行う必要があります。 –

答えて

4

サブクラスUIScrollViewを実装し、- (BOOL)touchesShouldCancelInContentView:(UIView *)viewを実装しましたか?アップルのドキュメントによると:viewは、あなたのUISliderある場合は、単にNOを返す場合

// called before scrolling begins if touches have already been delivered to a subview of the scroll view. if it returns NO the touches will continue to be delivered to the subview and scrolling will not occur 
// not called if canCancelContentTouches is NO. default returns YES if view isn't a UIControl 

、このは水平にあなたのUIScrollViewのみ巻物を想定し、あなたがやりたいことがあります。これがうまくいかない場合は、UIScrollViewUISliderの両方に対してカスタムタッチ処理(touchesBegan:withEvent:touchesChanged:withEvent:などを上書きする)を行う必要があります。

+0

トリックをしました。ありがとう! – morgancodes

2

あなたが見ているのは、意図された動作です。

各タッチイベントは、1つのコントロールでのみ処理されます。 exclusiveTouchが行うことは、実際にタッチイベントが他のビューに配信されないようにすることです。

何をしようとしているのかは、自分で操作するタッチを行う必要があります。両方のビューにイベントを渡します。どちらかを行うには、touchesBegan:touchesMoved:などのメソッドをすべて実装し、両方のビューにイベントを渡します。このアプローチの詳細については、UIResponder documentationをご覧ください。別のアプローチは、スライダをテストし、yデルタを使用してスライダの値を更新するスクロールビューのUIGestureRecognizerでイベント処理を行うことです。ジェスチャー認識とイベント処理の詳細については、the section about Gesture Recognizers in the Event Handling Guide for iOSを参照してください。


サイドノート

ゴー設定アプリへとスイッチ半分の方法(たとえば機内モードのトグル)を切り替えると、その後、下にドラッグします。何も起こりません。残りのOSは同じように動作します。これが本当にやりたいことですか?違った動作をするアプリは、しばしば奇妙で不慣れな感じをします。

+0

+1 "あなたにしようとしていることをするには、自分で操作するタッチをしなければならないでしょう。" – morgancodes

+0

@morgancodeええ、おそらく少し曖昧です。 2つの基本的な選択肢と、独自のタッチ操作を行う方法に関する関連ドキュメントへのリンクを追加しました。 –

1

あなたの質問はちょっと混乱しました。あなたは垂直のスライダーを言っています - しかし、左右にドラッグしますか?

あなたがUISliderをドラッグしたときにscrollviewをスクロールしたい場合は、そうするための適切な方法が

[mySlider addTarget:self action:@selector(sliderMoved:) forControlEvents:UIControlEventValueChanged]; 

- (void) sliderMoved:(UISlider*) slider { 
    myScrollView.contentOffset.x = slider.value * (myScrollView.contentSize.width - myScrollView.bounds.size.width); 
} 

であるが、これはあなたが望むものであると思います。

+0

あなたのお返事ありがとうございますが、これは私が求めているものではありません。私はtouchesMovedイベントをスクロールビュー内のUISliderだけでなく、UIScrollviewに適用する方法を理解しようとしています。スライダの値を変更するには垂直方向のドラッグを、UIScrollviewの位置を変更するには水平方向のドラッグを使用します。 – morgancodes

0

この例では、いくつかの参照を得ることができると考えています。この例では、タッチやジェスチャレコグナイザをキャンセルして他のビューに適用する方法が示されています。

このリードはあなたあなたの問題の解決に、それはちょうど私がハッピーCodding

それについてをお知らせします:)

1

あなたがNOとdelaysContentTouchesを設定し、スクロールするUISliderオブジェクトのを防止する必要がある場合は月、以下のコードを確認してください。

mySlider.delaysContentTouches = NO; 

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view { 
    if ([view isKindOfClass:[UISlider class]]) 
    { 
     UITouch *touchEvent = [[event allTouches] anyObject]; 
     CGPoint locationEvent = [touchEvent locationInView:view]; 
     CGRect thumbRect; 
     UISlider *mySlide = (UISlider*) view; 
     CGRect trackRect = [mySlide trackRectForBounds:mySlide.bounds]; 
     thumbRect = [mySlide thumbRectForBounds:mySlide.bounds trackRect:trackRect value:mySlide.value]; 
     if (CGRectContainsPoint(thumbRect, locationEvent)) 
      return YES; 
    } 
    return NO; 
} 
関連する問題