2

解決済み: 問題の内容についてはコメントを参照してください

サブビュー/「セル」の水平スクロール行になる UIScrollView のサブクラスを実装しています。基本的に横スクロールの「テーブルビュー」のような要素です。UIScrollView コンテンツ ビューの各サブビュー/「セル」には UIGestureRecognizer がアタッチされているため、ユーザーがそれらの 1 つに触れると、UIGestureRecognizer がトリガーされます。

問題は、人が contentView の原点から離れてスクロールした場合、つまり、UIScrollView が x が 0 以外の contentOffset を返す場合、右からスクロールインする新しいサブビュー/「セル」のいずれかが UIGestureRecognizer をトリガーしないことです。触れた。すべてのサブビューには、UIGestureRecognizer があります。

例として、80x80 のアイコンの行を表示していて、20 個のアイコンの行に対して contentSize が 1600,80 であるとします。UIScrollView は 320,80 であるため、4 つのアイコンが表示されます。最初の 4 つのアイコンはタッチ可能であり、UIGestureRecognizer はそれぞれで起動します。ユーザーは左にスクロールします。つまり、新しいアイコンが右から表示されます。これらの新しいアイコン (サブビュー) が作成され、元の 4 と同じ方法で UIScrollView で使用する contentView に追加されます。ただし、元の境界になかった新しいアイコン (サブビュー) はトリガーされません。15 位までスクロールした場合、テーブルビューと同様に、サブビューの独自のキュー/デキューを実装します。

ただし、ユーザーがスクロールして最初に戻ると、それらのセルが contentView に新しく追加されたとしても、それらの境界が UIScrollView の元のフレーム内にある限り、それらのセルはタッチ可能であり、スクロール内で集約するために使用した UIView contentView です。見る。したがって、各サブビューのフレームと、スクロールビューのフレーム内にあるかどうかに依存しているようです。

contentOffset の変更をスクロールし、サブビューを削除して追加すると、すべてが正常に表示されます。各サブビューにアタッチされた UIGestureRecognizers だけがトリガーされておらず、スクロールを開始する前に Scrollview の元の境界内に位置することに依存しています。

私はこれについて一日中、そして昨日は半日も頭を悩ませてきました)そして、それを他の何かに依存しない位置に絞り込んでいます。

コードを投稿しますが、これを実行するコードがたくさんあるため、何を投稿すればよいかわかりません。

4

2 に答える 2

1

私はUIViewをサブクラス化し、UIScrollView内に追加しましたが、サブクラス化されたUIViewのサブビューのジェスチャレコグナイザーは起動しませんでした-スクロール前と同じように最初に表示されたものを除きます。

簡単な修正は、サブクラス化されたUIViewではなく、UIViewのサブビューをUIScrollViewに直接追加することでした。私がする前に

    // add to view
    [self addSubview:imageView];

だから私はそれを修正しました

    // add to view - we're adding to the superview directly
    [self.superview addSubview:imageView];

このようにして、UIScrolViewに入力するロジックを別のクラスに保持することができます。

于 2012-10-31T09:04:57.757 に答える
1

ここに書かれているのと同じ症状がありました。中間ビューを削除してサブビューをスクロールビューに直接追加するのではなく、受け入れられた回答に従って、中間ビューのサイズを変更することで機能しました。

以前は、スクロール ビューのコンテンツ サイズを設定し、サブビューを中間ビューに追加していましたが、中間ビューのサイズを変更していませんでした。中間ビューのフレームを正しく設定することで、ジェスチャ認識エンジンが正しく機能し始めました。

通常、サブビューはイベントを処理する機会を得て、未処理のイベントをチェーンに渡すと思います。ただし、スクロールビュー内では、イベントはスクロールビューからビューチェーンを下っていき、中間ビューは境界を超えてイベントを投げ出すため、最初はジェスチャーが機能しません。

追跡するのはイライラしていたので、これがこの問題に遭遇した他の人の助けになることを願っています.

于 2013-03-07T15:06:56.370 に答える