- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:我遇到一个问题,即使用 estimatedHeightForRowAtIndexPath 和 heightForRowAtIndexPath 计算的单元格高度返回错误的高度。具体来说,有时单行文本标签的高度返回与标签相同的高度(高度太大了)。或者,图像最终与单行文本标签的高度相同(高度太小了)。
理论:我根据消息的类型使用不同的单元格高度。由于有时文本显示为与贴纸(固定高度为 150)相同的高度,我想知道是否在重复使用单元格的地方存在错误。或者,我从单元格高度缓存中保存/读取的方式存在错误。
奖励:我花了至少一个月的时间试图弄清楚发生了什么。这不是一个容易的问题。您将收到我永恒的感激之情,以及我可以添加的赏金。
这是一些上下文的代码。首先,heightForRowAtIndexPath:
- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath {
NSNumber *cachedCellHeight = [self.cachedCellHeights objectForKey:[NSString stringWithFormat:@"%u", indexPath.row]];
if([cachedCellHeight floatValue] >= MINIMUM_CELL_HEIGHT) {
// NSLog(@"Retrieving cached cell height (estimatedHeightForRowAtIndexPath): %f for row: %u", [cachedCellHeight floatValue], indexPath.row);
return [cachedCellHeight floatValue];
}
// Cell height is not in the cache (or somehow an invalid height is retrieved), calculate and store it
NSManagedObject *record = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSInteger type = [[record valueForKey:@"type"] integerValue];
NSString *message = [NSString stringWithFormat:@"%@", [record valueForKey:@"message"]];
static NSString *identifier = @"MessagesTableViewCellTextLeft";
switch (type) {
case TypeText:
identifier = @"MessageTypeText";
break;
case TypeImage:
identifier = @"MessageTypeImage";
break;
case TypeSticker:
identifier = @"MessageTypeSticker";
break;
}
static MessagesTableViewCell *cell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
cell = [self.tableView dequeueReusableCellWithIdentifier: identifier];
});
CGFloat calculatedCellHeight;
UIImage *image = nil;
switch (type) {
case TypeText:
cell.textLabel.text = message;
[cell setNeedsLayout];
[cell layoutIfNeeded];
calculatedCellHeight = [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height; // used for multi line labels
break;
case TypeImage:
image = [self getImageFromDocumentsFolder:message];
if (image) {
calculatedCellHeight = [self getImageCellHeight: image]; // calculates height based on aspect ratio of image
}
break;
case TypeSticker:
calculatedCellHeight = 150; // will always be this height
break;
}
/* If the calculation fails and the value is below the minimum cell height, don't store in the cell heights cache */
if(calculatedCellHeight >= MINIMUM_CELL_HEIGHT) {
// NSLog(@"Calculating and storing cell height (estimatedHeightForRowAtIndexPath): %f for row: %u for type: %@", calculatedCellHeight, indexPath.row, identifier);
[self.cachedCellHeights setObject:[NSNumber numberWithFloat:calculatedCellHeight] forKey:[NSString stringWithFormat:@"%u", indexPath.row]];
[self saveCachedHeightsToDisk];
} else {
calculatedCellHeight = [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height;
}
return calculatedCellHeight;
}
此外,为了让多行标签起作用,我必须在自定义单元格类中设置一个 preferredMaxLayoutWidth:
- (void) updateConstraints {
[super updateConstraints];
// For multi-line labels, this property is required to word wrap appropriately
// In this case, word wrapping will occur 100 units away from screen edge
textLabel.preferredMaxLayoutWidth = CGRectGetWidth([[UIScreen mainScreen] bounds]) - 100;
}
这是我对单元格高度缓存的实现。注意,cachedCellHeights 只是一个合成的 NSDictionary:
- (void) saveCachedHeightsToDisk {
NSArray *directoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if ([directoryPath count] > 0) {
NSString *rebasedPath = [ClientUtilities rebasePathToCurrentDocumentPath:CACHED_CELL_HEIGHTS_FILENAME];
[self.cachedCellHeights writeToFile:rebasedPath atomically:YES];
}
}
- (NSMutableDictionary *) loadCachedHeightsFromDisk {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *filePath = [ClientUtilities rebasePathToCurrentDocumentPath:CACHED_CELL_HEIGHTS_FILENAME];
if (![fileManager fileExistsAtPath:filePath]){
// NSLog(@"Initializing cached cell heights to disk");
return [NSMutableDictionary dictionary];
} else {
// NSLog(@"Loading cached cell heights from disk");
return [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
}
}
请注意,同一代码用于 estimatedHeightForRowAtIndexPath 和 heightForRowAtIndexPath。我知道您不应该对 estimatedHeight 进行任何繁重的计算。但是,由于我是从底部堆叠单元格并且它们的高度可能有很大差异,所以我必须进行此计算(或从缓存中读取)。否则,滚动到底部功能将不起作用(它根据错误的估计高度计算将滚动放在它认为结束的位置,这是一些没有意义的随机点)。
将不胜感激解决方案或任何意见或建议。
最佳答案
好的,所以缓存的东西是一个红色的鲱鱼。这不是我的缓存。我确定。
我发现导致单元格高度比应有的高度高的违规 block :
cell.textLabel.text = message;
[cell setNeedsLayout];
[cell layoutIfNeeded];
calculatedCellHeight = [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height;
NSLog(@"Calculated cell height is: %f", calculatedCellHeight);
UILayoutFittingCompressedSize 返回的高度不正确。一旦进入这种“状态”,所有文本单元格的大小都会评估为 150。无论我添加多少次新的文本单元格。如果我强行关闭并返回应用程序,问题就解决了。
我仍然不明白为什么会这样。线程问题?细胞复用问题?有什么建议吗?
关于ios - UITableView 上的单元格高度缓存和 [sizeToFit] *有时* 显示错误的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32683797/
我有下面的图表,它填充了显示器的宽度和高度。高度始终只比屏幕大一点,因此会出现滚动条以显示底部 20 像素左右。 有没有办法让 Kendo UI 显示 100%,而不是 105% 的高度? 在线示例:
这个问题在这里已经有了答案: Why doesn't height: 100% work to expand divs to the screen height? (12 个答案) 关闭 9 年前
此页面 ( http://purcraft.com/madeinla/) 有问题,我正在尝试使用 iframe 元素显示此页面的内容:( http://purcraft.com/madeinla/ho
我在一个父 div 中有 2 个子 div。 Child1 是标题,Child2 是正文。我希望将 Child 2 的高度设置为 Parent - Child1 的高度。 Child2 有内容,所以它
我正在尝试用图像填充窗口。我正在使用 CSS 来尝试解决这个问题,但我想知道是否有一种方法可以最大化图像的宽度/高度,直到所有空白区域都被填满,但又不会破坏质量。 .rel-img-co
这个问题在这里已经有了答案: How to make a div 100% height of the browser window (41 个回答) 关闭 8 年前。
这可能是一个新手问题,但是是否可以将 Sprite 图标添加到带有文本的标签中? 例如: labeltext .icon { width: 30px height: 30px;
我有 3 个 div,分别是 header、content 和 footer。页眉和页脚具有固定的高度,并且它们被设计为 float 在顶部和底部。我想要使用 jquery 自动计算中间的 con
我有一个外部 div,其指定的宽度/高度(以毫米为单位)。 (mm只是赋值,不用于渲染)。 里面有另一个 div,其实际宽度/高度(以 px 为单位)。 两个 div 可以具有不同的比例。 我想要做的
我正在为一个非常简单的画廊 webapp 进行布局排序,但是当我使用 HTML5 文档类型声明时,我的一些 div(100%)的高度会立即缩小,我不能似乎使用 CSS 将它们丰满起来。 我的 HTML
我正在为一个非常简单的画廊 webapp 进行布局排序,但是当我使用 HTML5 文档类型声明时,我的一些 div(100%)的高度会立即缩小,我不能似乎使用 CSS 将它们丰满起来。 我的 HTML
我想更改 UISearchBar。文本字段的高度和宽度。我的问题是如何更改 iphone 中 UISearchBar 中的 UiSearchbar 高度、宽度、颜色 和 Uitextfield 高度?
我想要两个宽度和高度均为 100% 的 div。我知道子 div 不会工作,因为父 div 没有特定的高度,但有没有办法解决这个问题? HTML: CSS: body
我有几个带有“priceText”类的 div,我试图实现如果 div.priceText 高度小于 100px,则隐藏 this div 中的图像。 我无法让它工作。我已成功隐藏所有 .priceT
我正在尝试从 Image 列中列出的图像中获取实际图像尺寸,并将其显示在 Image Size 列中。 我遇到的问题是,我只能获取第一张图片的大小,该图片会添加到 Image Size 列的每个单元格
我正在使用一个插件,它要求我在加载图像后获取图像的宽度和高度,而不管图像的尺寸是如何确定的。
我有一个示例 pdf(已附),它包括一个文本对象和一个高度几乎相同的矩形对象。然后我使用 itextrup 检查了 pdf 的内容,如下所示: 1 1 1 RG 1 1 1 rg 0.12 0 0 0
我是 WPF 新手。我试图解决的一个问题是如何在运行时获得正确的高度。 在我的应用程序中,我将用户控件动态添加到代码隐藏中的 Stackpanel。 Usercontrol 包含一些 Texblock
在自定义 WPF 控件中,我想将控件的宽度设置为高度的函数。例如:Width = Height/3 * x; 实现此目的的最佳方法是什么,以便控件正确且流畅地调整大小(和初始大小)? 最佳答案 您可以
好吧,我本以为这是一个简单的问题,但显然它让我感到困惑。 当我尝试设置 RibbonComboBox 的高度时,它不会移动它的实际大小,而是移动它周围的框。 这是我的 XAML:
我是一名优秀的程序员,十分优秀!