Изменение размера анимации в виде прокрутки - PullRequest
0 голосов
/ 04 декабря 2011

Я пытаюсь создать анимацию переключения размера для этого простого пользовательского класса TUIScrollView (из проекта с открытым исходным кодом TwUI и очень похожего на UIScrollView), который я построил.Он называется TUILayout и поддерживает горизонтальное расположение, а также вертикальные анимированные вставки и удаления и имеет более декларативный способ передачи данных в его ячейки, который я предпочитаю перед делегированием.Это повторяет представления, подобные TUITableView или UITableView.В любом случае, если вы хотите следовать, это всего лишь один класс и здесь.

https://github.com/mrjjwright/TUILayout.

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

При этом изменяйте размер в setObjectHeight:animated Сначала я изменяю размеры объектов моей модели, представляющих строки, пересчитываю и устанавливаю contentSize в TUIScrollView, циклически повторяю все новые представления (скажем, еще 10 представлений будутвписывается в уменьшенное представление, поэтому dequeueReusableView и addSubview вызывают 10 раз) и, наконец, я анимирую кадры всех представлений в соответствии с их размером и расположением в layoutSubviews.

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

Таким образом, все вновь добавленные подпредставления отстают от представлений, которые были на экране, и я могу 'не могу понять, почему анимация не все происходит вместе.Я перепробовал много разных комбинаций без удачи, включая CATransactions.Мне интересно, если это связано с тем, как работает CAScrollLayer или кто-то может помочь мне продумать это.

Более общая проблема заключается в том, как плавно обрабатывать анимации изменения размера на скролл-представлениях, которые повторяют их представления, и я рассмотрел несколько других сеток в мире iOS и получил некоторое вдохновение, но ищу больше.

Спасибо!

1 Ответ

1 голос
/ 04 декабря 2011

Я думаю, что мог бы решить свою проблему здесь (так как я укладывал свою постель этим утром, это поразило меня). Я принудительно запустил текущий цикл запуска после циклирования во всех необходимых подпредставлениях и, что очень важно, не устанавливал contentSize scrollview до тех пор, пока цикл выполнения не завершится, и не добавил необходимые подпредставления для анимации. Чтобы запустить цикл выполнения, я использовал трюк из этого ТАКОГО вопроса :

 skipLayout = YES;
 [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];
 skipLayout = NO;

Если установлено skipLayout, TUILayout просто возвращается из layoutSubviews, чтобы только что добавленные представления не были немедленно удалены кодом макета переработки. Принудительный запуск цикла выполнения обеспечил, чтобы все анимации отображались на экране для всех подпредставлений. После этого я выполнил изменение размера анимированного макета. Я обновил код на github, если кому-то интересно. Я оставлю этот вопрос открытым на некоторое время, чтобы получить дальнейшее понимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...