在自定义 UITableViewCell 中调整 UIImageView 的大小会产生不一致的结果
Posted
技术标签:
【中文标题】在自定义 UITableViewCell 中调整 UIImageView 的大小会产生不一致的结果【英文标题】:Resizing UIImageView within custom UITableViewCell yielding inconsistent results 【发布时间】:2012-10-23 12:41:07 【问题描述】:我正在基于我在 XIB 文件中创建的 UITableViewCell 原型构建一个表。该单元由几个标签和一个图像视图组成,需要拉伸以适应整个设备宽度。一旦宽度被拉伸,我也想将高度拉伸到相同的比例,这样我的图像就会一致地缩放。
我得到的结果好坏参半。我已经能够使用以下代码适当地调整 CELL 的大小:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
//pull the image from the array based on the indexPath
NSUInteger row = [indexPath row];
CITImage *image = [report.reportImages objectAtIndex:row];
UIImage *img = [UIImage imageWithData:image.imageData];
//see how we need to scale the image to make it fit within the full width of the screen
float scale = tableView.frame.size.width /img.size.width;
float imgHeight = img.size.height * scale;
//return the necessary cell height
return imgHeight;
问题是单元格内的 UIImageView 没有正确调整大小。我正在使用以下代码在准备绘制单元格时设置它的属性:
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//pull the image from the array based on the indexPath
NSUInteger row = [indexPath row];
CITImage *image = [report.reportImages objectAtIndex:row];
UIImage *img = [UIImage imageWithData:image.imageData];
//attempt to get a reusable cell
CITImageCell *cell;
cell= [tableView dequeueReusableCellWithIdentifier:@"CITImageCellIdentifier"];
if (cell == nil)
// Load the top-level objects from the custom cell XIB.
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CITImageCell" owner:self options:nil];
cell = [topLevelObjects objectAtIndex:0];
//see how we need to scale the image to make it fit within the full width of the screen
float scale = tableView.frame.size.width /img.size.width;
float imgHeight = img.size.height * scale;
NSLog (@"Height %f",cell.imageView.frame.size.height);
//size the image view
cell.imageView.frame = CGRectMake(0,34, tableView.frame.size.width, imgHeight+34 );
NSLog (@"Height %f",cell.imageView.frame.size.height);
//assign the image
cell.imageView.image = img;
//return the cell ready to go
return cell;
两个 NSLog 语句验证高度值计算是否正确,但是当图像显示在屏幕上时,它的大小很少正确。大多数情况下,它的大小与 XIB 文件中定义的大小相同,但有时它采用正确的高度。我还没有找到一个很好的模式。它从来不是表中的第一项,总是第二项,有时是第四和第五项。
仍在挖掘文档和其他人的故事,最让我感动的是我可以正确调整单元格大小,并且图像高度计算正确,但仅在某些时候正确显示。
有什么帮助吗?显示我正在经历的截图的链接如下(是的,我昨晚正在观看辩论)
Unscaled image
Correctly scaled image
谢谢!
【问题讨论】:
我想知道是否需要在运行时完全生成 UIImageView。我已经阅读了一些其他帖子,其中您无法移动自定义单元格中的 UIImageView;我想知道这是否同样适用于调整 UIImageView 的大小。 搞定了!我不知道这是否是唯一的方法,但我必须在运行时创建 UIImageView 并将其手动添加到单元格中,而不是尝试调整 XIB 文件中的那个。谁能解释这是为什么?这是我最后得到的代码:CGRect imageFrame = CGRectMake(0,34, tableView.frame.size.width, imgHeight); UIImageView *imgView = [[UIImageView alloc] initWithFrame:imageFrame]; [imgView setImage:img]; [单元格 addSubview:imgView]; 【参考方案1】:我遇到了同样的问题。经过一小时的工作,我意识到发生了什么!
问题是 UITableViewCell 已经有一个imageView
!!
如果您将 SAME 属性名称 imageView
用于 UIImageView
,系统会以某种方式修改您定义的 imageView
。
所以解决方法是不要使用名称imageView
,尝试使用其他名称。
例如:
@property (nonatomic, weak) UIImageView *myImageView;
至少对我有用。 :)
【讨论】:
这个答案帮助我解决了一个相关问题 - 谢谢! ***.com/questions/15747001/… 如果我能给你 1000 票,我会的。在看到这篇文章之前,我正要把我的电脑扔到墙上。 这个答案应该装框挂在墙上:) @Ray,你完全喜欢这个!【参考方案2】:搞定了!我不知道这是否是唯一的方法,但我必须在运行时创建 UIImageView 并将其手动添加到单元格中,而不是尝试调整 XIB 文件中的那个。谁能解释这是为什么?
这是我最后得到的代码:
CGRect imageFrame = CGRectMake(0,34, tableView.frame.size.width, imgHeight);
UIImageView *imgView = [[UIImageView alloc] initWithFrame:imageFrame];
[imgView setImage:img];
[cell addSubview:imgView];
【讨论】:
@Ray 的回答应该是公认的答案......它还回答了您在回答中提出的问题。【参考方案3】:我认为我错过的另一个答案是使用 IB 将 UIImageView 的边界绑定到容器单元格的底部。我当时不知道我能做到这一点,但一位朋友向我展示了如何做到这一点,我想我会在这里提到它。
【讨论】:
以上是关于在自定义 UITableViewCell 中调整 UIImageView 的大小会产生不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章
在自定义单元格中调整 iOS 7.1 中的 UILabel 大小
自定义 UITableViewCell 中的 UIImageView - 始终调整为图像大小
我在自定义 TableViewCell 中有一个 UICollectionView,但我无法自动调整 CollectionView 的大小
UIButton 在自定义 UITableviewCell 中没有响应