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
, это будет не то, что вы хотите, а просто тест. Это должно прокручивать нормально после этого, иначе я ошибаюсь.