2013-09-07 3 views
1

Я хочу сделать снимок экрана каждый раз, когда пользователь держит экран в течение одной секунды, а затем открывает окно электронной почты, чтобы пользователь мог отправить изображение. Но у меня странная проблема; изображение становится испорченным, если присутствует градиентное изображение (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]; 

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

enter image description here

Как видно на изображении есть градиент сверху и есть еще один немного ниже. Верхняя часть отображается обычным образом, а вторая вызывает странную проблему. Градиент не синий, а белый и прозрачный. Вот изображение градиента на черной поверхности: enter image description here

Вот снимок экрана с имитатором, как это должно выглядеть:

enter image description here

И, наконец, вот как он визуализируется и отображается в почта композитор:

enter image description here

Что я делаю неправильно? В чем проблема? Его неспособность симулятора вызывать то же самое на мобильном устройстве. Его iOS7, если это имеет значение.

Для того, чтобы быть чистым, верхний градиент является таким же, но радиальным и его отлично отрисовывается. Оба градиента относятся к ячейке tableview. Как это исправить? Надеюсь, мы найдем решение, как я потратил некоторое время на «крафт» этот вопрос :)

+0

Вы можете передать '0' в 'UIGraphicsBeginImageContextWithOptions' иметь его использовать масштаб главного экрана , –

+0

Как вы делаете градиент? Вы рисуете это в коде с помощью CGGradient/CGShading или загружаете изображение, которое вы сделали отдельно? Вы указываете файл PNG; является ли файл действительным стандартным PNG или сорт дробленного PNG, который вам нужно использовать? Проверьте настройки «Сжать PNG-изображения» (или что-то еще называемое) и убедитесь, что он включен. –

+0

Также, ваш взгляд переопределяет 'drawRect:'? Если это так, отредактируйте свой вопрос, чтобы включить его. Если нет, является ли его слой настраиваемым слоем, слоем с делегатом или простым слоем, чье 'содержимое' установлено в другом месте?В любом случае, пожалуйста, отредактируйте свой вопрос, чтобы включить код, который либо вписывается в контекст слоя, либо задает «содержимое» слоя. –

ответ

-2

я искал немного и нашел это:

-(UIImage *) screenshot { 
    CGImageRef UIGetScreenImage(void); 
    CGImageRef screen = UIGetScreenImage(); 
    UIImage* screenImage = [UIImage imageWithCGImage:screen]; 
    CGImageRelease(screen); 
    return screenImage; 
} 

И сохранить его в камеру ролл:

UIImageWriteToSavedPhotosAlbum([self screenshot], nil, nil, nil); 
+5

UIGetScreenImage() устарел, и Apple отклоняет приложения, использующие эту функцию, и отклоняет их. –

Смежные вопросы