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];
Это должно сработать.