2014-10-27 87 views
0

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

这就是我目前在对细胞的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渲染。通过使用UIBezierPaths将拐角半径渲染移动到drawRect来解决这个问题,因为它涉及UILabel。我subclassed UIImageView并将我的cornerRadius绘图drawRect只发现drawRect不在UIImageView上调用。以下是文档的相关推理:

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

因此,我将超类更改为UIView,并使用UIBezierPath和UIImage在drawRect中手动绘制圆。这里是我的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

调用-[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]; 
} 
+0

完美。图像遵循贝塞尔路径并在屏幕上进行渲染。将不得不等到明天才能在设备上进行测试,但根据性能分析,这节省了大量时间。 – skladek 2014-10-27 04:41:23

0

你是过于复杂的事情,几年前,我有同样的问题,我解决它是使用编程方式创建的UITableViewCell其中有我在其中使用QuartzCore一个UIView并设置cornerRadius的方式,后来我加了一个UIImageView里面的(UIView),它总是使它超快速,而没有进入UIBeziers的细节。

+0

这是我最初的方法,但它不足够快。这并不可怕,但它不应该像过去那样流畅。 – skladek 2014-10-27 04:37:18

+0

如果这是你的答案,那么我需要问/建议你两件事,首先你的图片(大小和尺寸)有多大,你使用** Xcode的Instruments **调试你的应用程序,并查看内存和CPU使用率,原因我可能会发生这样的情况,大多数情况下,由于可重用的单元或CPU处理**大**图像,内存中的图像臃肿。 – MrJomp 2014-10-27 04:57:18