Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Как принудить внешние кнопки iPhone трудиться на себя

Anna | 2.07.2014 | нет комментариев

Теснее достаточно давным-давно тружусь фрилансером и изредка беру пару-тройку простеньких планов за $100-200 для разгрузки мозга. В данный раз заказчик попросил применять внешние кнопки регулировки громкости в iPhone. Задача состояла в том, что встроенного API для внешних кнопок в iOS не существует: до недавних пор применение хардверных элементов устройства, чудесное от системного поведения, было запрещено. Следственно разные приложения типа «Camera » и «Camera Pro» никак не могли донести сходственный функционал до пользователя. Впрочем, по радостной случайности, в iOS 5 разработчики Apple сами начали применять сходственный подход к интерфейсу: сделать фотографию в системном приложении камеры сейчас дозволено, нажав на клавишу увеличения громкости.

Как реализовать сходственное поведение внешних клавиш в своем приложении, глядите под катом. Исходники прилагаются в конце статьи.

Немножко погуглив о задаче, дозволено наткнуться на открытое решение RBVolumeButtons, которое открывает аудио сессию и начинает слушать метаморфоза громкости. В моем случае, данный класс досадно влиял на работу камеры: активировав новую аудио сессию, мы прерывали аудиосессию камеры. Я решил собрать свой велосипед, подойдя к процессу со слегка другой стороны; написать обособленный класс NKVolumeButtons, скрывающий в себе каждый нужный функционал.

Позже короткого разбора полетов я решил применять класс MPMusicPlayer из встроенного фреймворка MediaPlayer. В этом класе есть два сиглтона музыкального плеера: один для приложения и 2-й системный, всеобщий для каждого телефона. Мы будем слушать метаморфозы громкости музыкального плеера для нашего приложения. Для этого добавим в способ инициализации объекта NKVolumeButtons немножко кода:

Жми меня!

[[MPMusicPlayerController applicationMusicPlayer] addObserver:self forKeyPath:@"volume" options:NSKeyValueObservingOptionNew context:nil];

Все по канонам KVO: взамен собственного велосипеда мы используем ветхую добродушную категорию, унаследованную от NSObject. Соответственно, нам необходим и обработчик события — когда параметр, тот, что мы слушаем, изменится, нам необходимо как-то принять эту информацию. Отважно добавляем способ в NKVolumeButtons!

Жми меня!

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    // Тут мы можем проверить, тот ли keyPath мы получаем; но для чего? чай исключительный параметр, тот, что мы слушаем - это volume
    [self checkVolumeButtons];
}

- (void)checkVolumeButtons {

    // 1
    float currentVolume = [[MPMusicPlayerController applicationMusicPlayer] volume];

    // 2
    if (currentVolume > 0.5) {
        [self volumeUp];
    } else if (currentVolume < 0.5) {
        [self volumeDown];
    }

    // 3
    [[MPMusicPlayerController applicationMusicPlayer] setVolume:0.5];
}

Разберем код по-порядку:

  1. Получаем нынешнюю громкость приложения
  2. Проверяем, увеличилась ли громкость, либо уменьшилась
  3. Возвращаем громкость к начальному значению

Что за начальное значение? Поясняю: если пользователь зашел в наше приложение, а громкость на нуле? Тогда нажатия клавиши уменьшения громкости не будут иметь смысла — ничего трудиться не будет. Следственно с самого начала нам необходимо установить громкость на определенном ярусе, от которого и будем танцевать. Параметр volume может принимать значения от 0 до 1, так что мы предпочтем середину — 0.5. Добавим дальнейший код в инициализацию объекта NKVolumeButtons:

Жми меня!

[[MPMusicPlayerController applicationMusicPlayer] setVolume:0.5];

А сейчас приступим к реализации способов volumeUp и volumeDown. Для комфорта добавим два параметра классу NKVolumeButtons, доступных извне — upBlock и downBlock. Приведем файл NKVolumeButtons.h к дальнейшему виду:

Жми меня!

typedef void (^ButtonBlock)();

#import <Foundation/Foundation.h>

@interface NKVolumeButtons : NSObject

@property (nonatomic, copy) ButtonBlock upBlock;
@property (nonatomic, copy) ButtonBlock downBlock;

@end

Тут мы легко в комфортном ключе добавили вероятность устанавливать извне блоки кода, которые будут вызываться при нажатии клавиш регулировки громкости. Не стоит забывать и о синтезации наших параметров. Добавьте следующее в имплементацию NKVolumeButtons:

Жми меня!

@synthesize upBlock = _upBlock;
@synthesize downBlock = _downBlock;

И, безусловно же, вызов наших блоков в необходимое время:

Жми меня!

- (void)volumeUp {
    // Неизменно необходимо проверять, получилось ли задать надобные параметры
    if(self.upBlock) {
        self.upBlock();
    }
}

- (void)volumeDown {
    // Неизменно необходимо проверять, получилось ли задать надобные параметры
    if(self.downBlock) {
        self.downBlock();
    }
}

А вот и еще одна проблемка! Всякий раз, когда мы изменяем громкость, на экране возникает индикатор громкости. Что же, воспользуемся готовым решением, которое теснее было в RBVolumeButtons. На то он и opensource, Дабы помогать друг другу, не так ли? Добавьте дальнейший код в NKVolumeButtons.m:

Жми меня!

// Прячем индикатор громкости
CGRect frame = CGRectMake(0, -100, 10, 0);
UIView *volumeView = [[MPVolumeView alloc] initWithFrame:frame];
[volumeView sizeToFit];
[[[[UIApplication sharedApplication] windows] objectAtIndex:0] addSubview:volumeView];

Вот и все! Нам остается только добавить данный класс в план, инициализировать объект NKVolumeButtons и задать надобные блоки кода. Вот таким простым костылем решается задача недостатка API внешних клавиш.

Спасибо за то, что дочитали до конца! Исходники доступны на гитхабе.
Если внезапно обнаружите какие-либо неточности либо опечатки, милости умоляю в мой комфортабельный програкабинет.

 

Источник: programmingmaster.ru

Оставить комментарий
БАЗА ЗНАНИЙ
СЛУЧАЙНАЯ СТАТЬЯ
СЛУЧАЙНЫЙ БЛОГ
СЛУЧАЙНЫЙ МОД
СЛУЧАЙНЫЙ СКИН
НОВЫЕ МОДЫ
НОВЫЕ СКИНЫ
НАКОПЛЕННЫЙ ОПЫТ
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB