2012-05-11 2 views
0

Примечание: это не проблема с производительностью! Я знаю о преимуществах деактивации ячейки в UITableView.Почему прокрутка UITableView намного отзывчива, чем прокрутка UIScrollView?

Для тестирования я создал UIScrollView с простыми непрозрачными областями UIView, которые имеют черный цвет фона в белом прокрутке и 100 точек между ними, чтобы можно было прокручивать. Очень легкий. Ничего больше. На самом деле мне доверяют, это не тяжело.

Я замечаю огромную разницу между началом прокрутки прокрутки и началом прокрутки табличного вида.

Когда я касаюсь вида прокрутки и сразу начинаю таскать, он отстает примерно на 0,25 секунды, а затем внезапно догоняет. Оттуда это жидкость, никаких задержек, пока я не прикоснусь и не приземлюсь снова.

На много, намного больше и сложнее UITableView, когда я делаю то же самое, нет начальной задержки в 0,25 секунды, прежде чем она начнет прокрутку.

Я попытался изменить все возможные свойства, но просто не могу устранить эту глупую задержку. Я считаю, что это связано с видом прокрутки, который хочет выяснить, будет ли прикосновение отображаться в подзоне, а затем видит, слишком ли сильно перемещается пользователь. Затем он начинает прокрутку.

Теперь сумасшедшая вещь - UITableView - это сам UIScrollView, и я хочу, чтобы моя UIScrollView начала прокручиваться так же быстро, как UITableView. Как?

Редактировать: Sh .. Я нашел что-то CRAZY!

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 с задержкамиTouchesBegan. Черт! Как я могу установить это на NO в iOS4?

ответ

2

EDIT:

Я нашел this answer in S.O.

В принципе, вы можете попробовать подклассы UIScrollView и первостепенную touchesShouldCancelInContentView так, что она всегда возвращает NO:

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

ПРЕДЫДУЩИЙ ОТВЕТ:

Я попытался изменить каждое свойство можно, но просто не могу устранить это глупо задержка. Я считаю, что это связано с видом прокрутки, который хочет выяснить, будет ли прикосновение отображаться в подзоне, а затем видит, слишком ли сильно перемещается пользователь. Затем он начинает прокрутку.

Я думаю, что это правильная гипотеза. В самом деле, цепочка респондентов и управление событиями предназначены для работы таким образом, чтобы наиболее конкретным видом был тот, кто получил уведомление о событии; во время этого процесса каждое представление в цепочке ответчиков задается до тех пор, пока не будет найдено самое глубокое.

Touch events. Объект window использует проверку на удары и цепочку ответчиков, чтобы найти представление для получения события касания.В hit-testing окно вызывает hitTest: withEvent: в самом верхнем виде иерархии представлений; этот метод исходит из рекурсивного вызова pointInside: withEvent: на каждом представлении в иерархии представлений, который возвращает YES, идя вниз по иерархии, пока не найдет subview, в границах которого произошло касание. Это представление становится хитом-тестом.

(source)

Возможно UITableView что-то делает, чтобы изменить это поведение.

Оформление прокрутки просмотра первого ответчика:

[scrollView becomeFirstResponder] 

не будет работать, так как это влияет только на отправку несенсорных событий.

Вы могли бы попробовать, хотя внутренний вид не касался касания и не видел, имеет ли это значение.

+0

Догадка. Я попытался отключить взаимодействие с пользователем для внутренних просмотров, но никакого эффекта. –

+0

-touchesShouldCancelInContentView: абсолютно никакого эффекта. –

0

Вы попробовали subViews.userInteractionEnabled = NO;? Это поможет вам устранить гипотезу о прикосновениях.

+0

Да, это не главная причина. –

Смежные вопросы