在我的应用程序中,我在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。这意味着将对象设置为蒙版不起作用。
有没有办法将图像屏蔽到路径而不在屏幕外渲染?
答案 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。