主要问题是你不能真正填充形状的外部,因为没有通用的方法来定义它的含义。您需要做的是首先在形状的“外部”周围绘制一条路径,然后将圆圈添加为子路径。你如何做到这一点取决于你想使用哪个填充规则。EvenOdd 是最简单的:
CAShapeLayer *myLayer = (CAShapeLayer *) self.layer;
UIBezierPath *testPath = [UIBezierPath bezierPathWithRect:self.bounds];
[testPath appendPath:[UIBezierPath bezierPathWithOvalInRect:(CGRect){{100, 100}, 100, 100}]];
myLayer.fillRule = kCAFillRuleEvenOdd;
myLayer.path = testPath.CGPath;
myLayer.fillColor = [UIColor whiteColor].CGColor;
NonZero 有点困难,因为您必须强制路径为逆时针方向,这对于大多数 UIBezierPath 便捷方法来说不是一个选项:
CAShapeLayer *myLayer = (CAShapeLayer *) self.layer;
UIBezierPath *testPath = [UIBezierPath bezierPathWithRect:self.bounds];
UIBezierPath *counterClockwise = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100) radius:100 startAngle:0 endAngle:M_PI clockwise:NO];
[counterClockwise appendPath:[UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100) radius:100 startAngle:M_PI endAngle:0 clockwise:NO]];
[testPath appendPath:counterClockwise];
myLayer.fillRule = kCAFillRuleNonZero;
myLayer.path = testPath.CGPath;
myLayer.fillColor = [UIColor redColor].CGColor;
根据您构建实际路径的方式,它可能不会产生任何影响。
如果您还没有看过它,缠绕规则文档有一些我觉得很有帮助的漂亮图表。