Июл 30

Сегодня мы рассмотрим небольшой проект с NSTimers, а именно — создание приложения, иллюстрирующего лошадиные бега. Нам предстоит создать представление с шестью небольшими синими квадратами “UIView“. Расположив их внизу экрана, мы с помощью таймера выведем один из квадратов вперед на произвольное расстояние. Приступаем!

Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 4.50 из 5)
Загрузка ... Загрузка ...
1 Комментарий »

Июл 29

Я заметил, что многим играм в App Store не хватает анимации. Само собой, это не относится к компаниям формата Sega и PopCap, а как насчет независимых разработчиков?

Получится вот так!

Apple позаботилась о том, чтобы анимация никаких проблем не представляла, но, по-моему, рассмотренным здесь методом часто пренебрегают. В считанных строках кода я представлю вам полную анимацию изображений в игре на примере простого приложения. За основу мы возьмем анимацию наносящего удары персонажа Ryu.

1. Создание приложения на основе представления

Без комментариев…

2. Добавление изображений в папку “Resources”

Загрузив архив, распакуйте его и перетащите файлы в папку “Resources“. Обратите внимание: спрайт загружен с http://panelmonkey.org/. Файл включает 12 изображений Ryu из игры Street Fighter плюс фон из сцены Blanca для эффектности.

3. Создание фона

Потребности в данном шаге нет — он здесь просто для порядка.

Двойным щелчком на файле “whateveryoucalledyourapplicationViewController.xib” откройте его в редакторе Interface Builder. Поверните представление, щелкнув на кнопке со стрелкой.

Перетащите на экран “UIImageView” и растяните его по размерам экрана “iPhone“. В окне инспектора свойств выберите “sfst-blanka.jpg“. Проверьте, чтобы режим был установлен на “Center“, так как у изображения слишком низкое разрешение. Получившийся результат должен выглядеть примерно так (я добавил черный фон).

4. Создание анимации

Открыв файл “yourApplicationViewController.m“, добавьте к методу “viewDidLoad” приведенный ниже код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (void)viewDidLoad {
[super viewDidLoad];
NSArray * imageArray  = [[NSArray alloc] initWithObjects:
[UIImage imageNamed:@"1.png"],
[UIImage imageNamed:@"2.png"],
[UIImage imageNamed:@"3.png"],
[UIImage imageNamed:@"4.png"],
[UIImage imageNamed:@"5.png"],
[UIImage imageNamed:@"6.png"],
[UIImage imageNamed:@"7.png"],
[UIImage imageNamed:@"8.png"],
[UIImage imageNamed:@"9.png"],
[UIImage imageNamed:@"10.png"],
[UIImage imageNamed:@"11.png"],
[UIImage imageNamed:@"12.png"],
nil];
UIImageView * ryuJump = [[UIImageView alloc] initWithFrame:
CGRectMake(100, 125, 150, 130)];
ryuJump.animationImages = imageArray;
ryuJump.animationDuration = 1.1;
ryuJump.contentMode = UIViewContentModeBottomLeft;
[self.view addSubview:ryuJump];
[ryuJump startAnimating];
}

Для всех программистов 1337, которые опубликуют здесь комментарии с фразой “А почему бы для загрузки изображений не воспользоваться циклом?“, сразу отвечаю (изрядно занудным голосом): “Я делаю так, чтобы все было предельно ясно. Моя задача — показать, что массив нужно заполнить изображениями“.

Вот что, собственно, происходит в коде.

Сначала создаем массив из объектов “UIImage“. А затем начинается волшебство…. Apple предоставила в наше распоряжение свойство “UIImageView“, являющееся массивом изображений. Класс “UIImageView” располагает встроенной функцией, позволяющей циклически чередовать изображения с заданным временным интервалом (т.е. анимировать их).

Следующая переменная — длительность анимации, или количество секунд, за которые поочередно сменятся все изображения. По умолчанию это число изображений, умноженное на 1/30, т.е. скорость в 30 фреймов в сек. Поскольку у нас не 30 изображений, а только 12, с таким показателем анимация воина будет выглядеть весьма странно.

Установим по умолчанию 12 * (1/30) = 4, замедлив до 1.1. По окончании работы с анимацией можете поэкспериментировать с этим числом.

Очередная переменная — “contentMode“. Данный режим определяет, как именно изображение будет заполнять фрейм “UIImageView“. Поскольку изображения в анимации разного размера, мы откорректируем размеры фрейма под самое больше из них и установим “contentMode” на “UIViewContentModeBottomLeft“. Это означает, что прорисованное без масштабирования изображение будет помещено в левый нижний угол представления “UIImageView“. Чтобы понять, какой именно вариант будет верен для конкретного приложения, прочтите подробную информацию по режиму “contentMode“.

Последним шагом добавляем к основному представлению “UIImageView” и вызываем для него метод “startAnimating“, запуская анимацию для изображений. Есть и другие методы, которые могут оказаться весьма полезными при анимации, включая “stopAnimating” и “isAnimating“.

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

