В данной статье будут рассмотрены следующие темы:
- Работа с трансформацией
- Работа с “UIImageView“
- Установка интервала для анимации
- Привязка изображения к объектам
- Создание производного класса от “UIImageView“
Шаг 1
Командой “New Project” создайте новый проект. Выполните “iPhone OS Application -> View-Based Application” и присвойте проекту имя “Ball“.
Шаг 2
Импортируйте изображение в группу “Resources“. При работе с прозрачным png-файлом прозрачность будет сохранена. Я выбрал веселый мяч из [подборки]. Продолжить чтение »
Переходы в представлениях способны оживить любое приложение. На текущий момент таких внедренных переходов насчитывается четыре:
- Отворот вверх (UIViewAnimationTransitionCurlUp) — проверьте на iPhone приложение Maps, хотя это не самый удачный вариант. Все просто: при пролистывании страницы представление отворачивается снизу вверх.
- Отворот вниз (UIViewAnimationTransitionCurlDown)
- Переворот справа (UIViewAnimationTransitionFlipFromRight) — точно так, как в приложении Weather при нажатии кнопки “info”; переворот представления вокруг вертикальной оси.
- Переворот слева (UIViewAnimationTransitionFlipFromLeft)
Код настройки перехода для представления практически ничем не отличается от других разновидностей анимации (см. пример):
1 2 3 4 5 6 7 8
| [UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.5];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:placeholder cache:YES];
[view1 removeFromSuperview];
[placeholder addSubview:view2];
[view2 removeFromSuperview];
[placeholder addSubview:view1];
[UIView commitAnimations]; |
Представление с именем “placeholder” добавлено как часть “self.view” контроллера представления. “view1” и “view2” — два разных представления, между которыми осуществляется переход (от первого ко второму и наоборот). В процессе анимации / перехода представление переворачивается, скрывая “view1” и открывая “view2“. Находящиеся за ним элементы частично просматриваются. Анимация длится 1,5 с (настройка в “setAnimationDuration“). Продолжить чтение »
Касания обрабатываются тремя методами:
- touchesBegan:
- touchesMoved:
- touchesEnded:
Чтобы получить доступ к касаниям, нужно включить в код три этих метода (или один–два). Сам код не представляет собой ничего сложного:
1 2 3 4 5 6
| - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
} |
Метод “touchesBegan:” будет вызываться при касании пользователем экрана одним пальцем. Каждый раз декларируется новый метод: для второго пальца, уха, носа, ноги…
Метод “touchesEnded:” будет вызываться по окончании касания.
А вот с методом “touchesMoved:” все не так просто, как может показаться на первый взгляд. Данный метод действительно вызывается при перемещении касающегося экрана пальца, но на реальном устройстве это происходит практически сразу же после “touchesBegan“. Почему? На симуляторе iPhone роль пальца играет мышь: нажимаете/отпускаете кнопку мыши (сенсорную панель) — вызываются методы “touchesBegan” и “touchesEnded“, но не “touchesMoved” (если указатель мыши не смещался). При касании экрана iPhone / iPod в 99% случаев координаты начала и конца касания не совпадают, поэтому вызывается еще и метод “touchesMoved“. Продолжить чтение »
В приложении, над которым я сейчас работаю, есть небольшая панель с дополнительной информацией мелким шрифтом поверх изображения. Внедрена она, само собой, как объект “IView“, вложенный в качестве подпредставления subview во второй “UIView“. Код загружает интерфейс панели из отдельного xib-файла, размещая его в основном представлении:
1 2 3 4 5 6
| NSArray *nibContent = [[NSBundle mainBundle] loadNibNamed:@"Box"
owner:self options:NULL];
UIView* overlayBox1 = [nibContent objectAtIndex:0];
[worksheet addSubview:overlayBox1];
overlayBox1.center = worksheet.center;
overlayBox1.frame = CGRectOffset(overlayBox1.frame, 0, -140); |
Однако результат получается не совсем адекватным — налицо сильная размытость. В редакторе IB и симуляторе ее не видно, а в iPhone панель выглядит просто ужасно (см. фото). Многочасовые эксперименты с настройками и цветами шрифтов ничего не дали — как оказалось, сглаживание текста тут не причем. Уже догадались, в чем проблема? Порой такие моменты сложно осознать, пока не столкнешься с ними сам… Продолжить чтение »
В моем приложении Postcards есть меню дизайна, где можно настраивать цвета объектов. Соответственно, мне понадобился цветоподборщик. Такой инструмент практически на любой платформе легко создать на основе любого изображения цветовой палитры. Выводим его на экран, чтобы пользователь мог щелкнуть по нужному участку, и выполняем запрос типа getPixelColorAtScreenLocation(x,y).
Еще в 1983 г. можно было проделывать это на ZX-Spectrum, а вот в Cocoa Touch такая возможность не предусмотрена (если ошибаюсь, поправьте). Какие есть варианты?
Продолжить чтение »
Столкнувшись с вопросом о способах доступа к телефонной книге в iPhone, я решил уделить полчаса изучению темы. С результатами все желающие могут ознакомиться ниже.
Для начала создаем новое приложение “View-Based Application“, присваивая ему имя “addressBook“.

