Июн 03

Касания обрабатываются тремя методами:

  • 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“. Продолжить чтение »

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

Июн 01

В приложении, над которым я сейчас работаю, есть небольшая панель с дополнительной информацией мелким шрифтом поверх изображения. Внедрена она, само собой, как объект “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 панель выглядит просто ужасно (см. фото). Многочасовые эксперименты с настройками и цветами шрифтов ничего не дали — как оказалось, сглаживание текста тут не причем. Уже догадались, в чем проблема? Порой такие моменты сложно осознать, пока не столкнешься с ними сам… Продолжить чтение »

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

Май 31

screen-11В моем приложении Postcards есть меню дизайна, где можно настраивать цвета объектов. Соответственно, мне понадобился цветоподборщик. Такой инструмент практически на любой платформе легко создать на основе любого изображения цветовой палитры. Выводим его на экран, чтобы пользователь мог щелкнуть по нужному участку, и выполняем запрос типа getPixelColorAtScreenLocation(x,y).

Еще в 1983 г. можно было проделывать это на ZX-Spectrum, а вот в Cocoa Touch такая возможность не предусмотрена (если ошибаюсь, поправьте). Какие есть варианты?

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

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

Май 30

Столкнувшись с вопросом о способах доступа к телефонной книге в iPhone, я решил уделить полчаса изучению темы. С результатами все желающие могут ознакомиться ниже.

Для начала создаем новое приложение “View-Based Application“, присваивая ему имя “addressBook“.

screen-capture-300x225

Теперь нужно настроить для проекта четыре спецификатора 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

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

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

Май 30

В предыдущей статье я рассказал о настройке модели, узнать об изменениях свойств которой можно с помощью наблюдения за ключом/значением. С предложенным методом связана одна теоретическая проблема, на которую уже указали читатели: за все изменения модели отвечает всего один метод — “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

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

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

Май 30

iphone_clockВ этом уроке мы создадим простые часы с поддержкой ориентации экрана: при повороте 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” (см. рис. ниже). Рисунок для фона можно скачать [здесь]. Продолжить чтение »

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

Май 29

3288079379_da758c4fd9_tПредлагаю один из способов построения круговой диаграммы с помощью последней версии iPhone SDK. Оговорюсь сразу, что авторитетным источником информации по программированию себя не считаю. Тем не менее, предлагаю класс, который поможет в создании векторной графики с использованием UIKit и Quartz. Продолжить чтение »

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

Май 28

CocoaTouch с самого начала создавалась с прицелом на парадигму MVC. Практически все шаблоны, представления и их контроллеры для пользователя уже готовы. Ключевые классы — “UIView” и “UIViewController“. Во многих случаях метод “UIView” применим сам по себе — с добавлением элементов пользовательского интерфейса в общий “UIView” в редакторе IB. Для создания собственных функций добавляем подклассы к “UIViewController“. Спецификаторы “IBOutlet” позволяют связывать элементы пользовательского интерфейса с представлением, обеспечивая к ним доступ.

А как быть с понятием “Model”? О нем информации я практически не нашел. В уроках по программированию с моделью предпочитают не работать, набирая код непосредственно в контроллерах.

Добившись, как мне показалось, неплохих результатов с реализацией, я предлагаю их здесь для обсуждения и оценки. Изложу вкратце. Я создаю класс “Singleton“, расширяющий “NSObject” для моей модели. Потом посредством наблюдения за ключами/переменными узнаю об обновлениях. Это во многом напоминает “ModelLocator” из “Cairngorm“, если кому-то приходилось работать с ним во “Flex“.

Для начала создадим проект с парой представлений. Одно из них позволит пользователю менять значение. Это значение задается для модели, которая, в свою очередь, запускает изменение в другом представлении. Для этой цели вполне подойдет шаблон “Utility Application“. Итак, создаем на его основе проект и присваиваем ему имя “MVC“. (В принципе, имя может быть любым, но для удобства работы с уроком лучше его продублировать.) Продолжить чтение »

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

Май 28

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

Для начала определяемся с тем, какие языки будет поддерживать ваше приложение. Весь текст (на разных языках), изображение, видео, звуки необходимо собрать в файл ресурсов или в языковую директорию. Для перевода текста можно воспользоваться инструментом [Google]. Даже если поддержка разных языков для приложения не планировалась, почему бы ни попробовать!

Смена пользователем языка выполняется командой “Settings -> General -> International -> Language“. При этом меняется и название приложения iPhone (если предусмотрена поддержка этой функции).

Подготовка к интернационализации.

В тестовом проекте мы обеспечим поддержку английского и итальянского языков. Создайте в Xcode новый проект на базе любого шаблона. После этого откройте его через “Finder” и создайте два каталога — “en.lproj” и “it.lproj“. Это будет языковой проект приложения. Все файлы ресурса на английском языке будут храниться в папке “en.lproj“, на итальянском — соответственно, в “it.lproj“. Файлы ресурса с локализуемой строкой еще называют string-файлами. По умолчанию именем для них является “Localizable.strings“. Итак, создаем Продолжить чтение »

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

Май 28

В этой статье мы создадим пользовательский форматер для отображения определенных локальных данных. В процессе урока нам предстоит создать новый класс для форматирования телефонных номеров с соответствии с параметрами пользовательской локали. Если локаль настроена на “en_US“, телефонные номера выводятся в виде 1(111)111-1111.

NSFormatter.

Первым шагом к пользовательскому форматеру станет создание нового класса, наследующего “NSFormatter“. В Xcode выполните File -> New File -> NSObject subclass. Свой файл я назвал “PhoneNumberFormatter“. Создаваемый класс наследует “NSObject“. Удалите лишнее и перестройте его на “NSFormatter“. В результате заголовочный файл будет выглядеть так:

1
2
3
4
5
6
7
8
9
10
11
12
#import <UIKit/UIKit.h>

@interface PhoneNumberFormatter : NSFormatter {

NSLocale *locale;
}

@property (nonatomic, copy) NSLocale *locale;

- (NSString *) stringFromPhoneNumber:(NSNumber *)aNumber;

@end

У нас есть свойство локали, предусматривающее отслеживание текущих настроек пользователя, и метод, принимающий “NSNumber” и возвращающий отображение строки. Продолжить чтение »

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