Real Racing - лучший симулятор гонок Уроки iPhone SDK: Создаем счетчик программными средствами (UIActivityIndicator)
Июн 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” можно гораздо проще.

 revealframeworkfinder

 

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

finderframeworks

Непосредственно в “Finder” перетащите “QuartzCore.framework” в относящуюся к проекту папку “Frameworks“. Скопировать объект или просто установить с ним связь — решать вам. После добавления фреймворка в класс, который будет отвечать за скриншоты, необходимо вставить строку для импорта части данного фреймворка.

1
#import &lt;QuartzCore/QuartzCore.h&gt;

Строку добавляйте на свое усмотрение — в заголовочный файл (.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 пикселей) и снова целого экрана без нижней кнопки.

screenshotssimulator

Нажмите для увеличения

Ах да, чуть не забыл. И еще одно: на симуляторе снимки делаются мгновенно, а вот на реальном устройстве, к сожалению, затягиваются на несколько секунд.

Исходный код скачать можно [здесь]

Текст оригинальной статьи на английском языке [здесь]

Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.

1 звезда2 звезд3 звезд4 звезд5 звезд (Оцените приложение)
Загрузка ... Загрузка ...


Оставьте комментарий