iOS   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iphone – iOS:为UITableView预先计算行高大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

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

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

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

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

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

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

解决方法

为了计算高度,thisthis 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];
}

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

大佬总结

以上是大佬教程为你收集整理的iphone – iOS:为UITableView预先计算行高全部内容,希望文章能够帮你解决iphone – iOS:为UITableView预先计算行高所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。