是否可以使用CGContext绘制图形并将它们保存到NSMutableArray中?

时间:2012-06-04 08:05:34

标签: objective-c ios nsmutablearray cgcontext cgcontextdrawimage

首先我绘制图形:

    -(void)drawRect: (CGRect)rect{  

        //Circle
    circle = UIGraphicsGetCurrentContext();  
    CGContextSetFillColorWithColor(circle, [UIColor darkGrayColor].CGColor);
    CGContextFillRect(circle,CGRectMake(10,10, 50, 50));

        //rectangle
    rectangle = UIGraphicsGetCurrentContext();  
    CGContextSetFillColorWithColor(rectangle, [UIColor darkGrayColor].CGColor);
    CGContextFillRect(rectangle, CGRectMake(10, 10, 50, 50));

        //square 
    square = UIGraphicsGetCurrentContext();  
    CGContextSetFillColorWithColor(square, [UIColor darkGrayColor].CGColor);
    CGContextFillRect(square, CGRectMake(100, 100, 25, 25));

        //triangle  
    triangle = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(triangle, [UIColor darkGrayColor].CGColor);
    CGPoint points[6] = { CGPointMake(100, 200), CGPointMake(150, 250),
                              CGPointMake(150, 250), CGPointMake(50, 250),
                              CGPointMake(50, 250), CGPointMake(100, 200) };
    CGContextStrokeLineSegments(triangle, points, 6);

    }

现在我想把图形放到一个数组中:

-(void)viewDidLoad {

grafics = [[NSMutableArray alloc]initWithObjects: circle,rectangle,square,triangle];
[self.navigationItem.title = @"Shape"];
[super viewDidLoad];
}

问题是,我必须进行转换,从而使对象适合此数组。另一个问题是UITableViewController没有将数组加载到行中。 tableview没有任何问题,但处理CGContext失败了。我做错了什么?

2 个答案:

答案 0 :(得分:4)

drawRect:UIView上用于绘制视图本身的方法,而不是预先创建图形对象。

由于您似乎想要创建形状来存储它们并稍后绘制,因此将形状创建为UIImage并使用UIImageView绘制它们似乎是合理的。 UIImage可以直接存储在NSArray

要创建图像,请执行以下操作(在主队列中;而不是在drawRect:中):

1)创建位图上下文

UIGraphicsBeginImageContextWithOptions(size, opaque, scale);

2)获取上下文

CGContextRef context = UIGraphicsGetCurrentContext();

3)画出你需要的东西

4)将上下文导出为图像

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

5)破坏上下文

UIGraphicsEndImageContext();

6)存储对图像的引用

[yourArray addObject:image];

对要创建的每个形状重复。

有关详细信息,请参阅documentation以了解上述功能。为了更好地理解绘制drawRect:和程序中任意位置之间的差异以及一般情况下的上下文,我建议您阅读Quartz2D Programming Guide,尤其是关于图形上下文的部分。

答案 1 :(得分:2)

首先,UIGraphicsGetCurrentContext返回CGContextRef,它不是一个对象,不能直接存储在一个集合中(编辑:这不是真的,请参阅注释) 。从技术上讲,您可以将上下文包装在NSValue中或将其转换为UIImage

CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage *img = [UIImage imageWithCGImage:imageRef];

生成的UIImage是一个对象,可以很好地存储在集合中。 代码示例在大局中没有意义。 -drawRect:方法用于绘制组件,而不是创建一些稍后要使用的图形。 -viewDidLoadUIViewController方法,而不是UIView方法。你可以编辑问题并描述你想要做什么吗?