Я хочу сделать снимок экрана каждый раз, когда пользователь держит экран в течение одной секунды, а затем открывает окно электронной почты, чтобы пользователь мог отправить изображение. Но у меня странная проблема; изображение становится испорченным, если присутствует градиентное изображение (UIImage
, в котором загружен градиент PNG).iOS программно снимает скриншот с изображения
Так что я создал UILongPressGestureRecgnizer
, установить его minimumPressDuration
к 1.0f
и добавили его в главном окне как жест распознаватель: [self.view addGestureRecognizer:myRecognizer]
. Активатор вызывает метод, скажем shareClicked
. В котором я хочу захватить текущий экран и выставить композитор электронной почты с этим изображением в нем. Вот как это делается:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
mailComposer.mailComposeDelegate = self;
[mailComposer setSubject:@"Share feature"];
[mailComposer setMessageBody:[NSString stringWithFormat:@"Im sharing this with you cause its cool."] isHTML:NO];
[mailComposer addAttachmentData:UIImagePNGRepresentation(image) mimeType:@"image/png" fileName:@"image"];
[self presentViewController:mailComposer animated:YES completion:NULL];
НО, есть проблема. На главном экране присутствует табличный вид, а в третьей ячейке есть градиент, о котором я упоминал ранее. Я не знаю, как это объяснить, но его что-то вроде этого:
Как видно на изображении есть градиент сверху и есть еще один немного ниже. Верхняя часть отображается обычным образом, а вторая вызывает странную проблему. Градиент не синий, а белый и прозрачный. Вот изображение градиента на черной поверхности:
Вот снимок экрана с имитатором, как это должно выглядеть:
И, наконец, вот как он визуализируется и отображается в почта композитор:
Что я делаю неправильно? В чем проблема? Его неспособность симулятора вызывать то же самое на мобильном устройстве. Его iOS7, если это имеет значение.
Для того, чтобы быть чистым, верхний градиент является таким же, но радиальным и его отлично отрисовывается. Оба градиента относятся к ячейке tableview. Как это исправить? Надеюсь, мы найдем решение, как я потратил некоторое время на «крафт» этот вопрос :)
Вы можете передать '0' в 'UIGraphicsBeginImageContextWithOptions' иметь его использовать масштаб главного экрана , –
Как вы делаете градиент? Вы рисуете это в коде с помощью CGGradient/CGShading или загружаете изображение, которое вы сделали отдельно? Вы указываете файл PNG; является ли файл действительным стандартным PNG или сорт дробленного PNG, который вам нужно использовать? Проверьте настройки «Сжать PNG-изображения» (или что-то еще называемое) и убедитесь, что он включен. –
Также, ваш взгляд переопределяет 'drawRect:'? Если это так, отредактируйте свой вопрос, чтобы включить его. Если нет, является ли его слой настраиваемым слоем, слоем с делегатом или простым слоем, чье 'содержимое' установлено в другом месте?В любом случае, пожалуйста, отредактируйте свой вопрос, чтобы включить код, который либо вписывается в контекст слоя, либо задает «содержимое» слоя. –