Рисунок 2 UIImage объединен с различными UILabel

Я пытался создать for цикл, который принимает UILabel.text и объединить его в UIImage затем сохранить его в экземпляр, а затем при получении в for Повторяйте цикл во второй раз, чтобы сохранить результат в другом экземпляре.

Проблема, с которой я сталкиваюсь, - это сохранение первого UIImage но с низким качеством и пропуском второго. Я даже пытался сделать UIImage сохранение кода в действии кнопки, но все равно не сработало.

-(void)CreateTheImage{

    UIImage * img = [UIImage imageNamed:@"SquareBackground.jpg"];

    UIGraphicsBeginImageContext(_imgView.bounds.size);
    int Counter = 0;

    for (UIView * view in [_imgView subviews]){
        [view removeFromSuperview];
    }

    NSString *txt1 = @"Test";
    NSString *txt2 = @"Worked Well";

    [array addObject:txt1];
    [array addObject:txt2];
    UILabel *lbl = [[UILabel alloc]init];

    NSLog(@"%i",[array count]);
    NSLog(@"Before the loop");

    for (int x = 0; x < [array count]; x++) {

        NSLog(@"Entered the loop");
        NSLog(@"x = %i",x);

        lbl.text = [array objectAtIndex:x];
        NSLog(@"lbl.text = %@",[array objectAtIndex:x]);

        lbl.textAlignment = NSTextAlignmentCenter;
        [lbl setBackgroundColor:[UIColor clearColor]];
        lbl.font = [UIFont boldSystemFontOfSize:16];
        [lbl setFrame:CGRectMake(20,112.5, 260, 75)];

        [_imgView addSubview:lbl];
        [_imgView bringSubviewToFront:lbl];
        [_imgView setImage:img];
        [_imgView.layer renderInContext:UIGraphicsGetCurrentContext()];

        Counter = x+1;
        NSLog(@"counter = %i",Counter);
        switch (Counter) {
            case 1:

                NSLog(@"swintch case 1");
                newImage1 = UIGraphicsGetImageFromCurrentImageContext();

                break;

            case 2:

                NSLog(@"swintch case 2");
                newImage2 = UIGraphicsGetImageFromCurrentImageContext();

                break;

        default:
            break;
        }

        NSLog(@"after switch");

        UIGraphicsEndImageContext();


    }

    //To save the picture in the album
    UIImageWriteToSavedPhotosAlbum(newImage1, nil, nil, nil);
    UIImageWriteToSavedPhotosAlbum(newImage2, nil, nil, nil);

    NSLog(@"After the loop");



}

Кроме того, когда я запускаю этот метод на моем iPhone, он дает мне предупреждение, которое

Создание видео [334]: CGContextSaveGState: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​предстоящем обновлении.

2 ответа

Решение

Спасибо Duncan C за помощь в поиске ответа и исправлении кода для идеальной работы

-(void)CreateTheImage{

    UIImage * img = [UIImage imageNamed:@"SquareBackground.jpg"];

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(320, 320), NO, 0.0f);

    int Counter = 0;


    NSString *txt1 = @"Test";
    NSString *txt2 = @"Worked Well";

    [array addObject:txt1];
    [array addObject:txt2];
    UILabel *lbl = [[UILabel alloc]init];

    NSLog(@"%i",[array count]);
    NSLog(@"Before the loop");

    for (int x = 0; x < [array count]; x++) {

        for (UIView * view in [_imgView subviews]){
            [view removeFromSuperview];
        }

        NSLog(@"Entered the loop");
        NSLog(@"x = %i",x);

        lbl.text = [array objectAtIndex:x];
        NSLog(@"lbl.text = %@",[array objectAtIndex:x]);

        lbl.textAlignment = NSTextAlignmentCenter;
        [lbl setBackgroundColor:[UIColor clearColor]];
        lbl.font = [UIFont boldSystemFontOfSize:25];
        [lbl setFrame:CGRectMake(20,122.5, 280, 75)];

        [_imgView addSubview:lbl];
        [_imgView bringSubviewToFront:lbl];
        [_imgView setImage:img];
        [_imgView.layer renderInContext:UIGraphicsGetCurrentContext()];


        Counter = x+1;
        NSLog(@"counter = %i",Counter);


        switch (Counter) {
            case 1:

                newImage1 = UIGraphicsGetImageFromCurrentImageContext();
                NSLog(@"swintch case 1");

                break;

            case 2:

                NSLog(@"swintch case 2");
                newImage2 = UIGraphicsGetImageFromCurrentImageContext();

                break;

            default:
                break;
        }

        NSLog(@"after switch");



    }

    UIGraphicsEndImageContext();

    //To save the picture in the album
    UIImageWriteToSavedPhotosAlbum(newImage1, nil, nil, nil);
    UIImageWriteToSavedPhotosAlbum(newImage2, nil, nil, nil);

    NSLog(@"After the loop");



}

Ваш код не имеет смысла. У вас есть цикл for, который проходит через массив, добавляет изображения в представление изображений, захватывает 1 из 2 изображений из текущего контекста вне экрана, а затем завершает контекст изображения после первого прохода через массив. На втором проходе контекст больше не существует, поэтому вызов второго контекста завершится неудачей.

Переместите конечный контекст за пределы цикла for. Это должно исправить ваше предупреждение.

Даже тогда я не уверен, будет ли это работать для удаления подпредставлений из представления изображений, добавления новых представлений, рендеринга содержимого в графический контекст, и все это без возврата. Рисование вида UIKit обычно помещает в очередь изменения в пользовательском интерфейсе до тех пор, пока ваш код не вернется, а затем визуализирует его при следующем прохождении цикла событий.

Другие вопросы по тегам