|
Июн
08
|
iPhone / iPod touch позволяет создавать “скриншоты”, сохраняя как изображение содержимое экрана. Многие пользователи даже не догадываются, но для этого достаточно одновременно нажать кнопки home и power. При работе с каталогом Camera Roll или сихронизации фотографий с компьютером каждый скриншот представляет собой изображение 320×480 пикселей.
В этом уроке я расскажу, как с помощью Quartz получать снимки экрана произвольного размера. Под произвольным размером подразумевается возможность сохранять не только часть экрана, но и представление целиком (а не только видимую часть), даже если его размеры превышают 320×480 пикселей.
Для начала к проекту нужно будет добавить фреймворк QuartzCore. Все фреймворки можно найти по следующей ссылке:/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/ iPhoneOSxxx.sdk/System/Library/Frameworks
Выделенная полужирным часть для каждого пользователя будет разной (в моем случае это iPhoneOS2.2.sdk). Кстати, попасть в папку “Frameworks” можно гораздо проще.

Как видим, в Xcode достаточно щелкнуть на любом фреймворке, удерживая нажатой клавишу <Ctrl> (или воспользоваться правой кнопкой мыши), и в “Finder” выбрать команду “Reveal“.

Непосредственно в “Finder” перетащите “QuartzCore.framework” в относящуюся к проекту папку “Frameworks“. Скопировать объект или просто установить с ним связь — решать вам. После добавления фреймворка в класс, который будет отвечать за скриншоты, необходимо вставить строку для импорта части данного фреймворка.
1 | #import <QuartzCore/QuartzCore.h> |
Строку добавляйте на свое усмотрение — в заголовочный файл (.h) или в файл реализации (.m).
Пришло время заняться выполняющим скриншоты методом, а заодно объяснить, как он работает.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | -(void)saveToCameraRoll { UIGraphicsBeginImageContext(self.view.bounds.size); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(viewImage, self, nil, nil); /* flashView.alpha = 1; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.5]; flashView.alpha = 0; [UIView commitAnimations]; UIAlertView *alert= [[UIAlertView alloc] initWithTitle:nil message:@"Photo saved to your camera roll" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; */ } |
Я внедрил метод “saveToCameraRoll“, первые пять строк которого выполняют все необходимые операции. Подробнее объяснить достаточно сложно, поскольку здесь речь не шла о рисовании, слоях и контекстах Quartz… Если вкратце, то первая строка создает контекст размера нашего представления (UIViewController’s self.view). Его фрейм (который в полном смысле этого слова фреймом не является) используется для визуализации наполнения (вторая строка) с сохранением в “viewImage“. Четвертая строка закрывает больше ненужный контекст, а пятая вставляет “viewImage” в каталог Camera Roll.
Символы /* и */ в комментариях — мой собственный способ копирования используемой iPhone анимации для создания скриншотов с помощью кнопок home и power. Я создал flashView — простое белое представление того же размера, что и “self.view“, большую часть времени на 100% прозрачное. Если пользователь решает с помощью представленной в приложении кнопки создать скриншот, “flashView” на полсекунды становится видимым, а затем вновь прозрачным. Не забудем и предупреждение о состоявшемся событии.
Имейте ввиду, что предложенный выше метод сохраняет “self.view” целиком со всеми объектами subview, какими бы они ни были. Если что-то сохранять не хочется, измените альфа-свойство объекта, открыв все, что за ним находится. После скриншота уровень альфа-канала возвращаем в нормальное состояние. Если скриншот снимается за один шаг – одно задание, изменений в интерфейсе пользователь не заметит. Пример:
1 2 3 4 5 6 7 8 9 10 | -(void)saveToCameraRoll { topView.alpha = 0; UIGraphicsBeginImageContext(self.view.bounds.size); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(viewImage, self, nil, nil); topView.alpha = 1; } |
Как обычно (не стоит благодарности) выкладываю образец проекта. Функции — полноразмерные снимки экрана iPhone (320 x 480 пикселей), центра (320 x 240 пикселей) и снова целого экрана без нижней кнопки.
Нажмите для увеличения
Ах да, чуть не забыл. И еще одно: на симуляторе снимки делаются мгновенно, а вот на реальном устройстве, к сожалению, затягиваются на несколько секунд.




Последние комментарии
Подскажите пожалуйста… Вот...
Код не открывает страницы по простой причине -...