1

注: これはパフォーマンスの問題ではありません。UITableView でのセルのデキューの利点を認識しています。

テストのために、白いスクロールビューに黒い背景色があり、それらの間に100ポイントの間隔があるいくつかの単純な不透明なUIViewサブビューを持つUIScrollViewを作成したので、スクロールするものがあります。非常に軽量。他には何もありません。本当に私を信じてください、それは重くありません。

スクロール ビューのスクロールの開始と、テーブル ビューのスクロールの開始には大きな違いがあることに気付きました。

スクロール ビューにタッチしてすぐにドラッグを開始すると、約 0.25 秒遅れて、突然追いつきます。そこからは流動的で、タッチアップして再びタッチダウンするまでラグはありません。

はるかに大きく複雑な UITableView では、同じことを行うと、スクロールが開始されるまでに0.25秒の初期遅延はありません。

可能なすべてのプロパティを変更しようとしましたが、このばかげた遅延をなくすことはできません。サブビューでタッチが発生することを意図しているかどうかを把握したいスクロールビューに関係していると思います。次に、ユーザーが指を動かしすぎているかどうかを確認します。次に、スクロールを開始します。

クレイジーなことは、UITableViewがUIScrollView自体であり、UIScrollViewをUITableViewと同じくらい速くスクロールさせたいということです。どのように?

編集: Sh..何かクレイジーなものを見つけました!

NSLog(@"GR = %@", self.gestureRecognizers);


GR = (

"<UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x13e930; 
state = Possible; 
delaysTouchesBegan = YES; 
view = <TestScrollView 0x13e380>; 
target= <(action=delayed:, target=<TestScrollView 0x13e380>)>>",

"<UIScrollViewPanGestureRecognizer: 0x13ee00; 
state = Possible; 
delaysTouchesEnded = NO; 
view = <TestScrollView 0x13e380>; 
target= <(action=handlePan:, target=<TestScrollView 0x13e380>)>>"

)

これは iOS 4 であり、iOS4 には panGestureRecognizer プロパティはありません。最も疑わしいのは、UIScrollViewDelayedTouchesBeganGestureRecognizer と delaysTouchesBegan です。くそ!iOS4でそれをNOに設定するにはどうすればよいですか?

4

2 に答える 2

1

編集:

SO でこの答えを見つけました。

基本的に、常に NO を返すように、サブクラス化UIScrollViewとオーバーライドを試すことができます。touchesShouldCancelInContentView

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
      return NO;
}

前の回答:

可能なすべてのプロパティを変更しようとしましたが、このばかげた遅延をなくすことはできません。サブビューでタッチが発生することを意図しているかどうかを把握したいスクロールビューに関係していると思います。次に、ユーザーが指を動かしすぎているかどうかを確認します。次に、スクロールを開始します。

これは正しい仮説だと思います。実際、レスポンダー チェーンとイベント管理は、最も具体的なビューがイベントの通知を受け取るように機能するように設計されています。このプロセスでは、最も深いビューが見つかるまで、レスポンダー チェーンの各ビューが要求されます。

タッチ イベント。ウィンドウ オブジェクトは、ヒット テストとレスポンダー チェーンを使用して、タッチ イベントを受け取るビューを見つけます。ヒット テストでは、ウィンドウはビュー階層の最上位ビューで hitTest:withEvent: を呼び出します。このメソッドは、YES を返すビュー階層内の各ビューで pointInside:withEvent: を再帰的に呼び出すことによって続行し、タッチが発生した境界内のサブビューが見つかるまで階層を下ります。そのビューがヒット テスト ビューになります。

ソース

おそらくUITableView、この動作を変更するために何かを行います。

スクロール ビューをファーストレスポンダーにする:

 [scrollView becomeFirstResponder]

これは非タッチ イベントのディスパッチにのみ影響するため、機能しません。

内部ビューをタッチ対応にしないようにしてみて、それが違いを生むかどうかを確認してください。

于 2012-05-11T10:34:43.083 に答える
0

試しましたsubViews.userInteractionEnabled = NO;か?これは、タッチ仮説を排除するのに役立ちます。

于 2012-05-11T10:59:05.637 に答える