CALayer画在rect之外

时间:2015-05-12 09:44:18

标签: ios

我正在使用此代码向自定义UIView添加图层,它就像魅力一样:

 CGRect newrect = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
    CALayer* heartBackground = [CALayer layer];
    heartBackground.contents = (__bridge id)([UIImage imageNamed:@"5HeartsGray"].CGImage);
    heartBackground.frame = newrect;
    [self.layer addSublayer:heartBackground];

但是当我尝试在使用Quartz的draw方法中使用它时使用新的Rect(像这样)

        CGContextSaveGState(context);
    CGRect ratingRect = CGRectMake(250, 100, 150, 20);

    CALayer* heartBackground = [CALayer layer];
    heartBackground.contents = (__bridge id)([UIImage imageNamed:@"5HeartsGray"].CGImage);
    heartBackground.frame = ratingRect;
    [heartBackground renderInContext:context];
    CGContextRestoreGState(context);

它在帧的开头呈现,而不是在ratingRect内。

如果我致电[heartBackground setNeedsDisplay],它就会消失。与heartBackground.masksToBounds = YES

相同

我做错了什么。我是否需要切换到CGLayer,因为我使用的是CoreGraphics?

这是使用CoreGraphics时的输出(如您所见,心脏从坐标x = 0开始,y = 0,通常从x = 250开始,y = 100): enter image description here

1 个答案:

答案 0 :(得分:0)

创建和绘制CALayer的{​​{1}}内部绘制函数没有意义。 UIView是一个可独立绘制的单元,默认情况下它会在其parentLayer的上下文中绘制。这意味着如果您真的想要使用单独的CALayers,请尝试根据需要向self.layer(在CALayer内)添加尽可能多的子层,设置它们的帧,并在它们的容器视图显示时绘制它们。关于你的问题,这是你可以尝试的。

选项1:获取此代码

UIView

CGRect ratingRect = CGRectMake(250, 100, 150, 20); CALayer* heartBackground = [CALayer layer]; heartBackground.contents = (__bridge id)([UIImage imageNamed:@"5HeartsGray"].CGImage); heartBackground.frame = ratingRect; [self.layer addSubLayer:heartBackground]; 方法之外,将其写在drawRect:和drawRect中,只需执行initWithFrame:

选项2:在没有CALayer的情况下画出你的心。

[heartBackground renderInContext:UIGraphicsGetCurrentContext];