Анимируйте вставку нового раздела в UITableVIew - PullRequest
12 голосов
/ 28 февраля 2012

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

-(NSInteger) numberOfSectionsInTableView:(UITableView*)tableView
{
    if (slide==TRUE) return 2;
    return 1;
}

А также по моему -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath. Мой раздел добавлен, как и должно быть, но я где-то читал, что это можно анимировать, потому что, когда я нажимаю кнопку, раздел добавляется, но без анимации. Я думаю, что должен использовать это -(void)insertSections:(NSIndexSet*)sections withRowanimation(UITableViewRowAnimation) animation, но я не нашел подходящего примера в сети.

Ответы [ 3 ]

31 голосов
/ 28 февраля 2012

Управлять строками и разделами в UITableView с помощью анимации довольно просто, используя следующие API (акцент на последние два):

Обновление модели данных

Вам следует обновить модель данных в любом месте между методами beginUpdates и endUpdates.Не имеет значения, обновляете ли вы свою модель данных до или после методов вставки или удаления, если вы делаете это между beginUpdates и endUpdates методами.

Не вставлять строки для новых разделов, которые вы вставляете

При добавлении нового раздела с помощью метода insertSections:withRowAnimation: вам не нужно вызывать insertRowsAtIndexPaths:withRowAnimation: чтобы добавить в него строки.Метод insertRowsAtIndexPaths:withRowAnimation: предназначен только для анимации изменения существующего раздела.Точно так же вам не нужно вызывать deleteRowsAtIndexPaths:withRowAnimation: при удалении раздела с помощью deleteSections:withRowAnimation:.

Относительно удаления и вставки:

Я обычно делаю это в отдельных beginUpdates: endUpdates вызовах, однако вы можете вставлять и удалять одновременно.Просто имейте в виду, что UITableView сначала попытается удалить строки / секции, а , а затем попытается вставить их независимо от того, как вы это делаете в своем коде .

Обсуждение часть deleteRowsAtIndexPaths:withRowAnimation:

Обратите внимание на поведение этого метода, когда он вызывается в анимационном блоке, определенном beginUpdatesи методы endUpdates.UITableView откладывает любые вставки строк или разделов до тех пор, пока он не обработает удаление строк или разделов.Это происходит независимо от порядка вызовов методов вставки и удаления.Это не похоже на вставку или удаление элемента в непостоянном массиве, где операция может повлиять на индекс массива, используемый для последовательной операции вставки или удаления.Дополнительные сведения по этому вопросу см. В разделе «Пакетная вставка и удаление строк и разделов» в Руководстве по программированию табличного представления для iOS.

Пример вставки в раздел:

int indexOfNewSection = 4; // TODO: change to meaningful value
[self.tableview beginUpdates];
[self.tableview insertSections:[NSIndexSet indexSetWithIndex:indexOfNewSection]
              withRowAnimation:UITableViewRowAnimationAutomatic];

// Update data model
[self.sections insertObject:sectionObj atIndex:indexOfNewSection];

[self.tableview endUpdates];
18 голосов
/ 28 февраля 2012

UITableViewRowAnimation - это перечисление, объявленное в верхней части UITableView.h. Вы также можете просмотреть его в справке UITableView . Это маленькое, так что я просто вставлю это!

typedef enum {
    UITableViewRowAnimationFade,
    UITableViewRowAnimationRight,           // slide in from right (or out to right)
    UITableViewRowAnimationLeft,
    UITableViewRowAnimationTop,
    UITableViewRowAnimationBottom,
    UITableViewRowAnimationNone,            // available in iOS 3.0
    UITableViewRowAnimationMiddle,          // available in iOS 3.2.  attempts to keep cell centered in the space it will/did occupy
    UITableViewRowAnimationAutomatic = 100  // available in iOS 5.0.  chooses an appropriate animation style for you
} UITableViewRowAnimation;

По сути, он сообщает табличному представлению, в каком направлении вы хотите, чтобы строки / секции анимировались. Небольшой эксперимент покажет эффект каждого.

Например, вставка строки с UITableViewRowAnimationTop запускает анимацию, которая создает впечатление, что строка входит в табличное представление из пространства, расположенного непосредственно над конечным пунктом назначения в табличном представлении.

Таким образом, ваша вставка может выглядеть следующим образом:

-(void)sliderValueChanged:(id)slider {
   slide = slider.on;

   [tableView beginUpdates];

   if (slider.on) {
      [tableView insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationTop];
      // TODO: update data model by inserting new section
   } else {
      [tableView deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationTop];
      // TODO: update data model by removing approprite section
   }

   [tableView endUpdates];
}

И вы должны быть уверены, что ваш делегат и источник данных предоставляют информацию, соответствующую вашему утверждению о вставке разделов / строк. По твоему вопросу, похоже, ты это сделал.

редактирует:

Я не думаю вы должны позвонить reloadData. UITableView требует, чтобы ваша модель данных отражала изменения, которые вы вносите с помощью методов вставки / удаления. Так, например, если перед вызовом insertSections:withRowAnimation: (с которым вы вставляете один раздел) ваш метод numberOfSectionsInTableView: вернул 1, то после вызова он должен вернуть 2 . Делать иначе выдает исключение. Именно это обеспечение согласованности позволяет вам (опять же, я думаю ) избегать вызова reloadData - необходимые данные перезагружаются всей транзакцией beginUpdates: endUpdates: и любыми обновлениями модель, которую вы делаете во время этой транзакции, должна совпадать с вашими вызовами вставки / удаления.

ясно, как грязь?

ОБНОВЛЕНИЕ

Если бы вы программировали явные анимации, то я бы сказал, что вы можете сделать это в «обработчике завершения» (или просто программировать анимацию напрямую), но это здесь вам недоступно. Я думаю, что вы можете обернуть код представления кнопки в его собственный метод в представлении, а затем установить таймер для его вызова через короткий промежуток времени, скажем, 0,2 секунды (вам придется поэкспериментировать, чтобы увидеть, что выглядит хорошо) , например,

[NSTimer scheduledTimerWithTimeInterval:.2 target:self selector:@selector(presentButton) userInfo:nil repeats:NO];

Это должно сработать.

0 голосов
/ 28 февраля 2012
- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation

Этот метод, на который указывает метод, определенно сотворит магию.

Вероятно, вы можете попробовать это:

[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];

Пишу прямо из головы ... надеюсь, это поможет ...

Обратите внимание:

  1. Может использоваться любой из UITableViewRowAnimation.
  2. sectionIndex в указанном коде является NSInteger. Вероятно, в вашем случае 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...