Подтвердить что ты не робот

Почему мой программно созданный скриншот выглядит так плохо на iOS 7?

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

CGSize imageSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height);
UIGraphicsBeginImageContext(imageSize);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Он отлично работает на iOS 6, но в iOS 7 изображение выглядит очень плохо. Я использовал этот ответ: iOS: какой самый быстрый, самый эффективный способ сделать скриншот программным? для попытки исправить это, и это помогло, но скриншот выглядит плохо. Экран получает другой цвет, а некоторые объекты (например, метки) не отображаются на изображении. Любая помощь?

---- Обновление ----

Мне удалось решить большинство объектов, изменив их на сохранение вместо слабых. Моя главная проблема осталась моей таблицей, показанной как большой белый блок (он должен быть прозрачным, с ярлыками с белым текстом, поэтому все, что мы видим, это белые клетки). Я попытался определить фон таблицы как clearcolor, а не помогает.

---- Последнее обновление ---

Здесь есть замечательные ответы, которые действительно не касаются моей проблемы. Я хотел, чтобы это работало на устройстве, которое работает с iOS7, но без использования iOS7 SDK, так как в этот момент требуется много усилий для переключения SDK проекта, когда проект почти завершен.

В любом случае, я добавил мир кода, который окончательно решил мою проблему:

Это изменение просто решает проблему:

UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0.0f);

вместо:

UIGraphicsBeginImageContext(imageSize);
4b9b3361

Ответ 1

Добавлен новый API с iOS 7, который должен обеспечить эффективный способ получения моментального снимка

  • snapshotViewAfterScreenUpdates: отображает представление в UIView с немодифицируемым content

  • resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets: то же самое, но с изменяемыми размерами вставки

  • drawViewHierarchyInRect:afterScreenUpdates:: то же самое, если вам нужно, чтобы все подъязыки тоже рисовались (например, метки, кнопки...)

Вы можете использовать UIView, возвращенный для любого эффекта пользовательского интерфейса, или визуализировать изображение, подобное тому, которое вы делали, если вам нужно экспортировать.

Я не знаю, насколько хорош этот новый метод VS, который вы предоставили (хотя я помню, что инженеры Apple говорили, что этот новый API был более эффективным)

Ответ 2

вы можете попробовать это

- (UIImage *) screenshot {
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale);

    [self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

Ответ 3

в iOS 8: вот как я делаю, чтобы получить ScreenShot

  • просто добавил один UIImageView и метод для снятия скриншотов в файле .h

@property (слабый, неатомный) IBOutlet UIImageView * imageView;

 -(IBAction)takeSnapShot:(id)sender;

2 добавлен снимок кода для снятия снимка экрана и установлен на UIImageView в .m файле

- (IBAction)takeSnapShot:(id)sender
{
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *snapShotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    imageView.image = snapShotImage;
}
  1. Ниже представлен результат, который я получил.

enter image description here

Ответ 4

На iOS7 у вас могут быть сбои, если вы используете

[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]

во время текущей анимации. Установите afterScreenUpdates = NO, чтобы избавиться от сбоев.

Ответ 5

Убедитесь, что для параметра opaque установлено значение NO