reloadRowAtIndexPath没有按预期的IOS 8更新高度

时间:2015-08-03 19:44:18

标签: objective-c uitableview ios8 autolayout

所有,我试图在UITableView单元格中为UILabel创建折叠和扩展效果。要求是首先显示2行文本,然后点击按钮以显示其余部分。

我想到的第一个想法是重置UILabel的 numberOfLines 属性,然后重新加载该行的TableView。

但是,无论我使用 reloadRowAtIndex 还是删除/插入,我都会遇到一种奇怪的行为,如下所示。

以下代码将导致我第一次点击按钮时,它会调用setSelect:YES,但是按钮结果仍然没有被选中,并且行执行重新加载动画但是没有正确的高度,只有在我再次点击后,按钮才会被选中,单元格将获得正确的高度。

在崩溃模式下,我只是简单地调用了#34; reloadData "对于整个表,它按预期工作,正确的高度,正确的numberOfLines。我想使用 reloadAtIndexPath 方法,因为它给了我动画选项。但是在使用它时我无法找出我做错了什么,任何人都可以提供帮助吗?

- (IBAction)actionTapOnExpandButton:(id)sender {

    NSIndexPath *path = sender.path // Get Path.

    UITableViewCell *cell = [_tableView cellForRowAtIndexPath:buttonCellIndexPath];

    if(!buttonTapped.selected){

        cell.videoDescriptionLabel.numberOfLines = 0;

        [_tableView beginUpdates];
        [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:buttonCellIndexPath, nil]  withRowAnimation:UITableViewRowAnimationFade];
        [_tableView insertRowsAtIndexPaths:[NSArray arrayWithObjects:buttonCellIndexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
        [_tableView endUpdates];
        [buttonTapped setSelected:YES];
    }
    else {

        cell.videoDescriptionLabel.numberOfLines = 2;

        [_tableView reloadData];

        [buttonTapped setSelected:NO];
    }

}

这里我实现了高度方法

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {  
    return UITableViewAutomaticDimension;
}
在表init中

,我有

 _tableView.estimatedRowHeight = 44;

1 个答案:

答案 0 :(得分:1)

对于按钮的'延迟选择问题'

在您的操作方法buttonTapped.selected中尝试切换if之前 [buttonTapped setSelected: !buttonTapped.selected];语句,并从if中删除相同的方法调用当然,还有else个大括号。正如我所说,这可能会解决按钮问题。

对于'延迟细胞高度问题'

我建议在beginUpdates电话之前将标签尺寸设为无效,将<{strong>设置为numberOfLines之后设置为0。试试[cell.videoDescriptionLabel sizeToFit];

希望这会有所帮助。