我的应用程序中有一个相当普通的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框架稍大的图像)不会表现出这种行为。答案 0 :(得分:21)
如果您有自定义UITableViewCell,请确保您的UIImageView未以" imageView"
命名答案 1 :(得分:11)
唯一让人想到的影响尺寸的因素在其超级视图中出现的视图是:
您是否在任何地方更改框架/边界/中心属性?框架最初设置在何处/如何设置?
imageView.autoResizingMask
应设置为UIViewAutoResizingNone
imageView.clipsToBounds
应设置为YES
编辑:更多建议
我在黑暗中拍摄b / c你发布的代码看起来很好,如果你设置了imageView.clipsToBounds
,那么应该将绘制的图像约束到imageView
帧。这里还有几件事要尝试:
实施tableView:willDisplayCell:forRowAtIndexPath:
并在其中设置imageView
属性。如果问题imageView.frame
,则可能无法解决问题。
将您自己的UIImageView
添加到已配置的单元格中,并且不要使用内置的imageView
属性。如果默认单元格的行为导致问题,则这应该有效。
编辑:大图像问题
我不知道您目前正在使用的“真正大图像”有多大,但它们很可能是个问题。来自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)
请按以下步骤操作:
答案 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)
我知道发布此消息为时已晚,但有人可能会觉得有用。