- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания iOS. Приемы программирования - Вандад Нахавандипур
Шрифт:
Интервал:
Закладка:
Рассмотрим ситуацию, которая позволяет оценить, насколько полезен гироскоп. Например, акселерометр не может обнаружить вращение устройства вокруг его вертикальной оси, если вы крепко держите устройство в руках, сидите в компьютерном кресле и крутитесь на нем по часовой стрелке или против часовой стрелки. Относительно пола в вашей комнате или относительно планеты Земля устройство вращается вокруг вертикальной оси, но оно при этом не вращается вокруг собственной оси Y, проходящей по вертикали через центр устройства, то есть акселерометр не обнаружит никакого движения.
Гироскоп, имеющийся в некоторых устройствах с iOS, может регистрировать такие движения. И мы можем писать более гладкие и безошибочные программы обнаружения движения. Обычно такие возможности полезны в играх, так как при их программировании разработчику зачастую требуется узнать не только о том, как устройство движется по осям X, Y и Z — эти данные можно получить от акселерометра, — но и о том, движется ли устройство по этим осям относительно Земли. А вот для этого уже нужен гироскоп.
Программист может пользоваться фреймворком Core Motion для доступа к информации, поступающей как от акселерометра, так и от гироскопа (при их наличии). Фреймворк Core Motion применяется во всех разделах этой главы. При работе с новым компилятором LLVM, чтобы связать новое приложение с системным фреймворком, вам всего лишь потребуется импортировать этот фреймворк в верхней части заголовочных файлов и файлов реализации, а компилятор сам выполнит все необходимые операции для импорта фреймворка в приложение.
Эмулятор iOS не может имитировать работу акселерометра и гироскопа. Правда, в эмуляторе iOS можно имитировать встряхивание, выбрав команду Hardware — Shake Gesture (Оборудование — Жест встряхивания) (рис. 18.1).
Рис. 18.1. Параметр Shake Gesture (Жест встряхивания) в эмуляторе iOS
18.1. Обнаружение доступности акселерометра
Постановка задачи
В вашей программе требуется определить, имеется ли в устройстве акселерометр.
Решение
Для обнаружения акселерометра пользуйтесь методом isAccelerometerAvailable класса CMMotionManager. Метод isAccelerometerActive также позволяет узнать, посылает ли акселерометр в данный момент уведомления вашей программе.
Сначала убедимся, что импортировали необходимые заголовочные файлы:
#import «AppDelegate.h»
#import <CoreMotion/CoreMotion.h>
@implementation AppDelegate
Далее проверим, что присутствие акселерометра указано в файле реализации делегата нашего приложения:
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
CMMotionManager *motionManager = [[CMMotionManager alloc] init];
if ([motionManager isAccelerometerAvailable]){
NSLog(@"Accelerometer is available.");
} else{
NSLog(@"Accelerometer is not available.");
}
if ([motionManager isAccelerometerActive]){
NSLog(@"Accelerometer is active.");
} else {
NSLog(@"Accelerometer is not active.");
}
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Итак, в устройстве с iOS, где работает ваша программа, может присутствовать акселерометр. Но это еще не означает, что акселерометр посылает уведомления вашему приложению. Если акселерометр или гироскоп посылает такие уведомления, мы говорим, что он активен (а в таком случае нам потребуется определить объект делегата, о чем поговорим чуть позже).
Если запустить этот код в эмуляторе iOS, то в окне консоли появятся примерно такие сообщения:
Accelerometer is not available. // акселерометр недоступен
Accelerometer is not active. // акселерометр неактивен
При запуске такого же кода на новом iPhone получим такие значения:
Accelerometer is available. // акселерометр доступен
Accelerometer is not active. // акселерометр неактивен
Обсуждение
В устройстве с операционной системой iOS может быть встроенный акселерометр. Поскольку мы не можем с уверенностью сказать, в каких устройствах с iOS имеется такое оборудование, а в каких — нет, перед использованием акселерометра целесообразно проверить, доступен ли он.
Чтобы проверить наличие этого оборудования, нужно инстанцировать объект типа CMMotionManager и получить доступ к его методу isAccelerometerAvailable. Это метод логического типа, он возвращает значение YES, если акселерометр доступен, и NO, если он отсутствует.
Кроме того, можно узнать о том, посылает ли акселерометр обновления вашей программе в настоящий момент (соответственно, активен ли он), воспользовавшись методом isAccelerometerActive класса CMMotionManager. О том, как получать данные от акселерометра, мы поговорим в разделе 18.3.
См. также
Раздел 18.3.
18.2. Обнаружение доступности гироскопа
Постановка задачи
В вашей программе требуется определить, имеется ли в устройстве гироскоп.
Решение
Пользуйтесь методом isGyroAvailable, относящимся к классу CMMotionManager, чтобы проверить наличие гироскопа. Кроме того, метод isGyroActive позволяет узнать, посылает ли в данный момент гироскоп обновления вашему приложению, то есть активен ли он:
#import «AppDelegate.h»
#import <CoreMotion/CoreMotion.h>
@implementation AppDelegate
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
CMMotionManager *motionManager = [[CMMotionManager alloc] init];
if ([motionManager isGyroAvailable]){
NSLog(@"Gryro is available.");
} else {
NSLog(@"Gyro is not available.");
}
if ([motionManager isGyroActive]){
NSLog(@"Gryo is active.");
} else {
NSLog(@"Gryo is not active.");
}
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Эмулятор iOS не позволяет имитировать работу гироскопа. Запустив этот код в эмуляторе, вы увидите в окне консоли примерно такой текст:
Gyro is not available. // гироскоп недоступен
Gyro is not active. // гироскоп неактивен
Если запустить этот код на устройстве с iOS, оборудованном гироскопом, например на новом iPhone, то результаты будут иными:
Gyro is available. // гироскоп доступен
Gyro is not active. // гироскоп неактивен
Обсуждение
Если вы планируете выпустить приложение, в котором используется гироскоп, то нужно гарантировать, что ваша программа сможет работать и на других устройствах с iOS, где нет такого оборудования. Например, если вы используете гироскоп как элемент игры, то нужно убедиться в том, что игра будет работать и на других устройствах, хотя гироскопа они и не имеют. Ведь не во всех устройствах с iOS он установлен. Именно наличие гироскопа в устройстве мы и будем проверять в данном разделе.
Чтобы решить эту задачу, потребуется инстанцировать объект типа CMMotionManager. После этого мы должны будем получить доступ к логическому методу isGyroAvailable и посмотреть, доступен ли гироскоп на том устройстве, где выполняется ваш код. Кроме того, можно воспользоваться методом isGyroActive экземпляра CMMotionManager, чтобы узнать, посылает ли гироскоп в настоящее время обновления вашему приложению. Подробнее об этом поговорим в разделе 18.5.
См. также
Раздел 18.5.
18.3. Получение данных акселерометра
Постановка задачи
Требуется указать операционной системе iOS, чтобы она посылала вашей программе данные от акселерометра.
Решение
Пользуйтесь методом экземпляра startAccelerometerUpdatesToQueue: withHandler:, относящимся к классу CMMotionManager. Вот заголовочный файл контроллера вида, в котором класс CMMotionManager применяется для получения обновлений от акселерометра:
#import «ViewController.h»
#import <CoreMotion/CoreMotion.h>
@interface ViewController ()
@property (nonatomic, strong) CMMotionManager *motionManager;
@end
@implementation ViewController
Мы реализуем контроллер вида и воспользуемся методом startAccelerometerUpdatesToQueue: withHandler: класса CMMotionManager:
— (void)viewDidLoad{
[super viewDidLoad];
self.motionManager = [[CMMotionManager alloc] init];