gpt4 book ai didi

ios - 如何在 drawRect 中的部分 UIImage 上添加 alpha 层?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:19:22 25 4
gpt4 key购买 nike

我对实现自定义 drawRect 方法(和 Core Graphics)完全陌生,但这样做是为了提高我的 UITableView 的滚动性能。如果我在做任何愚蠢的事情,请告诉我。

在我的单元格中,我有一个 UIImage,我想在它的底部打印图像的标题。但是,为了无论图像如何都能清楚地显示标题文本,我希望在 UIImage 顶部和标题文本下方有一个不透明度为 ~75% 的黑色矩形。

我尝试了以下方法

[self.picture drawAtPoint:point];

[[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.75] setFill];
UIRectFill(CGRectMake(rect));

但是生成的填充实际上吞噬了 UIImage(抱歉,我的描述不佳),略微透明的填充下方显示的部分是我的 UITableView 的背景...

我想我可以为矩形制作另一个图像,然后将其绘制在 self.picture 的顶部但我想知道这是否是一种更简单的使用方式 UIRectFill为了实现这一目标......

如前所述,我是 Core Graphics 的新手,所以任何提示都将不胜感激。提前致谢!


此外,我还有第二个问题...下载图像的尺寸(以像素为单位)是它适合的矩形尺寸(以点为单位)的两倍,以考虑视网膜显示。但是,它现在正在越过那个矩形,即使在 iPhone4 设备上也是如此……我该如何解决这个问题(也包括 iPhone4 之前的设备?)

最佳答案

我没有做太多自定义 drawRect 的事情,所以我会把这部分问题留给其他人,但通常通过将昂贵的计算转移到 tableview 性能问题更容易解决一个后台队列,然后在后台操作完成后从主队列异步更新单元格。因此,类似于:

首先,为tableview定义一个操作队列属性:

@property (nonatomic, strong) NSOperationQueue *queue;

然后在viewDidLoad中,初始化这个:

self.queue = [[NSOperationQueue alloc] init];
self.queue.maxConcurrentOperationQueue = 4;

然后在 cellForRowAtIndexPath 中,您可以:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"MyCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

// Do the quick, computationally inexpensive stuff first, stuff here.
// Examples might include setting the labels adding/setting various controls
// using any images that you might already have cached, clearing any of the
// image stuff you might be recalculating in the background queue in case you're
// dealing with a dequeued cell, etc.

// Now send the slower stuff to the background queue.

[self.queue addOperationWithBlock:^{

// Do the slower stuff (like complex image processing) here.
// If you're doing caching, update the cache here, too.

// When done with the slow stuff, send the UI update back
// to the main queue...

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

// see if the cell is still visible, and if so ...

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell)
{
// now update the UI back in the main queue
}
}];

}];

return cell;
}

您可以通过确保将计算量大的内容的结果缓存到 NSCache 之类的东西中来进一步优化它,也许还可以缓存到 Documents 或其他地方,因此您可以优化必须完成复杂工作的频率并真正优化 UI。

顺便说一下,当你这样做时,你现在可以只拥有你的 UILabel(backgroundColor 使用那个 UIColor 来表示黑色0.75 alpha) 在 UIImageView 之上,iOS 会为您处理。越简单越好。

关于图像分辨率的最后一个问题,您可以:

  • 使用 View 的 contentScaleFactor 确定您是否正在处理视网膜并相应地调整缩略图的大小;或
  • 只需使用 UIViewContentModeScaleAspectFill 的 imageview 的 contentMode,这将确保您的缩略图正确呈现,无论...如果您使用的是小缩略图(即使是 2x图像),性能通常很好。

关于ios - 如何在 drawRect 中的部分 UIImage 上添加 alpha 层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12824951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com