Как анимировать изменение высоты заголовка раздела в UITableView? - PullRequest
18 голосов
/ 17 апреля 2010

Я реализовал этот метод для возврата высоты заголовка раздела. Однако при изменении высоты сечения это происходит немедленно без анимации.

Есть ли для этого анимация?

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (flatHeader) {
        return 50.0f;
    } else {
        return 100.0f;
    }
}

Ответы [ 4 ]

24 голосов
/ 21 апреля 2010

Я не уверен на 100%, что это будет работать для заголовка таблицы, но это работает для строк таблицы, так что стоит попробовать. У меня есть переменная экземпляра headerHeight, изначально установленная на 44.0, и я изменяю ее так:

- (void)changeHeight {
    [self.tableView beginUpdates];
    headerHeight = 88.0;
    [self.tableView endUpdates];
}

В моем коде я возвращаю headerHeight в heightForRowAtIndexPath, но вы можете попробовать его в heightForHeaderInSection:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return headerHeight;
}
12 голосов
/ 29 октября 2010

Это работает:

flatHeader = YES;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
[[self tableView] beginUpdates];
[[self tableView] endUpdates];
CGRect frame = [[self headerView] frame];
frame.size.height = [self tableView:[self tableView] heightForHeaderInSection:0];
[[self headerView] setFrame:frame];
[UIView commitAnimations];
2 голосов
/ 06 июля 2015

Мое решение в Swift:

class MyTableViewController: UITableViewController {

var sectionHeaderView:UIView?

...

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    sectionHeaderView = UIView(frame: CGRectMake(0, 0, self.tableView.frame.size.width, 30))
    sectionHeaderView?.backgroundColor = UIColor.grayColor()

    var button = UIButton(frame: CGRectMake(0, 0, self.tableView.frame.size.width, 30))
    button.backgroundColor = UIColor.darkGrayColor()
    button.setTitle("collapse/expand", forState: .Normal)
    button.addTarget(self, action: "collapseOrExpandSectionHeader", forControlEvents: .TouchUpInside)

    sectionHeaderView?.addSubview(button)

    return sectionHeaderView
}

...

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    if let sectionHeader = sectionHeaderView {
        return view.frame.size.height
    } else {
        return 30.0
    }
}

...

func collapseOrExpandSectionHeader() {

    if let sectionHeader = sectionHeaderView {

        let headerHeight:CGFloat

        if sectionHeader.frame.size.height == 200 {
            headerHeight = 30.0
        } else {
            headerHeight = 200.0
        }

        UIView.animateWithDuration(0.3, animations: {
            self.tableView?.beginUpdates()
            sectionHeader.frame.size.height = headerHeight
            self.tableView?.endUpdates()
        } )
    }
}
0 голосов
/ 21 апреля 2010

Я не проверял это, но иногда я получаю нежелательные анимации, когда мои UITableViewCells изменяют высоту. Причина этого в том, что я рисую свои собственные ячейки и использую CALayers для этого. В ячейке (void)layoutSubviews я бы изменил размер моего CALayer на размер рамки для ячейки

myLayer.frame = self.bounds;

Когда свойство frame / bounds CALayer изменяется, оно анимируется. Поэтому в теории я бы сказал, что вы можете использовать метод tableView: viewForHeaderInSection: который позволит вам нарисовать свой собственный заголовок раздела. Вы можете просто вернуть UIView, который реализует (void)layoutSubviews, а затем в этом методе сделать

self.layer.frame = self.bounds;

Просто идея.

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