Создаем приложение “Ударная установка”
Начинаем.
Создайте в XCode новый проект на основе представления (View-based) и присвойте ему имя “Bickboxx“.
Загрузите zip-архив BickboxxAssets.zip и распакуйте его. В нем все, что понадобится для приложения Bickboxx — звуки, изображения и пиктограммы. Все эти файлы перетащите в папку “Resources“.
Чтобы скопировать объект в папку проекта, пометьте флажком опцию “Copy items into destination group’s folder (if needed)“. Настройки должны выглядеть так, как на рисунке. Подтвердите кнопкой “Add“.
Добавление фона в Interface Builder.
Двойным щелчком на файле BickboxxViewController.xib откройте его в редакторе IB. Перетащите объект Image View (UIImageView) из библиотеки Library в окно View, получив заполнитель для фона.
Откройте окно “Attributes Inspector“. Для элемента “Image” выберите из списка опцию “Background.png“.
Создание кнопки в IB.
В окно “View” перетащите элемент “Round Rect Button (UIButton)“.
Перейдите в окно “Attributes Inspector“. Кнопка в виде несимпатичного белого прямоугольника не интересует: из раскрывающегося меню “Type” выберите вариант “Custom“.
Ниже в том же окне установите для состояния кнопки вариант “Normal” (или “Default State Configuration” — в зависимости от версии Xcode). Так будет выглядеть кнопка в состоянии бездействия.
В поле “Image” выберите в качестве изображения кнопки вариант “B Inactive.png“. Отрегулируйте размер кнопки в окне View так, чтобы она отображалась полностью.
Теперь измените состояние кнопки на вариант с подсветкой “Highlighted” (или Highlighted State Configuration в зависимости от версии Xcode). Так будет выглядеть кнопка при нажатии.
В качестве изображения в поле “Image” выберите “B Active.png“.
Перетащите в окно View еще одну кнопку Round Rect Button (UIButton) и повторите все операции с буквами “E“, “А” и “Т“. Теперь представление “View” должно выглядеть так:
Пока редактор IB можно закрыть.
Выполнив “Build and Go“, убедитесь, что пока все работает. При касании кнопок они должны подсвечиваться.
Добавляем код звука.
В нашем распоряжении интерфейс, который ничего не делает. Нужно это исправить. Необходимая звуковая структура (framework) по умолчанию не добавляется. Добавим фреймворк AudioToolbox самостоятельно.
Удерживая нажатой клавишу <Control>, щелкните по папке “Frameworks” слева. Перейдите в меню “Add → Existing Frameworks…”.
В папке “/System/Library/Frameworks” найдите “AudioToolbox.framework“.
Щелкните на кнопке OK и добавьте объект к проекту.
Откройте “BickboxxViewController.h” и вставьте в файл следующий код:
#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>
@interface BickboxxViewController : UIViewController {
CFURLRef bNoteFileURLRef;
SystemSoundID bNoteFileObject;
CFURLRef eNoteFileURLRef;
SystemSoundID eNoteFileObject;
CFURLRef aNoteFileURLRef;
SystemSoundID aNoteFileObject;
CFURLRef tNoteFileURLRef;
SystemSoundID tNoteFileObject;
}
@property (readwrite) CFURLRef bNoteFileURLRef;
@property (readonly) SystemSoundID bNoteFileObject;
@property (readwrite) CFURLRef eNoteFileURLRef;
@property (readonly) SystemSoundID eNoteFileObject;
@property (readwrite) CFURLRef aNoteFileURLRef;
@property (readonly) SystemSoundID aNoteFileObject;
@property (readwrite) CFURLRef tNoteFileURLRef;
@property (readonly) SystemSoundID tNoteFileObject;
@end
Вверху мы ссылаемся на “AudioServices.h” из импортированной ранее структуры “AudioToolbox“.
Ниже — декларация свойств для четырех звуков, соответствующих клавишам “B“, “E“, “A” и “T”
“bNoteFileURLRef” — ссылка на расположение файла для bNoteFileObject. Этот звук будет воспроизводить клавиша “B“.
Там же прописаны параметры для звуков “E“, “A” и “T“.
Файл BickboxxViewController.m
Откройте “BickboxxViewController.m” — здесь необходимо синтезировать для параметров getter’ы и setter’ы.
Для этого после “@implementation BickBoxxViewController” добавим следующий код:
@synthesize bNoteFileURLRef, bNoteFileObject, eNoteFileURLRef,
eNoteFileObject, aNoteFileURLRef, aNoteFileObject,
tNoteFileURLRef, tNoteFileObject;
Меняем метод viewDidLoad.
Найдите метод “viewDidLoad” — он закомментирован. Для активации знаки комментария нужно удалить.
Метод “viewDidLoad” вызывается после создания всех компонентов пользовательского интерфейса. Это удачный момент для любого кода запуска в приложении. В нашем случае воспользуемся им для привязки параметров к конкретным звукам.
Первым делом получим основной bundle для приложения. Он позволяет работать с иерархией папок, упорядочивая и размещая различные типы ресурсов для приложения, включая изображения, звуки, исполняемые коды и локализованные строки.
Чтобы вызвать основной bundle приложения, после “[super viewDidLoad];” добавьте следующий код:
// Получение основного bundle для приложения
CFBundleRef mainBundle;
mainBundle = CFBundleGetMainBundle ();
Чтобы кнопка “B” обзавелась звуком, нужен путь к назначенному для воспроизведения звуковому файлу. Его имя — “B.aifc“. Приведенный ниже код запрашивает URL для воспроизведения найденного файла. Поставьте его сразу за кодом получения основного bundle.
// Получение URL для воспроизведения звукового файла
bNoteFileURLRef = CFBundleCopyResourceURL (
mainBundle,
CFSTR ("B"),
CFSTR ("aifc"),
NULL
);
Обратите внимание, что система поддерживает только файлы с расширениями .wav, .aif и .caf.
Теперь, располагая набором bNoteFileURLRef, можно привязать звуковой файл к звуковому объекту системы bNoteFileObject. Функция AudioServicesPlaySystemSound позволит легко проигрывать короткие звуковые файлы.
После кода с запросом URL звукового файла добавьте следующий код:
// Создание системного звукового объекта, представляющего звуковой файл
AudioServicesCreateSystemSoundID (bNoteFileURLRef, &bNoteFileObject);
Загрузка звука для кнопки “В” завершена. Осталось загрузить звуки для кнопок “E“, “A” и “T“.
Попробуйте написать код для этой части фрагмент (так должен выглядеть метод “viewDidLoad” по завершении работы).
// Внедрение viewDidLoad для дополнительной настройки после загрузки представления,
// обычно из nib-файла
— (void)viewDidLoad {
[super viewDidLoad];
// Получение основного bundle для приложения
CFBundleRef mainBundle;
mainBundle = CFBundleGetMainBundle ();
// Получение URL для воспроизведения звукового файла
bNoteFileURLRef = CFBundleCopyResourceURL (
mainBundle,
CFSTR ("B"),
CFSTR ("aifc"),
NULL
);
// Создание представляющего звуковой файл системного звукового объекта
AudioServicesCreateSystemSoundID (bNoteFileURLRef, &bNoteFileObject);
// Получение URL для воспроизведения звукового файла
eNoteFileURLRef = CFBundleCopyResourceURL (
mainBundle,
CFSTR ("E"),
CFSTR ("aifc"),
NULL
);
// Создание представляющего звуковой файл системного звукового объекта
AudioServicesCreateSystemSoundID (eNoteFileURLRef, &eNoteFileObject);
// Получение URL для воспроизведения звукового файла
aNoteFileURLRef = CFBundleCopyResourceURL (
mainBundle,
CFSTR ("A"),
CFSTR ("aifc"),
NULL
);
// Создание представляющего звуковой файл системного звукового объекта
AudioServicesCreateSystemSoundID (aNoteFileURLRef, &aNoteFileObject);
// Получение URL для воспроизведения звукового файла
tNoteFileURLRef = CFBundleCopyResourceURL (
mainBundle,
CFSTR ("T"),
CFSTR ("aifc"),
NULL
);
// Создание представляющего звуковой файл системного звукового объекта
AudioServicesCreateSystemSoundID (tNoteFileURLRef, &tNoteFileObject);
}
Создание собственных IBActions.
Чтобы кнопки BEAT что-то делали, нужно связать их с функциями IBActions. Для начала задекларируем методы. Откройте “BickboxxViewController.h” и добавьте указанный ниже код перед строкой “@end“.
— (IBAction)bSound:(id)sender;
— (IBAction)eSound:(id)sender;
— (IBAction)aSound:(id)sender;
— (IBAction)tSound:(id)sender;
Теперь контроллер BickboxxViewController.h должен выглядеть так:
#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>
@interface BickBoxxViewController : UIViewController {
CFURLRef bNoteFileURLRef;
SystemSoundID bNoteFileObject;
CFURLRef eNoteFileURLRef;
SystemSoundID eNoteFileObject;
CFURLRef aNoteFileURLRef;
SystemSoundID aNoteFileObject;
CFURLRef tNoteFileURLRef;
SystemSoundID tNoteFileObject;
}
@property (readwrite) CFURLRef bNoteFileURLRef;
@property (readonly) SystemSoundID bNoteFileObject;
@property (readwrite) CFURLRef eNoteFileURLRef;
@property (readonly) SystemSoundID eNoteFileObject;
@property (readwrite) CFURLRef aNoteFileURLRef;
@property (readonly) SystemSoundID aNoteFileObject;
@property (readwrite) CFURLRef tNoteFileURLRef;
@property (readonly) SystemSoundID tNoteFileObject;
// Вновь добавленный код
— (IBAction)bSound:(id)sender;
— (IBAction)eSound:(id)sender;
— (IBAction)aSound:(id)sender;
— (IBAction)tSound:(id)sender;
@end
Закройте файл, открыв “BickboxxViewController.m“. Чтобы методы IBAction издавали определенные системные звуки, запуская метод AudioServicesPlaySystemSound, необходимо добавить реализацию.
Для воспроизведения звука “В” реализованный метод должен вызывать “AudioServicesPlaySystemSound” и использовать созданный ранее объект “bNoteFileObject“. После синтезирующего свойства кода добавьте следующее:
— (IBAction)bSound:(id)sender {
AudioServicesPlaySystemSound (self.bNoteFileObject);
}
Аналогичные реализации добавьте для звуков “E“, “A” и “T“.
Для примера приведу начало файла “BickboxxViewController.m“:
#import "BickBoxxViewController.h"
@implementation BickBoxxViewController
@synthesize bNoteFileURLRef, bNoteFileObject, eNoteFileURLRef,
eNoteFileObject, aNoteFileURLRef, aNoteFileObject,
tNoteFileURLRef, tNoteFileObject;
— (IBAction)bSound:(id)sender {
AudioServicesPlaySystemSound (self.bNoteFileObject);
}
— (IBAction)eSound:(id)sender {
AudioServicesPlaySystemSound (self.eNoteFileObject);
}
— (IBAction)aSound:(id)sender {
AudioServicesPlaySystemSound (self.aNoteFileObject);
}
— (IBAction)tSound:(id)sender {
AudioServicesPlaySystemSound (self.tNoteFileObject);
}
В последнем фрагменте кода наведем порядок, чтобы не допустить утечки памяти. В нижней части файла “BickboxxViewController.m” добавьте к методу “dealloc” следующие строки:
— (void)dealloc {
[super dealloc];
AudioServicesDisposeSystemSoundID (self.bNoteFileObject);
AudioServicesDisposeSystemSoundID (self.eNoteFileObject);
AudioServicesDisposeSystemSoundID (self.aNoteFileObject);
AudioServicesDisposeSystemSoundID (self.tNoteFileObject);
CFRelease (bNoteFileURLRef);
CFRelease (eNoteFileURLRef);
CFRelease (aNoteFileURLRef);
CFRelease (tNoteFileURLRef);
}
С кодингом закончили. Командой “Build and Go” запустите проект и проверьте, ничего ли не взорвалось. Пока кнопки никаких звуков не издают — код нужно связать с интерфейсом.
Создание связей между кнопками и интерфейсом в IB.
Код готов — теперь нужно привязать его к кнопкам. Для начала свяжем кнопку “B” с методом “bsound“. Для этого откройте файл “BickboxxViewController.xib“.
Чтобы связать кнопку “B” с методом “bsound“, щелкните на объекте “File’s Owner“, удерживая нажатой клавишу <Control>.
Элемент “bSound” в “File’s Owner” перетащите на кнопку “B” в окне “View“.
В открывшемся меню выберите “Touch Down“. По умолчанию действие выполняется, когда палец отрывается от кнопки. Нас это не устраивает — деки работают по иному принципу. Выбранный вариант будет вызывать метод bSound IBAction при нажатии кнопки.
Аналогичные связи установите для остальных кнопок. После этого при щелчке на объекте “File’s Owner” с нажатой клавишей <Control> картина будет следующей.
Готово!!!
Вы справились! Запустите приложение после компиляции.
А теперь посмотрим как это работает:
Оригинальная статья theappleblog.com
Источник lookapp.ru
Комментарии
Ура! Вы вернулись, а то я уже думал, что что то новое здесь уже не появится:)
Удачи вам и побольше хороших статей;)
странно, если некоторые вещи вставлять копированием, то проект не компилируется если самому набрать — все нормально.
Sergey 12.07.2009 5:50
странно. У меня тоже такое один раз случилось. Евгений скажите вы надеюсь не забросили БЛОГ?
Все верно, парни. Перед декларацией и последующем описанием метода (IBAction)bSound стоит тире, которое не ascii. Нужно его удалить и написать заново, не нужно для этого переписывать весь код ))) Дебаг вам на што? )))
Форма комментирования для «Создаем приложение "Ударная установка"»
скажите а как проиграть не музыкальный файл а самому задать чистоту колебания чтобы какаята мелодия получилась?
Принципиально ли, чтобы вызов dealloc родительского класса шел последним в деструкторе?
у Вас: — (void)dealloc { [super dealloc]; … }
в Википедии: — (void) dealloc { … [super dealloc]; }
Всё сделал правильно, интерфейс есть, а звука нету.. Не работает не мой не ваш(
Всё сделал правильно, интерфейс есть, а звука нету.. Не работает не мой не ваш(
У меня тоже не получилось…+(
сорри за офтоп.
У вас очень доступные туториалы по созданию приложений для айпод, айпад. Может как-то напишите — Как создать анимированную книжку, как это все сложить.
Возможно я что-то пропустил… а где питон?
Возможно я что-то пропустил… а где питон?