Главная » iPhone » Элементы управления iPhone

0

Элементы управления (controls)— это разнообразные служебные классы, созданные для расширения возможностей пользовательского интерфейса приложений. UIKit поддерживает множество различных типов элементов управления. Некоторые из них являются весьма характерными для определенных приложений (например. UlScrubberControl), в то время как другие достаточно глубоко скрыты внутри классов более высокого уровня, которые не требуется использовать напрямую большинству разработчиков (например. UI Remo veCon t г о 1).

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

Элементы управления — это практическое расширение классов, порожденных от UlTableCell, особенно ячейки таблицы, ячейки таблицы предпочтений и другие подобные классы. Некоторые также могут быть использованы с панелями навигации и объектами других типов. Существуют три компактных элемента управления общего назначения для большинства приложений. Они будут описаны в этом разделе. Другие объекты наподобие элементов управления, например, индикаторы прогресса и выборщики, отдельно рассмотрены в соответствующих разделах этой главы.

Элементы управления порождены от базового класса uicontrol, который в свою очередь порожден от класса uiview. Это означает, что он обладает множеством таких же свойств, как и другие классы вида, с которыми вы уже познакомились. Элементы управления инициализируются с областью вида и ведут себя по большей части так же, как и объекты uiview.

Сегментированные элементы управления

Сегментированные элементы управления (segmented controls) заменяют переключатели из настольных операционных систем, а вместо них предоставляют интерфейс, схожий с тем, который имеется на передней панели посудомоечной машины. Пользователь видит панель инструментов, на которой нажатие одной кнопки приводит к поднятию всех остальных. Сегментированные элементы управления полезны при ограниченном количестве связанных вариантов выбора, доступных для одного элемента.

Создание элемента управления

Сегментированный элемент управления инициализируется с областью вида. Координаты фрейма это смещение вида, хранящего данный элемент управления, являющийся обычно таблицей предпочтений или панелью навигации:

UISegmentedControl *segCtl = ( [UlSegmentedControl alloc] initwithFrame:CGRectMake(70.0, 8.0, 180.0, 30.0) withStyle: 0 withltems: NULL ];

В зависимости от того, где используются элементы управления, можно выбрать один из трех различных стилей сегментированного элемента управления (табл. 7.1).

Таблица 7.1

Стиль

Описание

0

Большие белые кнопки с серой границей, подходит для ячеек предпочтений

1

Большие белые кнопки с черной границей, подходит для ячеек таблицы

2

Маленькие серые кнопки, подходит для панелей навигации

Каждый сегмент в пределах сегментированного вида представлен кнопкой, содержащей метку или изображение. Для каждого возможного варианта выбора должен быть создан отдельный сегмент. Сегментов может быть столько, сколько поместится на экране, но в один момент времени пользователь может выбрать только один сегмент. Варианты выбора для элемента управления "mood" могут выглядеть так, как в приведенном далее фрагменте кода: [ segCtl insertSegment:0 withTitle:@"Happy" animated: YES ]; [ segCtl insertSegment:1 withTitle:@"Sad" animated: YES ]; [ segCtl insertSegment:2 withTitle:@"Mad" animated: YES ];

Данный код добавляет на сегментированный элемент управления три кнопки: Happy. Sad и Mad. Каждой кнопке присваивается ее собственный номер сегмента: 0, 1,2.

Сегменты могут быть удалены.

Чтобы удалить какой-либо отдельный сегмент, воспользуйтесь методом

removeSegmentAtIndex:

t segCtl removeSegmentAtIndex: 0 animated: YES ];

Чтобы удалить все сегменты за раз. вызовите метод removeAHSegments. Это приведет к тому, что элемент управления скроет свои кнопки:

[ segCtl removeAllSegments ];

Если когда-либо понадобится изменить заголовок какой-либо кнопки, воспользуйтесь методом setTitle:

[ segCtl setTitle:@"Glad" forSegmentAtIndex: 0 ];

Изображения

Помимо текста сегментированные элементы управления могут также содержать на кнопках изображения. Любые используемые изображения должны храниться в программной папке приложения, как это обсуждалось в главе 2. Изображение может быть добавлено к существующему сегменту с помощью метода set Image:

[ segCtl setlmage: [ Ullmage applicationlmageNamed:@"happy.png" ] forSegmentAt Index: 0

];

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

[ segCtl insertSegment: О

withlmage: [ Ullmage applicationNames:@"happy.png" ] animated: YES

];

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

Мгновенные щелчки

