如何在 UITableCellView 中设置 imageView 属性以仅显示背景颜色?

Posted

技术标签:

【中文标题】如何在 UITableCellView 中设置 imageView 属性以仅显示背景颜色?【英文标题】:How to set the imageView property in a UITableCellView to show only a background color? 【发布时间】:2012-03-05 12:05:24 【问题描述】:

我有一个继承自 UITableViewCell 类的自定义类,该类显示图像(标题左侧)或通用深色方块(如果图像不可用)。以下代码在浅色单元格背景上显示了一个黑色方块:

imageView = [[UIImageView alloc] initWithFrame:CGRectMake(11, 6, 40, 40)];
[imageView setBackgroundColor:kBackgroundGreyColour];
[cell.contentView addSubview:imageView];

但是,与其在每个表格单元格中创建自定义子视图,我更愿意使用通用 UITableViewCell 类的现有 imageView 属性并以某种方式对其进行修改以显示正方形,就像上面的代码一样。这就是我目前正在尝试的:

UIImageView* iv = [[UIImageView alloc] initWithFrame:CGRectMake(11, 6, 40, 40)];
[iv setBackgroundColor:[UIColor redColor]];
self.imageView.hidden = NO;
self.imageView.opaque = iv.opaque;
self.imageView.alpha = iv.alpha;
self.imageView.image = iv.image;
[self bringSubviewToFront:self.imageView];
[self.imageView setBackgroundColor:[UIColor redColor]];

我添加了所有这些行以将许多现有的 UIImageView 属性设置为与第一个代码 sn-p 中创建的 UIImageView 实例相同的值,但第二个代码 sn-p 不显示任何黑色方块。它根本不显示任何内容,并且单元格看起来只有浅色背景,没有可见的图像视图。但是我看到 imageView 属性不是 nil 所以在第二个 sn-p 中执行所有这些代码行应该会显示什么?

但是,一旦我将新图像分配给 imageView 属性(例如 self.imageView.image = [[UIImage alloc] init...],方块就会毫无问题地显示分配的图像。

编辑:请注意,在第二种情况下,我在 layoutSubview 函数中设置 imageView 的框架,例如:

-(void)layoutSubviews

    [super layoutSubviews];
    self.imageView.frame = CGRectMake(11, 6, 40, 40);

所以我的问题是: 1. 我需要设置现有 imageView 属性的哪些属性以及设置哪些值,以便代码显示一个填充了特定颜色的正方形(就像代码的第一个 sn-p 一样)?

    有没有办法以编程方式创建UIImage,以便它只显示背景颜色而没有任何与之关联的图像(我可以使用它来设置 imageView.image 属性以显示该颜色)。

    是否可以用自定义视图替换 UITableViewCell 类中的现有 imageView 属性而不添加自定义子视图(就像第一个代码 sn-p 所做的那样),以便我可以显示占位符 UIView图片不可用时的背景颜色?

【问题讨论】:

【参考方案1】:

您的代码不起作用的原因正如您所猜测的那样;因为当您设置图像视图的背景颜色时,它不会在图像属性上创建任何内容。 而且,你发现你也不能直接设置单元格的 imageview 属性。

我会说你最好的选择是前一种选择;以编程方式创建 UIImage。 虽然,我强烈建议您简单地在您最喜欢的图像编辑软件中创建一个,然后将其包含在捆绑包中。它便于以后更换,因为当您可以获得更好的图像时,几乎不需要代码和精力来更换。

但如果您仍希望以编程方式完成所有操作,那就没有您希望的那么简单了。

CGRect rect = CGRectMake(11, 6, 40, 40);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [kBackgroundGreyColour CGColor]);
CGContextFillRect(context, rect);

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

self.imageview.image = image;

应该做的伎俩。 这会定义图像大小,创建图形上下文(将其视为画布),选择要使用的灰色,用它绘制画布,然后将其扫描到您的计算机中,变成您想要的小尺寸。

小绿鬼在屏幕后面做这一切(抱歉,Terry Pratchett 太多了)。

【讨论】:

太棒了!感谢您确认我的怀疑和 sn-p 以编程方式创建它。然而,还有一个解决方案,即:创建具有背景颜色的 UIImageView 并将其添加为子视图(就像在我的第一个代码 sn-p 中一样),然后最终从超级视图中删除并仅在设置时删除(设置为 nil) imageView.image 属性。不过,我不确定这是否比您建议的在所有单元格中重用相同的占位符图像更节省内存。 如果你想这样做,不需要 UIImageView 的所有开销。 UIView 具有您需要的所有背景颜色属性/方法。但是,如果您使用子视图,则必须管理它的所有移动、内存、自动调整大小等。如果您将自定义图像添加到 UITableViewCell 的图像视图中,则单元可以处理所有显示本身,而无需太多工作。当然,除非你想要灵活性......? 其实方形背景只是一张图片的占位符,所以我不需要移动它,也不需要调整大小,也不需要做任何其他花哨的管理。关于 UIImageView 的开销,我在 imageView 属性中添加了占位符,它需要 UIImageView。这样我就不需要在每个单元格中管理额外的子视图和属性。 正是我所说的。如果您不需要那种额外的灵活性,则不需要制作自己的 UIImageView。所以使用 TableViewCell 的 imageView 是一个更好的选择。

以上是关于如何在 UITableCellView 中设置 imageView 属性以仅显示背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建消息之前在 protobuf 中设置重复字段?

如何使用 AlarmClock 在 android 中设置闹钟的日期

如何在 django 模板中设置自定义 forloop 起点

如何阻止 UILabel 在 UITableCellView 中用“...”截断

如何在 SwiftUI 中设置 ScrollView 的 contentInset

如何在 Vue 中设置 CKfinder 和 CKeditor