前言:这是一个相当抽象的问题。
我有一些单元格UITableView
使用不同的图像,具体取决于单元格的高度(以 50px 为增量,从 50px 到 1000px 高)。我遇到了一个奇怪的问题,当应用程序首次加载时,cellForRowAtIndexPath
报告前三个单元格(无论三个单元格是否都在屏幕上)的高度为 100px,然后当我向下滚动并再次向上滚动时,它们的高度会恢复到正确的值。屏幕上没有高度变化,只有使用的图像发生变化,以及cell.frame.size.height
我的NSLog
陈述中的值。
我一直在登录,heightForRowAtIndexPath
并且cellForRowAtIndexPath
我可以在他们离开时验证高度是否正确heightForRowAtIndexPath
。但是,当输入 时cellForRowAtIndexPath
,前三个高度都统一设置为 100。然后我向下滚动直到这三个单元格离开屏幕,然后向上滚动,.height
值已更改为正确的值。
总结一下,我的问题是:
heightForRowAtIndexPath
在最后和最开始之间是否有任何代码cellForRowAtIndexPath
可以改变cell.frame.size.height
这些前几个单元格的值?
为什么这个问题只发生在前三个单元格上?而且,为什么他们会在稍后重新加载时恢复?我认为重用标识符可能是原因,但它们在首次加载时仍被分配了该标识符,所以这不重要,不是吗?
编辑:我认为 100px 高度来自故事板中原型单元格的行高,就好像我将其更改为 101px 一样,前三个单元格最初为 101px。
编辑:这是我用来设置图像的代码,虽然这部分正在工作,但它只是使用了错误的值:
UIImage *cappedBG;
float cellHeight = cell.contentView.frame.size.height;
if (cellHeight <= 51) {
cappedBG = [[UIImage imageNamed: @"bg50.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
} else if (cellHeight <= 101) {
cappedBG = [[UIImage imageNamed: @"bg100.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
} else if (cellHeight <= 151) {
cappedBG = [[UIImage imageNamed: @"bg150.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
} else if (cellHeight <= 201) {
cappedBG = [[UIImage imageNamed: @"bg200.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
} else {
cappedBG = [[UIImage imageNamed: @"bg250.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
}