5

垂直方向にのみスクロールするルートUIScrollViewがあります。このスクロールビューは、ギザギザのグリッドの行を表します。このスクロール ビューのパン ジェスチャ レコグナイザーを、必要な最小数と最大数の両方のタッチに対して 2 つのタッチ用に構成しました。

このスクロールビュー内には、水平方向にのみスクロールするインスタンスが 1 つ以上ありUIScrollViewます。これらのスクロールビューはそれぞれ、ギザギザのグリッド ビューの 1 つの行を表します。これらすべてのスクロール ビューのパン ジェスチャ レコグナイザーを、最小で 1 回のタッチ、最大で 2 回のタッチに構成しました。

これまでのところ、うまくギザギザのグリッド ビューが表示され、行間を垂直方向にスクロールしたり、各行を個別にスクロールするために水平方向にスクロールしたりできます。このギザギザUITableViewのグリッド ビュー (セル == の行と列によって定義される位置その行)。

UITableViewをセルとして使用すると、テーブルビューは期待どおりに機能します。ただし、2 本の指でスクロールすると、行間を垂直方向にスクロールするためのルート スクロール ビューではなく、テーブル ビュー内でもスクロールされます。

2 本の指のタッチが無視されることを期待して、最大 1 回のタッチを許可するようにテーブル ビューのパン ジェスチャ レコグナイザーを構成しようとしました。これは機能しませんmaximumNumberOfTouches。テーブル ビューのパン ジェスチャ レコグナイザ シームのプロパティは無視されます。

私は何が間違っていたのでしょうか?

私が行ったことを明確にするためにレイアウトを表示するスクリーンショット: ギザギザのグリッド ビュー

4

4 に答える 4

0

複数のスクロールはややこしくなる傾向があり、確かではありませんが、Apple はこれを奨励していないと思います。それでも、まだ可能性はあると思います。テーブル ビューの垂直スクロールが、スクロール ビューの垂直スクロールなどと混在している可能性があります。

ジェスチャ レコグナイザのデリゲートが正しく設定されているかどうかを確認してください。これを回避する別の方法は次のとおりです。 - カスタムコントローラーでポップオーバーを開くことができるボタン付きのスクロールビューを用意します(必要なものをそこに挿入します)。-大きなセルを作成しUITableViewController、セルの内容をスクロールビューなどに設定します。同じ結果が得られると思います。

私のアドバイスは、よりシンプルで直感的な方法が他にある可能性がある場合に、1 つの方法だけに固執しないことです。

于 2012-01-13T12:57:11.393 に答える
0

しかし、そのような変更をすべて実装するのではなく、いくつかのトリックを試してみませんか?

1) デフォルトでは、ビューの作成時に TableView のスクロールを無効にします。

2)ビューが生成されたら、ユーザーがチャイルドスクロールビューにタッチした場合、単一または複数のタッチを使用してスクロールするかどうかのジェスチャを認識します。ジェスチャに基づいてタグを調べて、テーブルビューのスクロールを有効にすることができます。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
   //Get the tag of ScrollView 
   // Check for the Parent as well as Child SCrollview.
   // If its child, just enable the scrolling of tableView.
}

- (void)tapAction:(UIGestureRecognizer *)gestureRecognizer
{

//  CGPoint *poit = [Tile locationInView:gestureRecognizer.view];
/// [[[gestureRecognizers.view] objectAtIndex:0] removeFromSuperview];
//  imageContent = [[UIImageView alloc]initWithFrame:CGRec  tMake(0, 0, 200, 250)];
//  [imageContent setImage:[UIImage imageNamed:@"Default.png"]];

    NSLog(@"You tapped @ this :%d",gestureRecognizer.view.tag);
    //Regonize the gestures
}

あなたの質問にはコード スニペットがないため、不要なコードが含まれている可能性があります。;)

于 2012-01-18T12:46:41.527 に答える
0

Scroll ビューの TableViews は、一般的には良い考えではありません。TableView がタッチを受信すると、何もする必要がない場合でも、スーパービューに送信されません。

次の 2 つのいずれかを試してみてください。

  1. TableView では、タッチを手動で superView に送信し、それらを適切に処理させる必要があります。この方法がサイド プロジェクトの 1 つで使用されているのを見たことがありますが、現時点ではその例を投稿できません。

  2. 2番目のことは、実装が簡単かもしれません。TableView は ScrollView のサブクラスであるためdelaysContentTouches、それらの TableView を呼び出すことができます。このプロパティは、AppleDocs に書かれているように、スクロールが目的であるかどうかを判断できるまで、その TableView でもタッチダウンを遅らせます: http://developer.apple.com/library/ios/#documentation/uikit/reference/ UIScrollView_Class/Reference/UIScrollView.html#//apple_ref/occ/cl/UIScrollView

2 つの方法のいずれかがうまくいくかどうか教えてください。私はこの件について一般的に非常に興味があります。

于 2012-01-18T11:01:21.173 に答える
0

このリンクを試して、ネストされたビューをどのように解決するかに注意してください。

マルチタッチ イベントを処理するためのベスト プラクティスを覚えておいてください。

タッチ イベントとモーション イベントの両方のイベントを処理する場合、従うべき推奨される手法とパターンがいくつかあります。

  • イベントキャンセルメソッドは必ず実装してください。

実装では、ビューの状態を現在のマルチタッチ シーケンスの前の状態に復元し、イベントを処理するために設定された一時的なリソースを解放する必要があります。キャンセル メソッドを実装しないと、ビューが一貫性のない状態のままになる可能性があります。場合によっては、別のビューがキャンセル メッセージを受け取ることがあります。

  • UIView、UIViewController、または (まれに) UIResponder のサブクラスでイベントを処理する場合、

    • すべてのイベント処理メソッドを実装する必要があります (null 実装であっても)。

    • メソッドのスーパークラス実装を呼び出さないでください。

  • 他の UIKit レスポンダー クラスのサブクラスでイベントを処理する場合、

    • すべてのイベント処理メソッドを実装する必要はありません。

    • ただし、実装するメソッドでは、必ずスーパークラスの実装を呼び出してください。例えば、

[super touchesBegan:theTouches withEvent:theEvent];

  • UIKit フレームワークの他のレスポンダー オブジェクトにイベントを転送しないでください。

イベントを転送するレスポンダーは、UIView の独自のサブクラスのインスタンスである必要があり、これらのオブジェクトはすべて、イベント転送が行われていること、およびタッチ イベントの場合、バインドされていないタッチを受け取る可能性があることを認識している必要があります。彼らへ。

  • イベントに応答して自分自身を再描画するカスタム ビューは、イベント処理メソッドでのみ描画状態を設定し、drawRect: メソッドですべての描画を実行する必要があります。

  • (nextResponder 経由で) レスポンダーにイベントを明示的に送信しないでください。代わりに、スーパークラスの実装を呼び出して、UIKit にレスポンダー チェーンのトラバーサルを処理させます。

于 2012-01-21T00:58:26.917 に答える