iOS - UITableViewCell 图像调整/调整大小

Posted

技术标签:

【中文标题】iOS - UITableViewCell 图像调整/调整大小【英文标题】:iOS - UITableViewCell image adjust/resize 【发布时间】:2013-12-31 17:40:41 【问题描述】:

我创建了一个表格视图并用文本填充了它的单元格。我想做的是向单元格添加图像,但发生的事情是图像覆盖了整个单元格,看起来很糟糕......

这就是我正在做的事情:cell.imageView.image = [UIImage imageNamed:@"test2.jpeg"];

这就是它的样子:

我想让它看起来像:

如何调整表格视图单元格的图像大小以获得所需的结果?

更新

这是我在以下答案中尝试过的建议:

cell.imageView.frame = CGRectMake(0.0f, 0.0f, 30.0f, 30.0f);
cell.imageView.layer.cornerRadius = 8.0;
cell.imageView.contentMode = UIViewContentModeScaleAspectFit;
cell.imageView.layer.masksToBounds = YES;
cell.imageView.image = [UIImage imageNamed:@"test2.jpeg"];

但我得到的输出仍然是:

更新 2.0

我尝试了其他一些建议的方法:

UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(30, 30, 30, 30)];
imageView.backgroundColor = [UIColor clearColor];
[imageView.layer setCornerRadius:8.0f];
[imageView.layer setMasksToBounds:YES];
[imageView setImage:[UIImage imageNamed:@"test2.jpeg"]];
[cell.contentView addSubview:imageView];

但现在我得到了这个:

【问题讨论】:

【参考方案1】:

首先,您需要将单元格的 imageView 设置为您想要的最大尺寸。然后通过 Interface Builder 或代码确保您具有正确的内容模式:

cell.imageView.contentMode = UIViewContentModeScaleAspectFit;

基本上使用此模式,它会尝试适应您为图像创建的空间,但会保持纵横比。

Jackson 发布了一张很好的图片,显示了here 的内容模式:

对于角落,您将需要 QuartzCore,您可以使用以下代码进行设置:

#import <QuartzCore/QuartzCore.h>

...

cell.imageView.layer.cornerRadius = 4;
cell.imageView.layer.masksToBounds = YES;

更新

如果您的 imageView 不是插座,您最好自己添加一个 imageView 到单元格中。您可以(并且应该)通过故事板/xib 做到这一点。 This tutorial might help you 对此,尽管互联网上有很多。 This *** question 为该问题提供了其他解决方案。

【讨论】:

但是我不明白为什么当我使用cell.imageView.frame = CGRectMake(0,0,30,30); 设置图像视图的帧大小时它不起作用。它仍然显示问题中显示的图像 请同时使用 cell.imageView.layer.masksToBounds = YES;检查角落是否变圆。这有点奇怪。在此之后,您可能正在另一个地方更改 imageView。该推特图像是单元格的默认图像,或者您使用 cell.imageView.image = [UIImage imageNamed:@"test2.jpeg"]; 设置它?或者两者兼而有之? 谢谢,我已经添加了。并且没有 about sn-p,就没有放置图像视图... 抱歉,我认为您的 imageView 是您在 storyboard/xib 中添加的 imageView 的 Outlet。实际上,最好这样做。请检查这个为您的问题提供多种解决方案的 *** 线程 -> ***.com/questions/2788028/… 我查看了那个问题,发现了一些可行的方法,但并没有真正给我想要的结果。我已经用现在发生的事情更新了问题...感谢您的帮助!【参考方案2】:

我花了最后几个小时来弄清楚如何做到这一点,所以我将分享我的发现。更新 2.0 中的代码是一个好的开始:

UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(30, 30, 30, 30)];
imageView.backgroundColor = [UIColor clearColor];
[imageView.layer setCornerRadius:8.0f];
[imageView.layer setMasksToBounds:YES];
[imageView setImage:[UIImage imageNamed:@"test2.jpeg"]];
[cell.contentView addSubview:imageView];

你可以把第一行的数字弄乱,让图片出现在你需要的地方;出于我的目的,我使用了(20, 5, 40, 40)

[cell.contentView addSubview:imageView]之前添加这一行:

[imageView setTag:99];

我们需要这个标签来识别我们刚刚添加的子视图。如果每次重新加载单元格时不删除图像,图像就会开始堆积在那里。对于您的情况,这并没有太大区别,因为它将继续使用相同的图像,因此看起来相同。但是,如果您有一个喜欢上下滚动的用户,您可能会遇到加载数百或更多这些图像的问题。如果您的单元格将有不同的图像,它们将开始显示在彼此之上,如果它们的大小不同,这将看起来非常糟糕。所以在你初始化*imageView之前,运行这个循环:

for (UIImageView *subview in cell.contentView.subviews)

    if (subview.tag == 99)
    
        [subview removeFromSuperView];
    

使用此代码,您的图像应该看起来与更新 2.0 中的相同,但它应该运行得更好。要移动文本,请使用 cell.indentationLevelcell.indentationWidth。确保您的单元格样式设置为“基本”(看起来像您的),并且在您归还单元格之前,请使用

cell.indentationWidth = 10; // The amount each indentation will move the text
cell.indentationLevel = 7;  // The number of times you indent the text

所以这段代码会将文本移动超过 10 点 7 次。你可以玩它直到你让它看起来正确;这正是我在项目中使用的。希望这会有所帮助!

【讨论】:

这两行超级喜欢 cell.indentationWidth = 10; // 每个缩进移动文本的量 cell.indentationLevel = 7; // 缩进文本的次数 应该是removeFromSuperview(没有大写V)【参考方案3】:

您可以编辑图像本身吗?尝试将图像编辑成您想要的大小并手动圆角。然后调用

  cell.imageView.image = [UIImage imageNamed:@"test3.jpeg"];

【讨论】:

【参考方案4】:

实现这一点的最佳方法是在您调用cell.imageView.image的地方添加以下内容

cell.imageView.contentMode = UIViewContentModeScaleAspectFill;

对于圆角#import &lt;QuartzCore/QuartzCore.h&gt;

cell.imageView.layer.cornerRadius = 8.0;

【讨论】:

以上是关于iOS - UITableViewCell 图像调整/调整大小的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 UITableViewCell 上使用图像时 IOS 8 崩溃

iOS - UI 测试在 UITableViewCell 中查找图像

在 iOS 的 UITableViewCell 中更新 UIButton 图像时发生冲突

iOS UITableViewCell 和 UIImageView 在视图外显示图像

(iOS + Firebase)无法将图像从 UITableViewCell 传递给下一个 ViewController

圆形图像视图最初在 UITableViewCell 中加载为正方形 - Xamarin.iOS