[iOS]Как сделать снимок текущего состояния представления

Мне нужно сделать снимок или снимок экрана — назовите его как хотите — текущего представления, а затем отобразить его в модальном представлении.

Потому что, если я просто напишу это в контроллере представления ModalView

MyAppViewController *viewController = [[MyAppViewController alloc] init];
self.view = viewController.view;

Все методы MyAppViewController тоже вызываются, но мне это не нужно, нужно просто "сохранить" все, что было на экране при появлении ModalView и показать это в представлении ModalView.

Как мне это сделать? Заранее спасибо!


person Knodel    schedule 14.09.2010    source источник
comment
Я не уверен, что это означает: также вызываются все методы MyAppViewController. Ответ, который кажется мне слишком очевидным, состоял бы в том, чтобы просто создать новый класс только с теми элементами, которые вам нужны. Хотя, конечно, я недостаточно хорошо понимаю проблему.   -  person Jeremy Goodell    schedule 14.09.2010
comment
Мое приложение — это игра. И когда пользователь нажимает определенную кнопку, появляется Modal View Controller, и ему необходимо отображать представление игры в состоянии, которое было непосредственно перед нажатием кнопки. Так что монстры, которые были убиты, должны быть мертвы и т. д. Но если я использую код из первого поста, все выглядит так, как будто игра только началась.   -  person Knodel    schedule 14.09.2010
comment
вам нужен скриншот плоского изображения или вы хотите сохранить текущий статус игры.   -  person Bongeh    schedule 14.09.2010


Ответы (2)


Я бы предложил сделать это:

Имейте метод, который создает изображение из содержимого представления.

-(UIImage*) makeImage {

UIGraphicsBeginImageContext(self.view.bounds.size);

[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return viewImage;
}

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

- (id)initWithImage:(UIImage *)temp {
   myImage = temp;
}

Затем в вашем modalView, возможно, в методе viewDidLoad создайте UIImageView и установите изображение в myImage

Надеюсь, это достигнет того, что вы пытаетесь сделать.

person Bongeh    schedule 14.09.2010
comment
Да! Это именно то, что мне нужно! Большое спасибо! - person Knodel; 14.09.2010
comment
На дисплее сетчатки использование UIGraphicsBeginImageContext создает контекст с коэффициентом масштабирования 1,0, что приводит к изображениям с низким разрешением. Используйте UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, YES, 0.0), чтобы автоматически получить правильный коэффициент масштабирования. - person Imre Kelényi; 19.12.2012
comment
Вы захотите добавить структуру QuartzCore в Build Phases и #import <QuartzCore/QuartzCore.h> в файле, где вы обращаетесь к слою представления. - person bshirley; 08.01.2013
comment
Важно, как говорит Имре Келени, использовать UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, YES, 0.0) для сетчатки. - person Tomasz; 29.04.2013

В iOS 7 вы можете использовать один из новых методов в UIView для создания снимков, например:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates;

который возвращает UIView, который затем можно добавить в качестве подвида.

person g_fred    schedule 04.10.2013