我想在同一个for
循环中向两个单独的CGLayer绘制对象,但我不确定如何执行此操作。
例如,我想绘制三个橙色圆圈在三个蓝色圆圈后面,橙色圆圈在一个图层中,蓝色圆圈在另一个图层中。以下代码将每个圆圈放在上一个圆圈的顶部:
-(void) drawRect:(CGRect)rect {
UIBezierPath *circle;
for (int i = 1; i <= 3; i++) {
// Create an orange circle
circle = [UIBezierPath bezierPathWithOvalInRect:CGRectInset(CGRectMake(i*50, 80, 50, 50), 0, 0)];
circle.lineWidth = 4.0f;
[[UIColor colorWithRed:1.0 green:0.75 blue:0 alpha:1.0] setFill];
[[UIColor orangeColor] setStroke];
[circle stroke];
[circle fill];
// Create a blue circle
circle = [UIBezierPath bezierPathWithOvalInRect:CGRectInset(CGRectMake(25 + i*50, 80, 50, 50), 0, 0)];
circle.lineWidth = 4.0f;
[[UIColor colorWithRed:0 green:0.5 blue:1.0 alpha:1.0] setFill];
[[UIColor blueColor] setStroke];
[circle stroke];
[circle fill];
}
}
如何修改此设置,以便三个橙色圆圈最终位于orangeLayer
中位于blueLayer
的三个蓝色圆圈后面的for
?我想这与保存和恢复上下文有关,但我无法真正地围绕它。
非常感谢!
PS:我意识到我可以简单地使用两个{{1}}循环内联来实现正确的效果,但这个例子是出于教学目的而学习分层的。谢谢!的
答案 0 :(得分:0)
我构建了一个UIView的自定义子类,并创建了一个函数makeCircleWithFrame,使用UIGraphicsBeginImageContextWithOptions在视图中绘制一个圆圈,我相信它将解决您的主要问题:
#import "circleView.h"
#import <math.h>
@implementation circleView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (!self) return self;
[self setupViews];
return self;
}
- (void)awakeFromNib
{
[self setupViews];
}
- (void)setupViews
{
[self setBackgroundColor:[UIColor whiteColor]];
for (int i = 1; i <= 6; i++) {
UIColor *circleColor;
//Math function just to set different colors for each circle
if (fmodf(i, 2) == 0) {
circleColor = [UIColor colorWithRed:1.0 green:0.75 blue:0 alpha:1.0];
}
else {
circleColor = [UIColor colorWithRed:0 green:0.5 blue:1.0 alpha:1.0];
}
UIView *circleView = [self makeCircleWithFrame:(CGRectMake(10*i, 10*i, 100, 100)) andFillColor:circleColor];
circleView.tag = i;
NSLog(@"circle %i", i);
}
}
- (UIView *)makeCircleWithFrame:(CGRect)rect andFillColor:(UIColor *)color {
// declare UIimageView, not UIView
UIImageView *customView = [[UIImageView alloc] init];
customView.frame= self.bounds;
// create a new contex to draw
UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, 0);
UIBezierPath *grayCircle = [UIBezierPath bezierPathWithOvalInRect:rect];
grayCircle.lineWidth = 6;
[color setFill];
[[UIColor orangeColor] setStroke];
[grayCircle stroke];
[grayCircle fill];
customView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self addSubview:customView];
return customView;
}
如果您仍然遇到问题或需要帮助,请给我反馈。
答案 1 :(得分:0)
为此目的,您需要部分绘制蓝色或橙色圆圈(取决于您想要位于顶部的那个)。您可能理解只有两种可能的选择:a)橙色层位于顶部2)蓝色层位于顶部2。我想,如果你想按颜色对圆圈进行分组(每个圆圈不使用1层),你最好: 1)使用1层进行绘图 2)在某处存储Bezier路径(代表圆圈) 3)按照顺序绘制路径并覆盖你需要的路径。