ios – uitablviewcell动态高度从systemLayoutSizeFittingSize不正确

ios – uitablviewcell动态高度从systemLayoutSizeFittingSize不正确,第1张

概述我正在使用xib&自动布局构建我的自定义单元格,在我的单元格中,有一个多行标签.一个在tableview的heightForRowAtIndexPath中,我会使用 1 dequeueReusableCellWithIdentifier获取一个单元格 2然后调用[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompress 我正在使用xib&自动布局构建我的自定义单元格,在我的单元格中,有一个多行标签.一个在tablevIEw的heightForRowAtIndexPath中,我会使用

1 dequeueReusableCellWithIDentifIEr获取一个单元格

2然后调用[cell.contentVIEw systemLayoutSizefittingSize:UILayoutFittingCompressedSize]获取正确的高度.

但是在调试中,我发现当heightForRowAtIndexPath被调用时,我的单元格的宽度不是tablevIEw的宽度,单元格的宽度与xib文件的宽度相同(因为在xcode6中,可以将xib大小设置为任何).所以从systemLayoutSizefittingSize得到的高度是不正确的.如何解决这个问题,以获得正确的单元格高度

从systemLayoutSizefittingSize获得的大小是不正确的,这个大小可能有宽度340(而设备是宽度为320的iPhone5),而340是根据单元格的xib文件的宽度

最后,我得到了解决方案,谢谢Ashish Gabani的帮助,其实解决方案包括2步:
1将单元框重置为tableVIEw大小
2在调用systemLayoutSizefittingSize之前调用单元格的layoutSubVIEw,在自定义单元格中,需要重写layoutSubVIEws方法.
这是解决这个问题的代码,我用红色方块来标记它们,享受它

解决方法 您可以通过传递您的单元格高度来解决此问题
- (UItableVIEwCell *)tableVIEw:(UItableVIEw *)tableVIEw cellForRowAtIndexPath:(NSIndexPath *)indexPath{// Determine which reuse IDentifIEr should be used for the cell at this index path,// depending on the particular layout required (you may have just one,or may have many).Nsstring *reuseIDentifIEr = ...;// Dequeue a cell for the reuse IDentifIEr.// Note that this method will init and return a new cell if there isn't one available in the reuse pool,// so either way after this line of code you will have a cell with the correct constraints ready to go.UItableVIEwCell *cell = [tableVIEw dequeueReusableCellWithIDentifIEr:reuseIDentifIEr];// Configure the cell with content for the given indexPath,for example:// cell.textLabel.text = someTextForThisCell;// ...// Make sure the constraints have been set up for this cell,since it may have just been created from scratch.// Use the following lines,assuming you are setting up constraints from within the cell's updateConstraints method:[cell setNeedsUpdateConstraints];[cell updateConstraintsIfNeeded];// If you are using multi-line UILabels,don't forget that the preferredMaxLayoutWIDth needs to be set correctly.// Do it at this point if you are NOT doing it within the UItableVIEwCell subclass -[layoutSubvIEws] method.// For example:// cell.multilineLabel.preferredMaxLayoutWIDth = CGRectGetWIDth(tableVIEw.bounds);return cell; } - (CGfloat)tableVIEw:(UItableVIEw *)tableVIEw heightForRowAtIndexPath:(NSIndexPath *)indexPath{// Determine which reuse IDentifIEr should be used for the cell at this index path.Nsstring *reuseIDentifIEr = ...;// Use a dictionary of offscreen cells to get a cell for the reuse IDentifIEr,creating a cell and storing// it in the dictionary if one hasn't already been added for the reuse IDentifIEr.// WARNING: Don't call the table vIEw's dequeueReusableCellWithIDentifIEr: method here because this will result// in a memory leak as the cell is created but never returned from the tableVIEw:cellForRowAtIndexPath: method!UItableVIEwCell *cell = [self.offscreenCells objectForKey:reuseIDentifIEr];if (!cell) {    cell = [[YourtableVIEwCellClass alloc] init];    [self.offscreenCells setobject:cell forKey:reuseIDentifIEr];}// Configure the cell with content for the given indexPath,assuming you are setting up constraints from within the cell's updateConstraints method:[cell setNeedsUpdateConstraints];[cell updateConstraintsIfNeeded];// Set the wIDth of the cell to match the wIDth of the table vIEw. This is important so that we'll get the// correct cell height for different table vIEw wIDths if the cell's height depends on its wIDth (due to// multi-line UILabels word wrapPing,etc). We don't need to do this above in -[tableVIEw:cellForRowAtIndexPath]// because it happens automatically when the cell is used in the table vIEw.// Also note,the final wIDth of the cell may not be the wIDth of the table vIEw in some cases,for example when a// section index is displayed along the right sIDe of the table vIEw. You must account for the reduced cell wIDth.cell.bounds = CGRectMake(0.0f,0.0f,CGRectGetWIDth(tableVIEw.bounds),CGRectGetHeight(cell.bounds));// Do the layout pass on the cell,which will calculate the frames for all the vIEws based on the constraints.// (Note that you must set the preferredMaxLayoutWIDth on multi-line UILabels insIDe the -[layoutSubvIEws] method// of the UItableVIEwCell subclass,or do it manually at this point before the below 2 lines!)[cell setNeedsLayout];[cell layoutIfNeeded];// Get the actual height required for the cell's contentVIEwCGfloat height = [cell.contentVIEw systemLayoutSizefittingSize:UILayoutFittingCompressedSize].height;// Add an extra point to the height to account for the cell separator,which is added between the bottom// of the cell's contentVIEw and the bottom of the table vIEw cell.height += 1.0f;return height; }// NOTE: Set the table vIEw's estimatedRowHeight property instead of implementing the below method,UNLESS// you have extreme variability in your row heights and you notice the scroll indicator "jumPing" as you scroll.- (CGfloat)tableVIEw:(UItableVIEw *)tableVIEw estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{// Do the minimal calculations required to be able to return an estimated row height that's// within an order of magnitude of the actual height.// For example:if ([self isTallCellAtIndexPath:indexPath]) {    return 350.0f;} else {    return 40.0f;}}

您也可以从这里找到解决方案Link

总结

以上是内存溢出为你收集整理的ios – uitablviewcell动态高度从systemLayoutSizeFittingSize不正确全部内容,希望文章能够帮你解决ios – uitablviewcell动态高度从systemLayoutSizeFittingSize不正确所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1110270.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存