Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将UIImage绘制为圆形而不进行屏幕外渲染_Ios_Objective C_Uiimageview_Core Graphics_Drawrect - Fatal编程技术网

Ios 将UIImage绘制为圆形而不进行屏幕外渲染

Ios 将UIImage绘制为圆形而不进行屏幕外渲染,ios,objective-c,uiimageview,core-graphics,drawrect,Ios,Objective C,Uiimageview,Core Graphics,Drawrect,在我的应用程序中,我在UITableViewCell中有一个UIImageView。图像需要显示为圆形图像和矩形源图像。我一直在设置imageView的层属性的角半径,但这会强制进行屏幕外渲染,这会降低滚动的性能 以下是我目前在单元格上的awakeFromNib方法中的内容: - (void)awakeFromNib { [super awakeFromNib]; self.imageBorderView.backgroundColor = [UIColor colorWith

在我的应用程序中,我在UITableViewCell中有一个UIImageView。图像需要显示为圆形图像和矩形源图像。我一直在设置imageView的层属性的角半径,但这会强制进行屏幕外渲染,这会降低滚动的性能

以下是我目前在单元格上的awakeFromNib方法中的内容:

- (void)awakeFromNib
{
    [super awakeFromNib];

    self.imageBorderView.backgroundColor = [UIColor colorWithWhite:0.75f alpha:1.f];
    self.imageBorderView.layer.cornerRadius = self.imageBorderView.frame.size.width / 2;
}
非常基本的东西。好的,我刚刚看了2011年WWDC第121届会议的视频,了解UIKit渲染。通过使用UIBezierPath将角半径渲染移动到drawRect,解决了与UILabel相关的此问题。我将UIImageView子类化,并将cornerRadius图形移动到drawRect,结果发现在UIImageView上没有调用drawRect。以下是文档中的相关推理:

UIImageView类经过优化,可以将其图像绘制到显示器上。UIImageView不调用其子类的drawRect:方法。如果子类需要包含自定义图形代码,则应改为对UIView类进行子类化

因此,我将超类更改为UIView,并使用UIBezierPath和drawRect中的UIImage手动绘制一个圆。以下是我的drawRect方法:

- (void)drawRect:(CGRect)rect
{
    UIBezierPath *circularPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:self.bounds.size.height / 2.0];
    [[UIColor redColor] set];
    [circularPath fill];

    if (self.image)
    {
        [self.image drawInRect:self.bounds];
    }
}
它做的正是我所期望的,它画了一个红色的圆圈(只是一个正常的检查,以确保路径是正确的),然后它在圆圈上画了一个矩形图像(如果已经设置了)

我搞不懂的是如何将UIImage裁剪为圆形UIBezierPath而不在屏幕外绘制。这意味着将对象设置为遮罩不起作用

有没有一种方法可以在不进行屏幕外渲染的情况下将图像遮罩到路径?

调用以将后续图形剪裁到路径内部

- (void)drawRect:(CGRect)rect
{
    UIBezierPath *circularPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:self.bounds.size.height / 2.0];
    [circularPath addClip];
    [self.image drawInRect:self.bounds];
}

你把事情搞得太复杂了,几年前我也遇到了同样的问题,我解决这个问题的方法是使用一个编程创建的UITableViewCell,它有一个UIView,我在其中使用QuartzCore并设置了cornerRadius,之后我在其中添加了一个UIImageView(UIView)而且它总是以极快的速度渲染,而没有深入到UIBeziers的很多细节。

这是我最初的方法,但渲染速度不够快。这并不可怕,但它并不像它应该的那样光滑。如果这是你的答案,那么我需要问/建议你两件事,首先,你的图像有多大(大小和尺寸),你有没有使用Xcode的仪器调试过你的应用程序,并查看内存和CPU使用情况,由于可重复使用的单元或cpu处理大图像,大多数时候内存都会因图像的进出而膨胀。太好了。图像遵循贝塞尔路径,并在屏幕上进行渲染。将不得不等到明天在设备上进行测试,但根据分析,这节省了大量时间。