По умолчанию сегментированный элемент управления позволяет пользователю выбирать один вариант за раз и удерживать эту кнопку нажатой до тех пор, пока не будет выбран другой вариант. Такое поведение можно немного поменять на автоматическое отпускание кнопки сразу же после ее нажатия. Для реализации данного поведения воспользуйтесь методом setMomentary: [ segCtl setMomentary: YES ];

Отображение элемента управления

После того как элемент управления будет настроен, его можно отобразить путем добавления в подвид к объекту любого типа, который сможет его принять. Такими объектами могут стать ячейки таблицы, панели навигации и другие объекты вида:

[ parentView addSubview: segCtl ];

Считывание элемента управления

Чтобы прочитать текущее значение сегментированного элемента управления, воспользуйтесь методом selectedSegment. Этот метод возвращает целое число, соответствующее номеру сегмента, выделенному на текущий момент. Данное значение основано на числе, присвоенном ему, когда он впервые был вставлен в элемент управления: int х = [ segCtl selectedSegmentlndex ];

Простого считывания значения элемента управления будет вполне достаточно для большинства случаев, например, как при работе с таблицами предпоч- ений, которым необходимо считывать его, только когда пользователь ухо- .ит со страницы. В некоторых же случаях при нажатии кнопки необходимо оправлять уведомление.

.ля такой дополнительной функциональности создайте подкласс : SegmentedControl И подмените методы mouseDown ИЛИ mouseUp вашего •лемента управления (в зависимости от того, когда вы хотите получать > -едомление). Эти события можно использовать для инициирования чтения г in любого другого необходимого действия в момент нажатия кнопки. Вот

аблон для этого: !. .terface MySegmentedControl : UlSegmentedControl

-   (void)mouseDown:(struct _ _GSEvent *)event;

-   (void)mouseUp:(struct _ _GSEvent *)event; @end

Теперь подмените метод mouseDown или метод mouseup так, чтобы значение можно было читать тогда, когда кнопка в этом классе нажата или отпущена:

@implementation MySegmentedControl

-   (void)mouseDown:(struct GSEvent *)event { int x = [ self selectedSegment ];

/* Здесь что-нибудь сделайте */

}

@end

Переключающий элемент управления

‘Гак же, как сегментированный элемент управления заменяет переключатель, переключающий элемент управления (switch control) заменяет флажок. Переключающие элементы управления используются в панелях предпочтений для включения или выключения каких-либо возможностей.

Переключающий элемент управления значительно проще в использовании, но, тем не менее, может быть настроен до определенной степени.

Создание элемента управления

Переключающий элемент управления инициализируется с помощью стандартного метода initwithFrame. Данный метод определяет его размер и координаты относительно принимающего класса, например, ячейки таблицы или панели навигации:

UlSwitchControl *switchControl = [ [ UlSwitchControl alloc ] initwithFrame: CGRectMake(170.Of, 5.Of, 120.Of, 30.Of)

] ;

Если такой переключатель является достаточно опасным и может повлиять на быстродействие системы или же послужить причиной других серьезных последствий, то лучше пометить его предупреждающими цветами. Можно заставить объект UlSwitchControl использовать альтернативный набор цветов, отображаться при активации в ярко-оранжевом цвете.

Для этого воспользуйтесь при создании элемента управления методом

setAlternateColors:

[ switchControl setAlternateColors: YES ];

Отображение элемента управления

После создания и инициализации элемента управления его можно отобразить, добавив его к объекту вида, например, ячейке таблицы или панели навигации:

[ tableCell addSubview: switchCtl ];

Считывание элемента управления

Переключающий элемент управления возвращает значение с плавающей запятой 0,0, если он выключен, и ненулевое значение, если он включен. Это значаение можно получить путем вызова метода value данного объекта:

float switchValue = [ switchControl value ];

Большинству приложений необходимо считывать переключающее значение при уходе со страницы, например, в таблицах предпочтений. Чтобы считать значение такого элемента управления в момент его переключения, нужно перехватить его событие mouseDown или mouseup. Чтобы подменить эти методы, унаследуйте uiswitchcontroi. Например:

@interface MySwitchControl : UlSwitchControl {

}

-   (void)mouseUp:(struct ____ SSEvent *)event;

@end

Когда такой элемент управления переключается, уведомляется метод mouseup, позволяя тем самым мгновенно предпринять какое-либо действие:

@implementation UIMySwitchControl

-   (void)mouseUp:(struct _ j3SEvent *)event { [ super mouseUp: event];

float switchValue = [ self value ]; /* Здесь что-нибудь сделайте */

}

@end

Источник: Здзиарски Дж. iPhone. Разработка приложений с открытым кодом: Пер„с англ. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2009. — 368 е.: ил.

По теме:

  • Комментарии