Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

Решение

Выполните следующие шаги.

1. Воспользуйтесь функцией UIGraphicsBeginImageContextWithOptions для создания нового контекста изображения. Этот контекст сразу станет текущим (актуальным), и именно в нем будет происходить все последующее рисование.

2. Вызовите метод drawViewHierarchyInRect: вашего класса UIView. В качестве параметра передайте этому методу границы вида, который вы хотите отрисовать в текущем контексте.

3. Вызовите метод UIGraphicsGetImageFromCurrentImageContext, возвращаемое значение которого — это представление текущего контекста в качестве изображения. Это изображение

будет относиться к типу UIImage.

4. Преобразуйте ваш экземпляр изображения в данные, воспользовавшись функцией UIImagePNGRepresentation. Эта функция даст вам объект типа NSData.

5. Наконец, вызовите в вашем объекте данных метод экземпляра writeToUrl: atomically:, чтобы записать изображение на определенный адрес на диске — если хотите. Имея экземпляр UIImage, можете выполнить с этим изображением и любую другую операцию.

Обсуждение

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

Перед тем как сохранить изображение или поделиться им таким образом, мы должны нарисовать его в контексте изображения. Контекст изображения остается для нас невидимым, так как мы даже не имеем его описателя. Тем не менее все рисовальные методы, которые вы вызываете, будут оказывать влияние на текущий контекст изображения. Контекст изображения можно сравнить с невидимым холстом для рисования. Чтобы получить представление вашего изображения, воспользуйтесь функцией UIGraphicsGetImageFromCurrentImageContext.

Когда вы начнете решать такую задачу с помощью нового SDK, вам всего лишь потребуется вызвать в виде метод drawViewHierarchyInRect: — и содержимое этого вида будет отрисовано в текущем контексте.

Итак, применим изученный материал на практике. В следующем фрагменте кода мы собираемся разместить в нашем виде ряд компонентов (при этом используются раскадровки, описанные в главе 6). Не важно, что именно вы поместите в раскадровке. Мы хотим снять содержимое нашего вида, сохранить эту информацию как изображение, а затем поместить это изображение в каталог Documents (Документы) на диске:

— (void) viewDidAppear:(BOOL)animated{

[super viewDidAppear: animated];

/* Делаем скриншот */

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, YES, 0.0f);

if ([self.view drawViewHierarchyInRect: self.view.bounds]){

NSLog(@"Successfully draw the screenshot.");

} else {

NSLog(@"Failed to draw the screenshot.");

}

UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext;

UIGraphicsEndImageContext;

/* Сохраняем его на диске */

NSFileManager *fileManager = [[NSFileManager alloc] init];

NSURL *documentsFolder = [fileManager URLForDirectory: NSDocumentDirectory

inDomain: NSUserDomainMask

appropriateForURL: nil

create: YES

error: nil];

NSURL *screenshotUrl = [documentsFolder

URLByAppendingPathComponent:@"screenshot.png"];

NSData *screenshotData = UIImagePNGRepresentation(screenshot);

if ([screenshotData writeToURL: screenshotUrl atomically: YES]){

NSLog(@"Successfully saved screenshot to %@", screenshotUrl);

} else {

NSLog(@"Failed to save screenshot.");

}

}

В

начале этого кода мы создаем новый контекст изображения и получаем его представление в виде изображения с помощью UIGraphicsGetImageFromCurrentImageContext. Имея это представление, мы воспользуемся NSFileManager, чтобы найти путь к каталогу Documents (Документы) нашего приложения, который находится на диске (см. раздел 12.1). Наконец, мы получаем представление скриншота в виде данных (с помощью функции UIImagePNGRepresentation) и после этого можем сохранить данное представление на диске. Мы должны получить представление изображения в формате PNG или JPEG, воспользовавшись для этого функцией UIImageJPEGRepresentation. Так мы получим данные, соответствующие изображению в этом формате (PNG/JPEG). Имея данные, мы можем сохранить их на диске или выполнить с ними другие операции.

См. также

Раздел 11.11, глава 6.

Глава 18. Фреймворк Core Motion

18.0. Введение

Устройства с операционной системой iOS, в частности iPhone и iPad, обычно оборудованы акселерометром. На некоторых устройствах, например новых iPhone и iPad, есть также гироскоп. Прежде чем пытаться использовать в ваших приложениях для iOS акселерометр или гироскоп, нужно проверить доступность (наличие) этих сенсоров на том устройстве, на котором работает ваша программа. В разделах 18.1 и 18.2 описаны приемы, которые можно использовать для обнаружения акселерометра или гироскопа. Устройства iOS, оснащенные гироскопом, могут регистрировать движение вдоль шести осей.

Рассмотрим ситуацию, которая позволяет оценить, насколько полезен гироскоп. Например, акселерометр не может обнаружить вращение устройства вокруг его вертикальной оси, если вы крепко держите устройство в руках, сидите в компьютерном кресле и крутитесь на нем по часовой стрелке или против часовой стрелки. Относительно пола в вашей комнате или относительно планеты Земля устройство вращается вокруг вертикальной оси, но оно при этом не вращается вокруг собственной оси Y, проходящей по вертикали через центр устройства, то есть акселерометр не обнаружит никакого движения.

Поделиться:
Популярные книги

Революция

Валериев Игорь
9. Ермак
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Революция

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Кодекс Охотника

Винокуров Юрий
1. Кодекс Охотника
Фантастика:
фэнтези
юмористическое фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4

И в аду есть герои

Панов Вадим Юрьевич
5. Тайный Город
Фантастика:
боевая фантастика
9.19
рейтинг книги
И в аду есть герои

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Родословная. Том 3

Ткачев Андрей Юрьевич
3. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Родословная. Том 3

Варяг

Мазин Александр Владимирович
1. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Варяг

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Руководство по системной поведенченской психотерапии

Курпатов Андрей Владимирович
Научно-образовательная:
психотерапия и консультирование
5.00
рейтинг книги
Руководство по системной поведенченской психотерапии

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря