UIScrollView - как избавиться от задержки перед прокруткой?

Я использую UIScrollView отображать кастом UIView, Когда пользователь drags палец через UIScrollView, есть заметная задержка, прежде чем дисплей начнет обновляться. Если пользователь сохраняет touching экран, UIScrollView становится очень отзывчивым через короткое время. Последующие попытки scroll результат в той же начальной задержке, сопровождаемой высокой отзывчивостью. Эта задержка серьезно влияет на удобство использования представления, и я хотел бы от него избавиться.

В тестовом проекте, который я написал, чтобы попытаться докопаться до сути этой проблемы, мне удалось лишь частично воспроизвести поведение. Первый раз, когда пользователь scrolls точно так же - однако любые последующие попытки scroll реагировать сразу.

Я пробовал обе настройки delaysContentTouches = NO и подклассы UIScrollView чтобы touchesShouldBegin returns NO как предложено в нескольких местах в Интернете, но ни один не работает.

я использую MonoTouch на iOS 4.3, но Objective-C ответы в порядке. Я бы опубликовал код, чтобы проиллюстрировать проблему, но так как я не смог сузить проблему, это было бы более 1000 строк. Надеюсь, этого достаточно, чтобы получить решение.

Кто-нибудь знает, что может быть причиной этой задержки, и как я могу от нее избавиться?

2 ответа

Решение

Некоторые общие предложения по улучшению производительности прокрутки.

Сделайте ваши прокрутки растрировать за кадром:

myView.layer.shouldRasterize = YES;

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

Если ваши прокручивающиеся представления не нуждаются в компоновке, убедитесь, что вы выключили это смешивание:

myView.opaque = YES;

Протестируйте использование симулятора, используя эти две функции, которые появляются в меню "Отладка" симулятора iOS:

  • Цвет за кадром
  • Цвет смешанных слоев

Если это не решает вашу проблему, и вы реализовали UIScrollViewDelegate, проверьте еще раз, чтобы убедиться, что вы не занимаетесь этими методами с минимальными затратами времени - например, основываясь на вашем описании, вы можете что-то делать в scrollViewDidScroll, scrollViewWillBeginDragging, или scrollViewWillBeginZooming и, если да, оптимизируйте это так, чтобы это произошло еще до начала прокрутки. Кроме того, убедитесь, что вы ничего не делаете в прикосновениях Began.

Я подозреваю, что происходит то, что в вашем представлении прокрутки включено какое-то взаимодействие.

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

Каковы подпредставления представления UIScroll?

В качестве эксперимента установите все подпредставления UIScrollView, чтобы иметь userInteractionEnabled = NO, это будет не то, что вы хотите, а просто тест. Это должно прокручивать нормально после этого, иначе я ошибаюсь.

Другие вопросы по тегам