我的UITableViewCell中的UIImageView在点击时会改变大小

时间:2011-12-20 20:15:13

标签: iphone ios image uitableview resize

我的应用程序中有一个相当普通的UITableView,用于以默认/标准方式显示图像和文本。第一次请求UITableViewCell时,我使用占位符图像返回它并开始异步下载真实图像。下载完成后,我替换占位符图像。

如果下载失败,则占位符图像仍然存在。单击这样一行就可以正常工作。如果下载成功,单击具有预期图像的行将导致UIImageView扩展到行的高度(并且宽度按比例增加)。 UIImageView永远不会恢复正常大小。原始尝试设置UIImageView的框架并没有缓解神秘大小调整的问题。

// from my - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; method
// after boilerplate cell dequeuing code
cell.textLabel.text = [selectedNoun title];

// add placeholder image
UIImage *placeholderImage = [UIImage imageNamed:@"placeholder.png"];
cell.imageView.image = placeholderImage;
[cell.imageView setContentMode:UIViewContentModeScaleAspectFit];
//...
// If the image has been downloaded I set it
cell.imageView.image = iconDownloader.image;

这让我疯了。它实际上只发生在我的应用程序中的两个表中的一个表中,但在比较它们的行或行后,我看不出任何差异。希望有人之前遇到过这个问题。

谢谢!

编辑:我对我的解决方案没有很好的解释,只是说超过一定大小的图像似乎会导致这种行为,并且使用实际的缩略图(甚至比UIImageView框架稍大的图像)不会表现出这种行为。

12 个答案:

答案 0 :(得分:21)

如果您有自定义UITableViewCell,请确保您的UIImageView未以" imageView"

命名

答案 1 :(得分:11)

唯一让人想到的影响尺寸的因素在其超级视图中出现的视图是:

  1. 您是否在任何地方更改框架/边界/中心属性?框架最初设置在何处/如何设置?

  2. imageView.autoResizingMask应设置为UIViewAutoResizingNone

  3. imageView.clipsToBounds应设置为YES

  4. 编辑:更多建议

    我在黑暗中拍摄b / c你发布的代码看起来很好,如果你设置了imageView.clipsToBounds,那么应该将绘制的图像约束到imageView帧。这里还有几件事要尝试:

    1. 实施tableView:willDisplayCell:forRowAtIndexPath:并在其中设置imageView属性。如果问题imageView.frame,则可能无法解决问题。

    2. 将您自己的UIImageView添加到已配置的单元格中,并且不要使用内置的imageView属性。如果默认单元格的行为导致问题,则这应该有效。

    3. 编辑:大图像问题

      我不知道您目前正在使用的“真正大图像”有多大,但它们很可能是个问题。来自UIImage文档(重点是我的):

        

      您应该避免创建大于1024 x的UIImage对象   1024个大小。除了大量的内存这样的图像会   消耗,使用图像作为纹理时可能会遇到问题   在OpenGL ES 中或将图像绘制到视图或图层 时。这个尺寸   如果您正在执行基于代码的限制,则不适用   操作,例如调整大小超过1024 x 1024的图像   像素通过绘制到位图支持的图形上下文。事实上,你   可能需要以这种方式调整图像大小(或将其分成几个   较小的图像),以便将其绘制到您的一个视图。

答案 2 :(得分:3)

我的问题略有不同,我有一个带有自己的UIImageView的自定义UITableViewCell,当单元格消失并重新出现时,图像的大小不正确。我的问题是我在一个地方设置了cell.imageView而在另一个地方设置了cell.thumbnail(自定义图片),因此我将所有引用更改为cell.thumbnail.

希望未来有类似问题可以帮助某人。

答案 3 :(得分:3)

This answer帮助了我。但我必须确保在实际进行设置的方法中调用[cell layoutSubviews],如下所示:

cell.imageView.image = image;
[cell layoutSubviews];

希望这对你有用!

答案 4 :(得分:1)

在这些情况下,我使用此Image loader框架。它包括一种设置所选择的占位符图像的方法,同时在后台下载图像,并且作为额外的好处,它可以缓存图像,保证相同的图像不会被下载两次。这是我发现的一项很棒的工作,对于tableview图像加载非常有用。

SDWebImage: https://github.com/rs/SDWebImage

答案 5 :(得分:1)

我遇到了同样的问题,我没有弄清楚原因。无论如何,它是与占位符图像相关的内容:如果您加载与占位符大小相同的图像,则不会执行调整大小,但如果大小不匹配,则加载的图像将调整大小占位符维度,单击时再次调整大小。

因此,如果您想避免此问题,请使用与行高匹配的占位符。

答案 6 :(得分:1)

请按以下步骤操作:

  1. 在自定义单元格上选择ImageView
  2. 转到Show to Identity Inspector
  3. 一直滚动到最后,取消选中“启用用户互动”复选框。

答案 7 :(得分:0)

这是不太可能的,但是当它的isSelected属性从NO切换到YES时,您应该尝试查看UITableViewCell子视图的帧会发生什么(即当发生时会发生什么你点击一个单元格)。我怀疑这会有多大帮助,但是值得研究(如果你能找到任何东西......那就是我想象的UITableViewCell的全部内容)。

您还应该查看imageview的clipsToBounds属性。也许这与它有关?

答案 8 :(得分:0)

做类似

的事情
CGRect bounds = [self bounds];
[self setImage:image];
[self setBounds:bounds];

设置图片时为我解决了问题

答案 9 :(得分:0)

如果在完成加载后重新加载tableview,图像将获得它所假设的大小

[self.tableview reloadData];

答案 10 :(得分:0)

我通过以下方法解决了这个问题:

cell.selectionStyle = .none

答案 11 :(得分:0)

就我而言,我在iOS 12中遇到了此问题,但是iOS 13可以正常工作。

我将UIImageView更改为UIButton,并按如下所示设置背景图片,从而解决了我的问题。

cell.imageButton.setBackgroundImage(UIImage(named: "name_of_the_image", for: UIControl.State.normal)

我知道发布此消息为时已晚,但有人可能会觉得有用。