2011-05-13 8 views
6

Stackにも同様の記事がありますが、私が見つけたものは何も見つかりませんでした。「ドラッグ」を無視してUIScrollViewに渡すUIButton

  • 私はがのUIViewに追加scrollviewを持っています。
  • UIButtonスクロールビューと同じUIViewを追加しました。

    1. 私は、UIButtonがtouchUpに応答してイベントを発生させたいと考えています。
    2. もし誰かUAGuttonのDRAGS私はそれをにスクロールビューにイベントを渡し、ボタンイベントを発生させることなくUIScrollViewをドラッグします。

私はhitTestはscrollviewを返すとタッチに渡す方法を知っているが、これはUIButtonになって何かを停止します。

UIScrollViewにUIButtonを追加します。

誰にも提案されたソリューションがありますか?

答えて

0

this answerで説明したように、スクロールビューのサブビューであるUIButtonまたは他のUIControlは、スクロールビューハンドルをドラッグさせながらタップに自動的に応答します。ただし、スクロールビューのサブビューであるボタンは、スクロールされたコンテンツの下にスクロールするときに画面上の同じ位置に残るのではなく、スクロールされたコンテンツとともに移動します。私はこれがスクロールビューにボタンを入れたくない理由だと考えています。

これが該当する場合は、さらに1つのステップで目的の動作を得ることができます。すべてのボタンをスクロールビューのサブビューであるUIViewに入れ、スクロールビューのデリゲートのscrollViewDidScrollメソッドで、そのビューのframe.originをスクロールビューのcontentOffsetに設定します。私はちょうど私のアプリでこれを実装しました。サブクラス化やレスポンダーチェーンやタッチイベントに関わることなく、うまくいっています。

1

これを試してみてください:

  1. は、他のすべてのビューの上に、スクロールビューに全体をスクロールビューのcontentSizeほどの大きな透明、カスタムUIViewのを追加します。 (あるいは、スクロールビューの幅/高さと同じ大きさにして、スクロールビューが動くたびにそれを移動するだけです)。スクロールビューがドラッグする代わりにタッチをサブビューに渡すことを決定すると、これが最初のことになりますhitTested。
  2. UIViewのhitTestメソッドをオーバーライドします。タッチがボタンフレーム内にあるかどうかを確認します。そうであれば、ボタンを返します。そうでない場合は、nilを返します。

実際には、スクロールビューをトリックして、ボタンがそのサブビューの1つであると考えるようにします。私は実際にそれを試していないので、これが動作するとは確信していませんが、それは完全に賢明なようです。

+0

私はこれを試しましたが、動作させることができませんでした。問題は、スクロールビューをスワイプするか、単にタップするかによって、ビューでhitTestが呼び出されるため、カスタムのhitTestメソッドは、イベントをスクロールビューに渡すかボタンにリダイレクトするかを認識しません。私はまた、タッチまたはタップを受信して​​いるかどうかを計算するためにカスタムビューでtouchesMovedを使用してみましたが、touchesMoveが呼び出された時点で、hitTestメソッドが終了しているため、そこに条件付きで応答する方法はありません。 – arlomedia

1

UIBUttonUIPanGestureRecognizerを追加してみてください。パン(ドラッグ)を処理するために指定したコールバックでは、何も実装する必要はありません。次に、cancelsTouchesInViewをYESに設定します。これにより、ボタンはドラッグジェスチャを他のビューに渡します。

 
     UIPanGestureRecognizer *gr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan)]; 
     [gr setCancelsTouchesInView:YES]; 
     [myButton addGestureRecognizer:gr]; 
     [gr release]; 

そして、ここでhandlePanです:

 
-(void)handlePan 
{ 
    // Do nothing 
} 

私は2つのUIViewサブビューでUIScrollViewを持っていた似たような状況に遭遇しました。各UIViewにはUISliderが含まれています。私はジェスチャーレコグナイザーが入ってきた垂直ドラッグをキャッチ(ドロップ)したいと思っていましたが、スクロールビューを左右にパンするために、スライダーで動作するために水平スクロールも必要でした。これが解決策でした。 UIViewにジェスチャーレコグナイザを添付しました。

+0

セットアップは少し異なりますが、私のためには機能しませんでした。 scrollViewではなく、私はちょうど周りにドラッグすることができますいくつかのビューを持つviewControllerを持っています。私の問題は、それらのサブビューのいくつかはボタンを持っていることです(それらがタップに反応するので)、そしてボタンはドラッグ動作をブロックします。私はこの答えがそれを解決するだろうと思ったが、まあ、いいえ。 :\追加のヒントがあれば幸いです。ありがとう! – Olie

+0

明確にするために、私はまた、ボタンを含むlittlerサブビューに 'gr'を複製して、そのスーパービューにパンを通すことを望んでいました。喜びはありません。 – Olie

1

これを試してください:UIScrollViewをサブクラス化するには、touchesShouldCancelInContentView:メソッドでYESを返します。

+0

私のために働く!どうもありがとうございました ! :] – Jerome

関連する問題