0

起初我绘制图形:

    -(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 失败。我做错了什么?

4

2 回答 2

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];

对您要创建的每个形状重复此操作。

有关详细信息,请参阅上述功能的文档。为了更好地理解drawRect:在程序中任意位置绘图和使用上下文之间的区别,我建议你阅读Quartz2D 编程指南,尤其是图形上下文部分。

于 2012-06-04T09:03:43.713 回答
2

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

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

结果UIImage是一个对象,可以很好地存储在集合中。但是代码示例在大局中没有意义。该-drawRect:方法旨在绘制您的组件,而不是创建一些稍后使用的图形。并且-viewDidLoad是一种UIViewController方法,而不是一种方法UIView。您能否编辑问题并描述您要做什么?

于 2012-06-04T08:23:26.340 回答