我有一个使用PocketSVG从SVG文件制作的UIBezierPath。
我想将我的UIBezierPath包含在CGShapeLayer中,并使用以下代码:
self.centerIconShapeLayer = [CAShapeLayer layer];
self.centerIconShapeLayer.frame = CGRectMake(5, 8, self.frame.size.width - 10, self.frame.size.height - 16);
self.centerIconShapeLayer.fillColor = [[UIColor redColor] CGColor];
self.centerIconShapeLayer.contentsRect = CGRectMake(600, 0, 100, 100);
self.centerIconShapeLayer.contentsGravity = kCAGravityCenter;
[self.layer addSublayer:self.centerIconShapeLayer];
self.centerIconShapeLayer.path = myBezierPath.CGPath;
这似乎不起作用,我的形状不会改变任何这些设置的大小或位置。
是否有一些我缺少的东西,在功能方面将其移动到位?
答案 0 :(得分:1)
contentsGravity
等功能与图层的contents
有关。形状图层的contents
不其path
; path
不受这些内容的约束。我建议你使用转换。或者,不要使用形状图层:只需将内容直接绘制到图层contents
中(如果您需要有关如何操作的详细信息,请与我们联系。)
此外,您使用contentsRect
错误。它不是以点数来衡量的,而是按比例来衡量的(每个点坐标都在0到1之间 - 好吧,它比这更复杂,但这是基本的想法)。
我试过的例子,只是为了让你开始(这是在一个视图控制器中,你将不得不调整我在这里做的一切!):
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.centerIconShapeLayer = [CALayer layer]; // ordinary layer
self.centerIconShapeLayer.frame =
CGRectMake(5, 8, self.view.frame.size.width - 10, self.view.frame.size.height - 16);
self.centerIconShapeLayer.delegate = self;
[self.view.layer addSublayer:self.centerIconShapeLayer];
// self.centerIconShapeLayer.contentsRect = CGRectMake(0, 0, 0.3, 0.3);
[self.centerIconShapeLayer setNeedsDisplay];
}
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
UIBezierPath* myBezierPath =
[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0,0,100,100) cornerRadius:20];
CGContextAddPath(ctx,myBezierPath.CGPath);
CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);
CGContextFillPath(ctx);
}
运行它,你会看到红色圆角矩形。现在取消注释contentsRect
行,您将看到它确实可以拉伸红色圆角矩形。
当然,你必须用你自己的bezier路径来代替;这只是一个示例,向您展示如何将贝塞尔路径的路径直接绘制到图层中。
有关如何直接绘制图层的更多信息,请参阅本书的这一部分:
http://www.apeth.com/iOSBook/ch16.html#_drawing_in_a_layer
有关绘制到上下文中的更多信息,请参阅本书的“绘图”一章,从这里开始: