нарисуйте CGPaths в UIView, затем сохраните view как Png

#ios4 #uiimage #drawing

#ios4 #uiimage #рисование

Вопрос:

В функции drawrect UIView я использую CGContext для рисования некоторых фигур. Это работает нормально, я вижу свои фигуры. Теперь я пытаюсь сохранить то, что было нарисовано в представлении, в формате png на диске. Я читал различные документы / статьи, но ничего не сохраняется. Я тестирую симулятор для ios 4.3.

Редактировать 1

Я изменил свой код и раскомментировал контекстную часть. Я могу сохранить png, но он пустой.

 - (void)drawRect:(CGRect)rect
{

    CGContextRef ctx= UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(ctx, 0, 0, 0, .5);
    CGContextBeginPath(ctx);
    CGContextAddPath(ctx, mutatablepath);
    //CGContextStrokePath(ctx);
    CGContextFillPath(ctx);
    CFRelease(mutatablepath);




    NSString *path0;
    NSArray *paths0=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    path0=[[paths0 objectAtIndex:0]stringByAppendingPathComponent:@"images"];
    NSError *error;

    if (![[NSFileManager defaultManager]fileExistsAtPath:path0]) {

        if(![[NSFileManager defaultManager]createDirectoryAtPath:path0 withIntermediateDirectories:NO attributes:nil error:amp;error])

        {
            NSLog(@"Create directory error %@",error);

        }
    }




    UIGraphicsBeginImageContext(self.bounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image=UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    NSData *imagedata=UIImagePNGRepresentation(image);

    NSString *namepath=[NSString stringWithFormat:@"%@.png",@"test"];
    NSString *path;
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    path=[[paths objectAtIndex:0]stringByAppendingPathComponent:@"images"];
    NSString *savepath=[NSString stringWithFormat:@"%@/%@",path,namepath ];


    // NSError 

    NSLog(@"%@",savepath);

    [imagedata writeToFile:savepath atomically:YES];


}
  

Комментарии:

1. Из документации для UIGraphicsGetImageFromCurrentImageContext: вы должны вызывать эту функцию только тогда, когда графический контекст на основе растрового изображения является текущим графическим контекстом. Если текущий контекст равен нулю или не был создан вызовом UIGraphicsBeginImageContext , эта функция возвращает nil .

Ответ №1:

Вы можете сделать это, убрав код сохранения изображения из своего drawRect метода, поскольку renderInContext метод неявно вызывается drawRect по мере необходимости:

 UIView *myView = [[MyViewClass alloc] initWithFrame:CGRectMake(/*...*/)];
UIGraphicsBeginImageContext(myView.bounds.size);
[myView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
  

Источник: http://pastie.org/244916