加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

iphone – iOS:为UITableView预先计算行高

发布时间:2020-12-14 19:13:08 所属栏目:百科 来源:网络整理
导读:在我的项目中,我几个月来一直在努力. 这是交易:我有一个UITableView只有1个部分,但UITableViewCells的高度不同.每个UITableViewCell都代表一个对象,新对象不断变得可用,并插入到UITableView中.有效发现将在表中显示的新对象高度的唯一方法是绘制一次(运行绘
在我的项目中,我几个月来一直在努力.

这是交易:我有一个UITableView只有1个部分,但UITableViewCells的高度不同.每个UITableViewCell都代表一个对象,新对象不断变得可用,并插入到UITableView中.有效发现将在表中显示的新对象高度的唯一方法是绘制一次(运行绘制UITableViewCell的代码并查看生成的高度).

啊,但是有问题! UITableView委托方法tableView:heightForRowAtIndexPath:在第一次绘制单元格之前调用!这是有道理的:表格想要在绘制它们之前定位单元格.

我一直在试验LOTS并且只能找到两个选项,这两个选项都有重大缺点:

>如果之前没有看到表中显示的新对象,只需“猜测”高度并根据需要稍后(在绘制单元格之后)调整单元格的大小.这会导致滚动问题,因为当用户停止滚动时,可能需要将一个或多个单元格调整到正确的高度,这会在表格移动并重新组织时产生糟糕的用户体验.
>在将对象插入UITableView之前,通过“测试”对象来预先计算对象高度.当新对象变为可用时,创建一个“虚拟”UITableViewCell并将其绘制在屏幕外,从而计算对象的高度并保存以供日后使用.问题在于,当然,我们只能对主线程进行高度测试(因为我们需要绘制),这会导致应用程序出现严重延迟.

到目前为止,我的解决方案是使用#2,但试图通过使其高度测试仅每1/4秒发生一次来缓解问题,这有助于“空出”测试,以便主线程没有锁定太多.但是,该解决方案不够优雅,仍会导致滞后问题,尤其是在旧设备上.滞后很糟糕,我真的需要一个更好的解决方案.

解决方法

为了计算高度,this和 this answer建议您可以使用CGLayer在后台线程中进行屏幕外绘制.
Link to iOS documentation to CGLayer.

要根据单元格中显示的某些数据ID缓存高度,您可以使用以下代码:

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
    NSString* objectId = [self getObjectIdForPath:indexPath];
    if (![self->idToCellHeight objectForKey: objectId])
    {
        CGFloat height = [object calculateHeightForId:objectId];
        [self->idToCellHeight setObject:[NSNumber numberWithFloat:height] forKey: objectId];
    }

    return [[self->idToCellHeight objectForKey:objectId] floatValue];
}

当然,第一次抽奖仍然必须在不知道确切高度的情况下完成,但如果您无法根据显示的数据计算高度,则没有解决方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读