2012-05-11 16 views
0

注:これはパフォーマンス上の問題ではありません。私は、UITableViewでデキューするセルの利点を認識しています。なぜUITableViewをスクロールするよりもスクロールする方が敏感ですか?

テストのために、白いスクロールビューで黒の背景色を持つシンプルな不透明なUIViewサブビューとそれらの間に100ポイントの間隔があるため、スクロールするものがある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プロパティはありません。最も疑わしいのは、delayTouchesBeganを持つUIScrollViewDelayedTouchesBeganGestureRecognizerです。くそー! これをiOS4のに設定するにはどうすればよいですか?

答えて

2

EDIT:

私はthis answer in S.Oを発見しました。

基本的に、あなたはUIScrollViewをサブクラス化し、それが常にNOを返すようにtouchesShouldCancelInContentViewを上書きしない試みることができる:

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

前のANSWER:

を、私は可能なすべてのプロパティを変更しようとしたが、ちょうどこの愚かを排除することはできませんディレイ。私はそれは、タッチがサブビューで起こることを意味するかどうかを把握したいスクロールビューと関係していると考えて、ユーザーが指をあまり動かすのを見ます。その後、スクロールを開始します。

これは正しい仮説だと思います。実際、レスポンダーチェーンとイベント管理は、最も特定のビューがイベントの通知を受け取る方法で動作するように設計されています。このプロセスの間に、レスポンダーチェーンの各ビューは、最も深いものが見つかるまで尋ねられます。

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

source

おそらくUITableViewこの動作を変更するために何かをします。あなたのスクロールを作る

は、ファーストレスポンダを表示します。これは非タッチイベントの発送のみに影響するため

[scrollView becomeFirstResponder] 

は、動作しません。

内部ビューを有効にしないようにすることもできますし、それが違いを生むかどうかを確認することもできます。

+0

私は、内部ビューのユーザー対話を無効にしようとしましたが、効果はありませんでした。 –

+0

-touchesShouldCancelInContentView:全く効果がありません。 –

0

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

+0

はい、根本的な原因ではありません。 –

関連する問題