Пример подразумевает работу устройства в альбомном режиме. О том, как это сделать, можно прочесть здесь. Необходимо внести в файл “info.plist” данные о начальном положении интерфейса, добавив соответствующий код в файл “viewController.m“.

1
2
3
4
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

Конец…

На этот раз по анимации все. Код к уроку можно загрузить здесь http://icodeblog.com/wp-content/uploads/2009/07/AnimationApp.zip. Удачи в программировании!

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

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

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

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

Июл 28

В первой части посвященной SDK iPhone 3.0 серии мы рассмотрели принцип внедрения в приложения iPhone менеджера отмены действий “NSUndoManager” и собственно отмену/повтор с помощью встряски.

В этот раз добавим к простейшему приложению iPhone встроенную возможность отправки электронных сообщений — с помощью предусмотренного в новой версии фреймворка “MessageUI“.

Теоретически, ни отправка электронных сообщений, ни “MessageUI” сами по себе новинкой не являются. До выхода версии 3.0 у “MessageUI” был свой частный фреймворк, а из приложений можно отправлять сообщения через “mailto:// URLs” (хотя возможности функции были ограничены). Теперь же опция отправки стала не только полнофункциональной, но и удобной в работе.

Мы начнем с рабочего кода для простого приложения: интерфейс будет включать всего одну кнопку. Добавим код с выводом по нажатию кнопки предложения о создании сообщения, возможностью предварительного заполнения поля “subject” и содержимого. Продолжить чтение »

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

Июл 24

Поздравляем всех с выходом iPhone 3.0!

В связи с радостным событием и с открывшейся возможностью обсудить больше не конфиденциальную новинку, предлагаем вашему вниманию серию уроков “Новое в iPhone 3.0″. 

В первом из них рассмотрим добавление к приложению возможности отмены/повтора действий с помощью встряхивания.

NSUndoManager

За функции отмены/повтора отвечает класс “NSUndoManager“, информацию о котором можно найти здесь (на англ. языке). Принцип его работы заключается в хранении стека сообщений, который при пересылке последовательно отменяет последнее действие, потом предпоследнее и так далее до возвращения в исходное состояние. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (3 голосов, средний: 3.00 из 5)
Загрузка ... Загрузка ...
Нет комментариев »

Июл 22

С помощью представления с подробным отображением (drill down table view) можно вывести на экран нижележащие уровни для нужных объектов. Для выбранной строки это будет новое табличное представление с относящимися к выбранному объекту данными. Процесс повторяется до тех пор, пока для элемента не останется категорий нижнего уровня. Это происходит при отображении детализированного представления, не являющегося “UITableView“. 

Создание проекта

В XCode создайте новый проект, выбрав опцию “Navigation-Based Application“. Для своего я выбрал имя “DrillDownApp“, которое и будет использоваться в уроке.

Один единственный “UITableView”

