iphone – iOS:为UITableView预先计算行高
在我的项目中,我几个月来一直在努力.
这是交易:我有一个UITableView只有1个部分,但UITableViewCells的高度不同.每个UITableViewCell都代表一个对象,新对象不断变得可用,并插入到UITableView中.有效发现将在表中显示的新对象高度的唯一方法是绘制一次(运行绘制UITableViewCell的代码并查看生成的高度). 啊,但是有问题! UITableView委托方法tableView:heightForRowAtIndexPath:在第一次绘制单元格之前调用!这是有道理的:表格想要在绘制它们之前定位单元格. 我一直在试验LOTS并且只能找到两个选项,这两个选项都有重大缺点: >如果之前没有看到表中显示的新对象,只需“猜测”高度并根据需要稍后(在绘制单元格之后)调整单元格的大小.这会导致滚动问题,因为当用户停止滚动时,可能需要将一个或多个单元格调整到正确的高度,这会在表格移动并重新组织时产生糟糕的用户体验. 到目前为止,我的解决方案是使用#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]; } 当然,第一次抽奖仍然必须在不知道确切高度的情况下完成,但如果您无法根据显示的数据计算高度,则没有解决方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |