您基本上只需要构建一个定义要填充的区域的路径(例如使用CGPathAddArc
),将图形上下文剪辑到该路径CGContextClip
,然后绘制您的图像。
drawRect:
以下是您可以在自定义视图中使用的方法示例:
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGFloat progress = 0.7f; //This would be a property of your view
CGFloat innerRadiusRatio = 0.5f; //Adjust as needed
//Construct the path:
CGMutablePathRef path = CGPathCreateMutable();
CGFloat startAngle = -M_PI_2;
CGFloat endAngle = -M_PI_2 + MIN(1.0f, progress) * M_PI * 2;
CGFloat outerRadius = CGRectGetWidth(self.bounds) * 0.5f - 1.0f;
CGFloat innerRadius = outerRadius * innerRadiusRatio;
CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
CGPathAddArc(path, NULL, center.x, center.y, innerRadius, startAngle, endAngle, false);
CGPathAddArc(path, NULL, center.x, center.y, outerRadius, endAngle, startAngle, true);
CGPathCloseSubpath(path);
CGContextAddPath(ctx, path);
CGPathRelease(path);
//Draw the image, clipped to the path:
CGContextSaveGState(ctx);
CGContextClip(ctx);
CGContextDrawImage(ctx, self.bounds, [[UIImage imageNamed:@"RadialProgressFill"] CGImage]);
CGContextRestoreGState(ctx);
}
为了简单起见,我硬编码了一些东西——你显然需要添加一个属性并在 setter 中progress
调用。setNeedsDisplay
这也假设RadialProgressFill
您的项目中有一个命名的图像。
这是一个大致看起来像的示例:
我希望你有一个更好看的背景图像。;)