Теперь нужно настроить для проекта четыре спецификатора IBOutlet и один IBAction. Не забудем и о заголовочных файлах для фреймворка адресной книги. Итак, откройте “addressBookViewController.h” и отредактируйте код, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #import
#import
#import
@interface addressBookViewController : UIViewController {
IBOutlet UIButton *button;
IBOutlet UILabel *firstName;
IBOutlet UILabel *lastName;
IBOutlet UILabel *number;
}
-(IBAction)getContact;
@end |
Продолжить чтение »
В предыдущей статье я рассказал о настройке модели, узнать об изменениях свойств которой можно с помощью наблюдения за ключом/значением. С предложенным методом связана одна теоретическая проблема, на которую уже указали читатели: за все изменения модели отвечает всего один метод — “observeValueForKeyPath:ofObject:change:context:“. Как следствие, наблюдая за несколькими свойствами, получаем скопление операторов “if/else” или посредством оператора выбора выясняем, какие же именно изменения только что произошли. Поразмышляв об этом, я вспомнил о предложении передавать селекторы в качестве контекста при обращении к “addObserver“. Рассмотрим, как именно это делается.
Идея заключается в том, что для каждого свойства, за которым идет наблюдение, к запросу “addObserver” добавляется селектор (в параметрах контекста). В методе “observeValueForKeyPath…” выполняем селектор, например, запускаем метод. Тем самым мы привязываем каждое свойство к определенному методу, который и будет вызываться при изменении свойства.
Принимаемся за конструирование. Первая модель относительно проста:
1 2 3 4 5 6 7 8 9 10 11
| #import
@interface Model : NSObject {
BOOL propertyA;
BOOL propertyB;
}
@property BOOL propertyA;
@property BOOL propertyB;
@end |
Продолжить чтение »
В этом уроке мы создадим простые часы с поддержкой ориентации экрана: при повороте iPhone они тоже будут менять положение. Предполагается, что читатели уже знакомы с основами iPhone SDK.
Для начала нам потребуется метка для часов, фоновое изображение, ну и таймер, конечно. Чтобы редактор Interface Builder смог работать с переменными типа outlet, предварительно их нужно объявить через код. Я покажу, как это делается.
Немного кода.
Отредактируйте контроллер “SimpleClockViewController.h“, как показано ниже:
1 2 3 4 5 6 7 8
| #import <UIKit/UIKit.h>
@interface SimpleClockViewController : UIViewController {
IBOutlet UILabel* clockLabel;
NSTimer *myTicker;
}
@end |
Объект “myTicker” будет отвечать за обновление “clockLabel” (этот код мы внедрим позднее).
Теперь перетащите в проект файл “background_image.png” (см. рис. ниже). Рисунок для фона можно скачать [здесь]. Продолжить чтение »
Предлагаю один из способов построения круговой диаграммы с помощью последней версии iPhone SDK. Оговорюсь сразу, что авторитетным источником информации по программированию себя не считаю. Тем не менее, предлагаю класс, который поможет в создании векторной графики с использованием UIKit и Quartz. Продолжить чтение »
CocoaTouch с самого начала создавалась с прицелом на парадигму MVC. Практически все шаблоны, представления и их контроллеры для пользователя уже готовы. Ключевые классы — “UIView” и “UIViewController“. Во многих случаях метод “UIView” применим сам по себе — с добавлением элементов пользовательского интерфейса в общий “UIView” в редакторе IB. Для создания собственных функций добавляем подклассы к “UIViewController“. Спецификаторы “IBOutlet” позволяют связывать элементы пользовательского интерфейса с представлением, обеспечивая к ним доступ.
А как быть с понятием “Model”? О нем информации я практически не нашел. В уроках по программированию с моделью предпочитают не работать, набирая код непосредственно в контроллерах.
Добившись, как мне показалось, неплохих результатов с реализацией, я предлагаю их здесь для обсуждения и оценки. Изложу вкратце. Я создаю класс “Singleton“, расширяющий “NSObject” для моей модели. Потом посредством наблюдения за ключами/переменными узнаю об обновлениях. Это во многом напоминает “ModelLocator” из “Cairngorm“, если кому-то приходилось работать с ним во “Flex“.
Для начала создадим проект с парой представлений. Одно из них позволит пользователю менять значение. Это значение задается для модели, которая, в свою очередь, запускает изменение в другом представлении. Для этой цели вполне подойдет шаблон “Utility Application“. Итак, создаем на его основе проект и присваиваем ему имя “MVC“. (В принципе, имя может быть любым, но для удобства работы с уроком лучше его продублировать.) Продолжить чтение »
|
Последние комментарии
пока я не получил лицензию разработчика, но уже очень хочу...
vodos, да...
Злые вы,...
iPhone Application writes data to a text file,...
ошибка...