Вместо создания трех различных объектов “UITableView” для отображения трех различных уровней воспользуемся всего одним (и одним контроллером табличного представления). По духу такой подход близок веб-программированию, где для вывода списка продуктов достаточно одной страницы. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (1 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Нет комментариев »

Июл 16

Обладатели iPhone часто начинают работать с ними, много не зная, а позже понимают, что им сложно ориентироваться в происходящем. Этот урок посвящен запуску приложения “Hello World” на симуляторе iPhone. Те, кому лень читать 10 предложенных для этого шагов, могут сразу перейти к странице с видеоуроком.

Создаем урок “hello world” за 10 шагов

Чтобы приступить к созданию в симуляторе приложения “Hello World“, понадобится следующее:

1. Mac с процессором Intel и ОС 10.5.7 или последней версией Leopard
2. Учетная запись Apple Developer (которую после регистрации можно получить бесплатно). Для программирования приложений для iPhone необходим набор средств iPhone SDK. Для тестирования кода на устройстве (iPhone) потребуется лицензия разработчика, которая обойдется в 99 долл. (299 долл. за корпоративную версию). Чтобы запустить в симуляторе iPhone первое приложение “Hello World“, выполните перечисленные ниже шаги. В этом уроке мы подготовим все необходимое для последующей разработки крупных приложений. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (8 голосов, средний: 4.00 из 5)
Загрузка ... Загрузка ...
Нет комментариев »

Июл 14

Если вы разработчик (что вероятнее всего, учитывая факт чтения данной статьи), то, по всей вероятности, у вас уже есть или должна появиться учетная запись в Twitter. В последнее время эта социальная сеть обрела такую популярность, что было бы глупо не интегрировать Twitter тем или иным способом в собственные приложения iPhone.
Сделать приложения более социально ориентированными с помощью Twitter можно разными способами. Например, предусмотрев автоматическое подключение к сети при нахождении определенного предмета в игре или победе над персонажем. При этом все друзья узнают о достижениях пользователя, а вам подобный ход добавит популярности. Кстати, а как насчет создания собственного Twitter-клиента (только не рассчитывайте продать мой урок в App Store).
Twitter предлагает элементарный пользовательский интерфейс, с помощью которого с сетью легко и просто взаимодействовать. В моем персональном блоге я как раз публикую серию статей о создании Twitter-клиента для Mac, кодом из которой мы частично воспользуемся.
Перед началом хочу остановиться ещё на одном моменте: создание интерфейса и установку связей со спецификаторами “IBOutlet” я рассмотрю очень бегло. Если что-то будет непонятно, лучше начать с более простых уроков. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 2 »

Июл 12

Метод по умолчанию “UITableViewCell” позволяет отображать текст (с текстовым свойством) или изображение (со свойством изображения). А вот вывести данные в нескольких столбцах или строках не получится. В шестом уроке серии, посвященной “UITableView“, мы воспользуемся кодом предыдущего урока. Вот как будет в итоге выглядеть приложение:

Простым указанием текстового свойства для “UITableViewCell” такого результата не добиться. Чтобы решить проблему, добавим к представлению содержимого ячейки две метки. Указав соответствующие координаты, сделаем так, чтобы они выводились одна над другой. Согласно документации Apple, чтобы не менять поведения ячейки по умолчанию, объекты “subview” необходимо добавлять к представлению содержимого ячейки. Соответственно, мы не будет наследовать “UITableViewCell“. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (3 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Нет комментариев »

Июл 11

Еще один способ ускорить для пользователя получение данных — отображение индекса для табличного представления, о котором и пойдет речь в пятом уроке. Как обычно, воспользуемся кодом предыдущего урока. Вот как будет выглядеть итоговое приложение:

Создание индекса

Для начала нам нужно создать массив с выводимыми на экран индексными значениями. Требуемый тип значений для массива — “NSString“. Согласно документации Apple, стиль табличного представления должен быть установлен на “UITableViewStylePlain“. Однако настройка на “UITableViewStyleGrouped” ошибкой тоже не считается. Массив возвращается в методе “sectionIndexTitlesForTableView“, а код при этом выглядит так:

finalapp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//файл "RootViewController.m"
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {

if(searching)
return nil;

NSMutableArray *tempArray = [[NSMutableArray alloc] init];
[tempArray addObject:@"1"];
[tempArray addObject:@"2"];
[tempArray addObject:@"3"];
[tempArray addObject:@"4"];
[tempArray addObject:@"5"];
[tempArray addObject:@"6"];
[tempArray addObject:@"7"];
[tempArray addObject:@"8"];
[tempArray addObject:@"9"];
[tempArray addObject:@"10"];
[tempArray addObject:@"11"];
[tempArray addObject:@"12"];
[tempArray addObject:@"13"];
[tempArray addObject:@"14"];
[tempArray addObject:@"15"];
[tempArray addObject:@"16"];
[tempArray addObject:@"17"];
[tempArray addObject:@"18"];
[tempArray addObject:@"19"];
[tempArray addObject:@"20"];
[tempArray addObject:@"21"];
[tempArray addObject:@"22"];
[tempArray addObject:@"23"];
[tempArray addObject:@"24"];
[tempArray addObject:@"25"];
[tempArray addObject:@"26"];

return tempArray;
}

Приведенный выше код создает массив и возвращает его. В массив можно добавить буквы — от ‘A’ до ‘Z’. При поиске по табличному представлению массив не возвращается, а индексное представление не отображается.

Обработка событий

При щелчке на элементе индекса выводится начинающийся с него раздел. При этом вызывается событие “tableView:sectionForSectionIndexTitle:atIndex“, возвращающее индекс отображаемого раздела. Поскольку в нашем источнике данных всего 2 раздела и 26 значений индекса, код выглядит следующим образом:

1
2
3
4
5
6
7
8
//файл "RootViewController.m"
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {

if(searching)
return -1;

return index % 2;
}

При поиске по табличному преставлению индекс раздела не возвращается. Исходные данные немного изменены — добавлены текстовые объекты, наглядно демонстрирующие выбор раздела. Поскольку индекс выводится в непосредственной близости от вспомогательного представления, последнее устанавливается на “UITableViewCellAccessoryNone“.

Заключение

Простой реализацией двух методов мы создали для табличного представления индекс. Кстати, думаю, что некоторые методы Apple просто скрыла (например, мы не можем предложить увеличительное стекло, как в приложении с контактами). Если у кого-то есть идеи по реализации такой функции — поделитесь.

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

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

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

1 звезда2 звезд3 звезд4 звезд5 звезд (1 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 6 »

Июл 10

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

Добавление панели поиска

Для начала добавим к сегментированному представлению панель поиска. Двойным щелчком на файле “RootViewController.nib” откройте редактор интерфейсов Interface Builder. Перетащите в nib-файл объект “UISearchBar“. В XCode откройте файл “RootViewController.h” и задекларируйте переменную типа “UISearchBar” с названием “searchBar” и ключевым словом “IBoutlet” (для отображения в IB). Соедините переменную с объектом “UISearchBar” и настройте делегата “UISearchBar” на объект “File’s Owner“. Тем самым мы уведомляем “RootViewController” обо всех событиях, генерируемых на панели поиска. Вот как при этом будет выглядеть заголовочный файл (я добавил переменных и вспомогательный метод для поиска): Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (1 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Нет комментариев »