UIImageView 设置为 imageWithData 忽略 contentMode

Posted

技术标签:

【中文标题】UIImageView 设置为 imageWithData 忽略 contentMode【英文标题】:UIImageView set to imageWithData ignores contentMode 【发布时间】:2013-07-27 13:34:24 【问题描述】:

在我的自定义 tableViewCell 中,我有一个填充整个单元格的 imageView(不是 tableViewCell 的默认 imageView)。它在 IB 中(通过代码)使用 contentMode UIViewContentModeAspectFill 设置,并且剪辑到边界。每当我将 imageView 的图像更改为使用[UIImage imageNamed:...] 加载的图像时,它都会根据需要调整大小并适合 imageView。但是,当使用[UIImage imageWithData:...] 加载图像集时,图像已设置,但未调整大小。

用数据本身加载图像的代码在后台线程中运行,如下所示:

- (void)getImage:(NSString *)URL 
    NSError *error = nil;
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:URL] options:NSDataReadingMapped error:&error]];
    if (!error)
        [self.thumbView setImage:image];
        [self.thumbView setContentMode:UIViewContentModeScaleAspectFill];
    

我尝试在主线程上设置图像,在layoutSubviews,但它总是产生相同的结果——它不会调整大小以填充图像视图。我将图像 (JPG) 添加到应用程序包中,并使用 [UIImage imageNamed:...] 以编程方式设置它,这可行,但应用程序必须从 URL 获取数据。

我也尝试使用 UIImageView+AFNetworking 类来设置图像异步而不是创建自己的线程,但这也不起作用。

为什么从数据中加载的图像不尊重 UIImageView 的 contentMode?任何帮助表示赞赏。 JPEG 和 PNG 都不起作用。

【问题讨论】:

@OliverAtkinson 真的更好吗?这个 sn-p 工作得很好,只是图像没有按预期调整大小。 它处理缓存图像,因此您不必担心会降低用户加载图像的体验。它还将遵循 UIImageView 上已设置的任何 contentMode 设置。 AFNetworking 可能是最好的。 那我试试看!谢谢:) 您使用的是过渡方法,这很奇怪。这些方法旨在用另一种视图替换一个视图。我会考虑在没有动画的情况下测试图像变化。然后尝试使用-[UIView animateWithDuration:animations:] 方法对图像的更改进行动画处理。有关详细信息,请参阅 UIView 文档。 正如所写,我已经尝试过没有过渡。过渡方法也是唯一适用于此目的的动画! :) 【参考方案1】:

如果其他人偶然发现了同样的问题,这就是我所做的解决方法。

我在 IB 中新建了一个 imageView,删除了旧的,更改了 contentMode-value 和 clipsToBounds-value。在 tableViewCell.m 初始化代码中,我设置了占位符图像,瞧——一切都像魅力一样。

虽然我真的不知道是什么原因造成的,但可能是清除图形内容复选标记设置错误(哎呀)。

【讨论】:

以上是关于UIImageView 设置为 imageWithData 忽略 contentMode的主要内容,如果未能解决你的问题,请参考以下文章

将contentMode设置为UIViewContentModeScaleAspectFit时如何设置UIImageView左对齐或右对齐?

图像设置为零时UIImageView不重绘

获取当前设置为 UIImageView 的图像名称的任何替代方法?

为 UIImageview 设置 Uianimation 和 Touch 事件

UIImageView 设置为 imageWithData 忽略 contentMode

使用叠加按钮为 UIImageView 设置动画