我正在使用此代码向自定义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):
答案 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];