1

我有一个使用 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;

但这似乎不起作用,而且我的形状不会改变与任何这些设置相关的大小或位置。

就将其移动到位的功能而言,我是否缺少某些东西?

4

1 回答 1

1

类似的功能contentsGravity是关于图层的contents。形状层contents不是pathpath不受那些东西的影响。我建议您改用转换。或者,不要使用形状图层:只需将您的内容直接绘制到图层中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行,您会发现它确实可以拉伸红色圆角矩形。

当然,您将不得不替换自己的贝塞尔路径;这只是一个示例,向您展示如何将贝塞尔路径的路径直接绘制到图层中。

有关如何直接绘制到图层中的更多信息,请参阅我书中的这一部分:

http://www.aeth.com/iOSBook/ch16.html#_drawing_in_a_layer

有关一般绘图的更多信息,请参阅我的书的绘图章节,从这里开始:

http://www.aeth.com/iOSBook/ch15.html#_paths_and_drawing

于 2013-04-10T22:47:20.577 回答