Как вы анимируете изменение размера tableView без обрезания его строк / подпредставлений? - PullRequest
0 голосов
/ 13 октября 2009

РЕДАКТИРОВАТЬ: Первоначально я задавал этот вопрос в отношении изменения размера общего вида, но теперь я понимаю, что это нечто более специфичное для tableViews.

Скажем, что у tableView изначально есть рамка (0 0, 320 460), то есть он заполняет весь экран iPhone. Для изменения размера таблицы и анимации изменения размера я отображаю следующий код на кнопку:

[UIView beginAnimations:@"Animation" context:nil];
[UIView setAnimationDuration:3];

CGRect rect = self.table.bounds;
rect.size = CGSizeMake(320, 200);
self.table.bounds = rect;
self.table.center = CGPointMake(160, 100);

[UIView commitAnimations]; 

Этот код будет анимировать высоту таблицы вниз, НО ... до того, как произойдет какая-либо анимация, таблица обрежет все ячейки таблицы, которые не вписываются в новые границы. Таким образом, учитывая tableView, который изначально умещается в 10 строк, приведенный выше код анимации вызовет следующую последовательность событий:

  1. TableView немедленно удаляет нижние 5 строк. Обратите внимание, что он удаляет только строки - фон tableView все еще распространяется вниз.
  2. TableView анимирует изменение высоты для остальной части таблицы, как и ожидалось.

Это не то поведение, которое я ищу. Вместо того, чтобы сразу обрезать нижние 5 строк, tableView должен сохранять свои строки на месте, а нижний край таблицы просто анимирует вверх.

Исходя из поведения, которое я наблюдаю, кажется, что tableView получает какое-то сообщение для обновления своих строк сразу после того, как он обнаруживает, что его границы будут меняться. Может ли кто-то пролить свет на это поведение и как мне избежать этого?

Ответы [ 2 ]

1 голос
/ 31 октября 2009

Свойство bounds вида определяет внутреннее координатное пространство вида. Если вы изменяете размер и / или положение вида, вам следует только изменить рамку вида. Теоретически, свойство bounds может определять абсолютно произвольное координатное пространство, отсоединенное от рамки представления, и UIKit, по-видимому, предназначен для поддержки этого различия. На практике я не думаю, что когда-либо видел, чтобы это работало в UIKit (bounds.size всегда такой же, как frame.size и bounds.origin всегда {0,0}), но это различие проводится там и важно помнить - особенно если это поведение когда-нибудь изменится в будущем.

Я не уверен, что простое изменение кода для изменения фрейма вместо границ решит проблему, но я рекомендую начать с него. Если это не решает проблему, то, вероятно, проблема в том, что табличное представление немедленно удаляет строки, которые станут невидимыми в новом кадре, поэтому, если это так, возможно, что единственным решением было бы сделать анимацию самостоятельно установка простой подпрограммы, управляемой NSTimer, которая медленно изменяет размер / положение кадров с течением времени, создавая иллюзию, которую вы хотите, несмотря на оптимизацию табличного представления или взаимодействие с Core Animation.

0 голосов
/ 13 октября 2009

Вы пытались изменить границы и центра внутри блока анимации.

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

...