2013-09-01 5 views
0

Я переход между видами со следующим кодом:Как оптимизировать анимацию перехода UIView?

// Populate view2 here 
UIView *theWindow = [_view2 superview]; 
[_view2 removeFromSuperview]; 

CATransition *animation = [CATransition animation]; 
[animation setDuration:0.25f]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:kCATransitionFromRight]; 
[animation setTimingFunction:[CAMediaTimingFunction 
      functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

[[theWindow layer] addAnimation:animation forKey:@"SwitchToSecondView"]; 

Это работает, однако, переход не совсем гладко. Я тестирую устройство iPhone4 v5.1.1. Оба представления содержат UINavigationView, UIScrollView с примерно 20 подвью, я рассматривал заполнение представления после завершения анимации, но я хотел бы избежать этого, если это возможно. Я бы оценил гладкость перехода 7/10.
Как я могу сделать этот переход максимально гладким?

+0

Как это выглядит на устройстве? – CaptJak

+0

@CaptJak Он начинается гладко, и есть заметное отставание около 2/3 пути через – GameDevGuru

+0

Ну, вы не реализовали код неправильно. то, как у вас есть, должно быть плавным. Выполняете ли вы какие-либо другие действия одновременно с анимацией? – CaptJak

ответ

1

Ваше прокручивание с 20 подзонами является причиной вашей проблемы. Хотя мне придется увидеть сам код, чтобы доказать это, но эта же проблема возникла со мной, когда я попытался создать представление прокрутки, имеющее много подзонов, причем конечный результат ведет себя так же, как UITableView (помните, UITableView является подклассом UIScrollView) , примечание: доказательство того, что это причина, проста. Просто удалите 20 подпрограмм UIScrollView, а затем запустите анимацию. Если отставание ушло, то это достаточное доказательство.

Отметьте, что UITableView может иметь тысячи строк .. но способ, которым он разработан, заключается в повторном использовании ячеек, которые больше не отображаются на экране (т. Е. Перерабатывать виды из пула, а не создавать новые виды каждый раз, когда они необходимы). другими словами, он не может позволить себе хранить в памяти больше строк, чем то, что будет отображаться на экране, иначе оно станет ломающимся.

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

Пожалуйста, обратите внимание на это interesting post того, как UITableView на самом деле создаются за кулисами .. Я уверен, что это даст вам идеи о том, как оптимизировать свои scrollview так как к избежать отставаний.

обновление: Основываясь на деталях вашего зрения hiarchy в комментариях .. это то, что я хотел бы сделать

  1. я бы сделать переход, но только для отображения п количество UIImageViews которые вписываются в экран (т. е. 7 в вашем случае) .. в UIAnimation обработчик блока завершения, я бы добавил остальные виды
  2. Если этого недостаточно, я загружу изображения в представления в обработчике завершения UIAnimation.
  3. Если этого недостаточно, я также подключу 2 UIButtons и 2 UILabels к subviews в обработчике завершения.

Вы видите рисунок здесь? идея - это целенаправленная пробная версия и ошибка: удалите самые дорогие операции один за другим из перехода и поместите его после завершения перехода. При желании вы можете заменить UIViews, которые были возвращены в конец анимации с помощью наполнителей (т. Е. Подумайте, что это заполнитель для изображений, прядильщик и т. Д.Выбор этих подстановок действительно зависит от принципов UX и того, что вы считаете эстетичным для пользователя)

+0

Удаление 20 подложек устраняет задержку. Как я упоминал в сообщении, я хотел бы избежать перехода к пустому виду. Я склоняюсь к идее загрузки только видимых подзонов перед анимацией, а остальное - по завершении. Что вы думаете об этом так? – GameDevGuru

+0

@GameDevGuru Я буду честно смотреть на ваш код, чтобы дать вам какой-нибудь осмысленный совет .. если по какой-то причине вы не можете поделиться кодом .. вы можете хотя бы визуализировать Uiriew hirarchy или что-то в этом роде. – abbood

+0

вы можете сделать ленивый loading .. например, постепенно вводите взгляды .. вы можете поместить прядильщик или 'UIActivityIndicator', чтобы указать пользователю, что это дорогостоящая операция, и поэтому ожидается небольшое отставание. Есть много способов обойти это – abbood

0

Вы должны запустить Tools.app и посмотреть, что занимает ваше процессорное время. Уменьшение этого также уменьшит заикание и поможет сгладить ваши анимации.

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