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

时间:2014-10-27 03:30:19

标签: ios objective-c uiimageview core-graphics drawrect

在我的应用程序中,我在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 Session 121视频,了解UIKit渲染。这涵盖了这个问题,因为它通过使用UIBezierPaths将角半径渲染移动到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。这意味着将对象设置为蒙版不起作用。

有没有办法将图像屏蔽到路径而不在屏幕外渲染?

2 个答案:

答案 0 :(得分:2)

调用-[UIBezierPath addClip]将后续绘图剪辑到路径内部。

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

答案 1 :(得分:0)

你是过于复杂的事情,几年前我有同样的问题,我解决它的方式是使用编程创建的UITableViewCell,其中有一个UIView我在其中使用QuartzCore并设置了cornerRadius,之后我在其中添加了一个UIImageView (UIView)它总是让它超级快,而不需要详细了解UIBeziers。