Сделайте снимок представления PKAddPassesViewController.

Я пытаюсь сделать снимок представления, отображаемого, когда пользователю предлагается добавить пропуск.

Цель состоит в том, чтобы сгенерировать изображение из заданного pkpass.

Я надеялся, что что-то вроде этого может работать:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"columbus" ofType:@"pkpass"];
PKPass *pass = [[PKPass alloc] initWithData:[NSData dataWithContentsOfFile:filePath] error:nil];

PKAddPassesViewController *pkAddPassesViewController = [[PKAddPassesViewController alloc] initWithPass:pass];
[self presentViewController:pkAddPassesViewController animated:YES completion:^(){
    UIImage *image = [pkAddPassesViewController.view captureView];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [self.view addSubview:imageView];
}];

С CaptureView:

- (UIImage *)captureView
{
    CGRect screenRect = self.bounds;
    UIGraphicsBeginImageContext(self.bounds.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [[UIColor clearColor] set];
    CGContextFillRect(ctx, screenRect);
    [self.layer renderInContext:ctx];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

Угадай, что? Я ошибался:

Я пытался:

  • Использование обратного вызова завершения и обратного вызова animationFinished

  • Установка скрытого свойства

  • Использование таймера, чтобы убедиться, что пропуск был виден на экране, когда был сделан снимок экрана.

  • Создание снимка родительского представления

У меня закончились идеи, поэтому любое предложение приветствуется. Спасибо заранее.

О, я загрузил здесь минимальный проект: https://github.com/framp/demo-capturing-passbook

РЕДАКТИРОВАТЬ: я могу сделать снимок других представлений, и я могу просто загрузить другой UIImage с помощью приведенного выше кода. UIImage, который возвращается, представляет собой пустое изображение.


person framp    schedule 06.06.2013    source источник
comment
Это одна из тем в моем списке для обсуждения с Apple на следующей неделе. Кажется, есть какая-то аномалия с PKPassViewController. Если я найду, или если они могут показать мне решение, я опубликую здесь.   -  person PassKit    schedule 06.06.2013
comment
Я надеюсь, что это не преднамеренно с их стороны (например, чтобы разработчики не генерировали изображения проходов)   -  person framp    schedule 06.06.2013
comment
Это тоже пришло мне в голову. Я могу вспомнить несколько случаев, когда это может представлять угрозу безопасности, но, в конце концов, я не вижу причин, которые оправдывали бы преднамеренную блокировку.   -  person PassKit    schedule 06.06.2013


Ответы (4)


Попробуйте это, это может сработать для вас.

UIGraphicsBeginImageContext(self.view.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *newImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData=UIImagePNGRepresentation(reportImage);
person Prashant Nikam    schedule 06.06.2013
comment
Спасибо, но это тоже не работает. Кстати, я могу делать снимки других видов. - person framp; 06.06.2013

Код изображения захвата хорош. Попробуйте использовать: [self.view.superview addSubview:imageView]; в блоке завершения вместо [self.view addSubview:imageView];

person samir    schedule 06.06.2013
comment
Спасибо за предложение! К сожалению, UIImage, который я получаю от CaptureView, представляет собой пустое изображение (и загрузка другого UIImage работает). - person framp; 06.06.2013

Вы можете попробовать этот код, если он работает для вас. Дайте координаты, которые вы хотите захватить, и все. Он сохранит ваш файл в альбоме изображений. Это может дать предупреждение, но это работает.

 UIGraphicsBeginImageContext(CGSizeMake(320, 380));
 [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
person Community    schedule 06.06.2013
comment
Спасибо, но viewImage по-прежнему пуст (чего и следовало ожидать, так как код тот же) - person framp; 06.06.2013
comment
откуда вы знаете, что viewImage пуст? - person ; 06.06.2013
comment
если вы используете именно данный код, он должен сохранить изображение в альбоме. Проверьте, сохраняется ли там изображение, и дайте мне знать, пожалуйста. - person ; 06.06.2013
comment
Я попробовал, и он не работает с этим конкретным представлением PKAddPassesViewController. Проблема в другом! - person framp; 06.06.2013

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

person Prateek Prem    schedule 06.06.2013
comment
Пробовал это. Я вставил точку останова перед тем, как сделать снимок, и когда я дошел до точки останова, проход показывался во всей красе. - person framp; 06.06.2013
comment
почему бы вам не попробовать написать код моментального снимка в классе pkAddPassesViewController в методе ViewWillAppear. - person Prateek Prem; 06.06.2013
comment
ViewDidAppear не вызывается. Я также заметил, что если приложение ожидает точки останова, контроллер представления прохода все еще работает и хорошо реагирует. - person framp; 06.06.2013
comment
Теперь пришло время поработать над кодом. не могли бы вы поделиться со мной своим кодом, чтобы я также мог работать с вами над решением этой проблемы. - person Prateek Prem; 06.06.2013
comment
Это на github, я упомянул URL-адрес в конце своего вопроса! - person framp; 07.06.2013