Это отличное решение, но вы можете столкнуться с неожиданными проблемами, если вы создаете категорию на CAShapeLayer, где у вас не сразу открывается вид.
См. Установка правильного кадра вновь созданного CAShapeLayer
Нижняя линия, получить границы пути, затем установить рамку маски градиента, используя границы пути, и перевести, если необходимо,Хорошо, что при использовании границ пути, а не любого другого кадра, градиент будет соответствовать только границам пути (при условии, что это то, что вы хотите).
// Category on CAShapeLayer
CGRect pathBounds = CGPathGetBoundingBox(self.path);
CAShapeLayer *gradientMask = [CAShapeLayer layer];
gradientMask.fillColor = [[UIColor blackColor] CGColor];
gradientMask.frame = CGRectMake(0, 0, pathBounds.size.width, pathBounds.size.height);
gradientMask.path = self.path;
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.startPoint = CGPointMake(0.5,1.0);
gradientLayer.endPoint = CGPointMake(0.5,0.0);
gradientLayer.frame = CGRectMake(0, 0, pathBounds.size.width, pathBounds.size.height);
NSMutableArray *colors = [NSMutableArray array];
for (int i = 0; i < 10; i++) {
[colors addObject:(id)[[UIColor colorWithHue:(0.1 * i) saturation:1 brightness:.8 alpha:1] CGColor]];
}
gradientLayer.colors = colors;
[gradientLayer setMask:gradientMask];
[self addSublayer:gradientLayer];