10

UIScrollview内に(垂直)UISliderがあります。スライダーの値を変更し、指を離さずにスクロールビューを左右にスクロールできるようにしたいと考えています。

望ましい動作:

垂直 UISlider 内をタッチダウンし、続いて指を左右にドラッグすると、スクロールビューがスクロールします

実際の動作:

垂直 UISlider 内でタッチダウンし、続いて指を左右にドラッグすると、UIScrollview が動きません。UISlider の外側をタッチダウンしてからドラッグすると、期待どおりにスクロールビューがスクロールされます。

UIView には、私の問題に関連しているように見える ExclusiveTouch というプロパティがあります。運が悪いので、NOに設定してみました。

では、UISliders 内で発生したタッチにその下のスクロールビューが応答するように、UISliders を設定するにはどうすればよいでしょうか?

4

5 に答える 5

5

サブクラス化UIScrollViewと実装を試しました- (BOOL)touchesShouldCancelInContentView:(UIView *)viewか?Appleのドキュメントによると:

// 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

があなたの場合に単に戻るNO場合、あなたが水平方向にスクロールするだけであると仮定すると、これviewはあなたが望むことをするかもしれません。これが機能しない場合は、あなたとあなたの両方に対してカスタムタッチ処理(つまり、オーバーライドなど)を実行する必要があります。UISliderUIScrollViewtouchesBegan:withEvent:touchesChanged:withEvent:UIScrollViewUISlider

于 2012-06-18T04:27:07.900 に答える
2

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

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

やろうとしていることを行うには、自分でタッチ処理の一部を行う必要があります。両方のビューにイベントを渡します。などのすべてのメソッドを実装して、イベントを両方のビューに渡すことで実行touchesBegan:できtouchesMoved:ます。このアプローチの詳細については、UIResponder のドキュメントを参照してください。もう 1 つの方法は、スライダーのヒット テストを行い、y デルタを使用してスライダーの値を更新する、スクロール ビューの UIGestureRecognizer でイベント処理を行うことです。ジェスチャ レコグナイザーとイベント処理の詳細については、iOS 用イベント処理ガイドのジェスチャ レコグナイザーに関するセクションを参照してください。


補足:

設定アプリに移動し、スイッチを途中まで切り替えて (たとえば、機内モードの切り替え)、下にドラッグします。何も起こりません。OS の残りの部分は同じように動作します。これが本当にやりたいインタラクションであると確信していますか? 異なる動作をするアプリは、奇妙でなじみがないと感じることがよくあります。

于 2012-06-14T21:29:14.723 に答える
1

あなたの質問は私を少し混乱させました。あなたは垂直スライダーを言っていますが、左右にドラッグしていますか?

UISlider をドラッグするときにスクロールビューをスクロールしたい場合、適切な方法は次のとおりです。

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

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

これがあなたが望むものであることを願っています。

于 2012-06-15T01:38:57.540 に答える
0

この例では、タッチまたはジェスチャ認識機能をキャンセルして他のビューに適用する方法を示しています。

これがあなたの問題の解決につながりますように。

ハッピーコッディング:)

于 2012-06-18T07:32:47.187 に答える