Анимирование заголовка и нижнего колонтитула UITableView

Я пытаюсь анимировать удаление содержимого заголовка/нижнего колонтитула tableview с анимацией. Я считаю, что я могу вызвать либо removeFromSuperview для самого содержимого заголовка, либо просто присвоить заголовку нуль, но я не знаю, как это оживить. Простой блок анимации ничего не делает - как я могу убрать представление (метка в этом случае) в/из?

Ответ 1

Я написал пример того, как полностью удалить заголовок, используя блоки анимации.

[UIView beginAnimations:nil context:NULL];
[self.tableView setTableHeaderView:nil];
[UIView commitAnimations];

Это, конечно, предполагает, что эта анимация вызывается внутри вашего класса UITableViewController.

Просто удаление заголовка из супервизора не работает, потому что представление таблицы не знает, чтобы изменить размер, чтобы заполнить то, что раньше было видом заголовка. Настройка представления заголовка заставляет анимированное обновление отображаться в виде таблицы.

Если это не работает, проверьте свои назначения экземпляра tableView.

Ответ 2

В итоге я получил следующее простое решение. Он анимирует удаление заголовка.

[self.tableView beginUpdates];
self.tableView.tableHeaderView = nil;
[self.tableView endUpdates];

Я понимаю, что это упоминается в ответе WINSergey, но я нашел его объяснение немного запутанным.

Ответ 3

Я нашел следующие два параметра, чтобы оба работали нормально:

вариант 1

[UIView animateWithDuration:0.15
                      delay:0.0
        options: UIViewAnimationCurveEaseOut
                 animations:^{deleteLabel.alpha = 0;}
             completion:nil];

вариант 2

[UIView beginAnimations:nil context:nil];
deleteLabel.alpha = 0.0;
[UIView commitAnimations];

Ответ 4

У меня была такая же проблема, я хотел контролировать, как удалить заголовок, вот мой метод:

В ViewDidLoad:

UIView *transView = [[UIView alloc] initWithFrame:CGRectMake(0.f, 0.f, 320.f, 200.f)];
transView.backgroundColor = [UIColor clearColor];
self.headerView = transView;
[transView release];

[self.tableView setTableHeaderView:self.headerView];

Затем, когда вам нужно удалить заголовок:

[UIView animateWithDuration:.3f
                      delay:.0f
                    options: UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                     self.headerView.frame = CGRectMake(0.0f, 0.0f, 320.f, 0.0f);
                 }
                 completion:^(BOOL finished) {
                       [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:section] atScrollPosition:UITableViewScrollPositionTop animated:YES];
                 }];

Ответ 5

Это отлично работает "как есть", и мне не нужна анимация

    [myPrettyViewControllerInstance letUpdatePrettyViewNow];
    [[self tableView] beginUpdates];
    [[self tableView] setTableHeaderView:[myPrettyViewControllerInstance view]];
    [[self tableView] endUpdates];

но если нам это не нужно больше

    [[self tableView] setTableHeaderView:nil];

, и все, что нам нужно, действительно (если оно не затухает - проверьте условия

    [[self tableView] setTableHeaderView:nil];

, и нам не нужно

    [UIView beginAnimations:nil context:NULL];
    [[self tableView] setTableHeaderView:nil];
    [UIView commitAnimations];

NOP

    [[self tableView] beginUpdates];
    [[self tableView] setTableHeaderView:nil];
    [[self tableView] endUpdates];

NOP

    [[self tableView] setTableHeaderView:nil];
    [[self tableView] reloadData];

Ноо..

Ответ 6

Мне пришлось поставить 2 анимации, чтобы заставить ее работать.

 [UIView animateWithDuration:2.0f animations:^{
        mylbl.alpha = 0.1 ;
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:2.0f animations:^{
            mylbl.alpha = 1.0 ;
        }];
    }];

Ответ 7

Если кто-то это делает, мне пришлось смешать все ответы, чтобы они работали правильно в UITableView. Просто делать beginUpdates и endUpdates не добавляли анимацию для меня. Это позволяет снимать нижний колонтитул, а ячейки сбрасываются красиво с помощью анимации, а не мгновенно с рывком.

private func updateFooter(view : UIView?, size : CGFloat){

    UIView.beginAnimations(nil, context: nil)
    mainTableView.beginUpdates()
    mainTableView.tableFooterView = view
    mainTableView.tableFooterView?.frame.size.height = size
    mainTableView.endUpdates()
    UIView.commitAnimations()
}