Используя сегментированные средства управления
Можно создать и сконфигурировать сегментированное управление программно или использующий Интерфейсного Разработчика. Можно также взаимодействовать с управлением программно, например чтобы установить выбор, и включить и отключить сегменты.
Создание и конфигурирование сегментированного управления
Существует много аспектов сегментированного управления, которое необходимо сконфигурировать: его режим отслеживания — путь, которым обрабатываются выборы; сколько сегментов это содержит; и свойства каждого сегмента. Сегментированные средства управления поддерживают три различных режима отслеживания, указанные следующими константами:
Только одна кнопка может быть нажата
Любая кнопка может быть нажата
Сегменты выбраны только при отслеживании
NSSegmentSwitchTrackingSelectOne
NSSegmentSwitchTrackingSelectAny
NSSegmentSwitchTrackingMomentary
Конфигурирование сегментированного управления в интерфейсном разработчике
Самый простой способ создать сегментированное управление находится в Интерфейсном Разработчике. Для этого просто перетащите сегментированное управление от палитры Cocoa-Controls до Вашего окна. Используйте области Атрибутов окна Inspector для конфигурирования атрибутов сегментированного управления. Это:
Размер. Указывает размер элемента управления. Как другие средства управления, сегментированные средства управления прибывают в три размера: регулярный, маленький, и мини-.
Выбор. Указывает режим отслеживания сегментированного управления. Возможные варианты:
Единственный. Это соответствует константе
NSSegmentSwitchTrackingSelectOne
и указывает, что может быть выбран только один сегмент.Многократный. Это соответствует константе
NSSegmentSwitchTrackingSelectAny
и указывает, что может быть выбран любой сегмент.Мгновенный. Это соответствует константе
NSSegmentSwitchTrackingMomentary
и указывает, что сегменты выбраны только при отслеживании.
Текстовое Направление. Указывает направление любого текста метки. Это принимает значение по умолчанию к Естественному, указывая текстовый собственный компонент направления текущих языковых настроек пользователя.
Сегменты. Указывает число сегментов в сегментированном управлении.
Тег. Указывает тег, идентифицирующий сегментированное управление.
Ширины сегмента. Указывает ширину отдельных сегментов в сегментированном управлении. По умолчанию сегменты автоизмерены для адаптации их содержанию. Если Вы хотите гарантировать фиксированную ширину для каждого сегмента, можно указать ту ширину здесь. Можно ввести в определенной ширине, или можно использовать В среднем и Макс. кнопки, чтобы вычислить текущий средний или максимальный сегмент width, соответственно, и установить фиксированный сегмент width в то число.
Определенные атрибуты должны быть сконфигурированы индивидуально для каждого сегмента. Для конфигурирования сегмента дважды щелкните для выбора его. Окно Inspector для NSSegmentedCell
позволяет Вам сконфигурировать эти атрибуты:
Метка. Указывает текстовую метку сегмента, если таковые имеются.
Тег. Указывает тег, идентифицирующий отдельный сегмент.
Значок. Файл, содержащий изображение для сегмента для отображения. Сегмент должен иметь или значок или текстовую метку, но не обоих. См. Инструкции по Элементу UI: Средства управления в Инструкциях по Интерфейсу пользователя OS X.
Конфигурирование сегментированного управления программно
Можно также создать сегментированное управление программно. Одно из самых простых приложений сегментированного управления является своим использованием в качестве компактной альтернативы группе переключателей. Здесь, пользователь делает единственный выбор от многих опций. Перечисление 1 показывает код для создания управления как один найденный в iPhoto.
Перечисление 1 основанный на простом тексте пример
// Set the number of segments |
[segControl setSegmentCount:4]; |
// Set titles for each segment |
[segControl setLabel:@"Import" forSegment:0]; |
[segControl setLabel:@"Organize" forSegment:1]; |
[segControl setLabel:@"Edit" forSegment:2]; |
[segControl setLabel:@"Book" forSegment:3]; |
По умолчанию сегментированное управление авторазмеры для адаптации. Чтобы программно отметить сегмент как автокалибровку установите ее ширину в 0
. Если какие-либо сегменты отмечены как автокалибровка, то ширины корректируются так, чтобы все сегменты были выведены на экран полностью в управлении.
Если Вы хотите гарантировать фиксированный размер, возможно с каждым сегментом та же ширина, необходимо установить ширину каждого сегмента индивидуально, как показано в Перечислении 2.
Сегменты Listing 2 Setting для равенства ширинам
[segControl setWidth:70 forSegment:0]; |
[segControl setWidth:70 forSegment:1]; |
[segControl setWidth:70 forSegment:2]; |
[segControl setWidth:70 forSegment:3]; |
Объединение кода от Перечисления 1 и Перечисления 2 производит контроллер как показанный на рисунке 1.
Вам решать, чтобы гарантировать, что каждый сегмент достаточно широк для своего содержания. Если изображение является слишком большим для адаптации, оно отсекается справа. Если текст или комбинация текста и изображения, слишком широк для сегмента, текст является усеченным использованием замещающего знака.
Некоторые методы, которых можно потребовать для конфигурации (например, режим отслеживания) реализованы только в NSSegmentedCell
, таким образом, необходимо получить доступ к ячейке управления, как в следующем примере:
[[segControl cell] setTrackingMode:NSSegmentedSwitchTrackingSelectAny]; |
Вместе с другими средствами управления, NSSegmentedControl
доступно в трех размерах — регулярный, маленький, и мини-(несмотря на то, что текстурированные окна только поддерживают сегментированные средства управления регулярного размера). Размер также сконфигурирован ячейкой:
[[segControl cell] setControlSize:NSMiniControlSize]; |
Объединение сегментов с различными атрибутами
Нет никакого требования что все сегменты в сегментированном управлении иметь тот же тип. Следующий код создает сегментированное управление как найденный в iCal, как проиллюстрировано на рисунке 2:
[segControl setSegmentCount:5]; |
// Configure each segment |
[segControl setImage:MYLeftArrowImage forSegment:0]; |
[segControl setLabel:@"Day" forSegment:1]; |
[segControl setLabel:@"Week" forSegment:2]; |
[segControl setLabel:@"Month" forSegment:3]; |
[segControl setImage:MYRightArrowImage forSegment:4]; |
Не возможно, однако, указать различные режимы отслеживания для различных сегментов. Вы не можете указать мгновенный выбор для некоторых сегментов и поведение переключателя для других. Таким образом, несмотря на то, что управление на рисунке 2looks как один найденный в iCal, это не может функционировать таким же образом (т.е. где стрелки выбраны на мгновение и усовершенствование через календарь, и одна из текстовых кнопок остается постоянно выбранной для выбора параметра экрана). Исключение к этому правилу является сегментом, содержащим меню. Сегмент с меню всегда действует как мгновенное управление и не может быть включен, даже если управление сконфигурировано, поскольку “избранный один” или “выбирают любого”.
Несмотря на то, что возможно установить и метку и изображение для сегмента, сегмент должен иметь один или другой, как описано в Инструкциях по Интерфейсу пользователя OS X.
Взаимодействие с сегментированным управлением
Существует много методов для взаимодействия с сегментированным управлением программно — например, чтобы изменить выбранный сегмент, и включить и отключить отдельные сегменты.
Можно узнать, который сегмент, если таковые имеются, выбран, с помощью selectedSegment
. Если никакой сегмент не выбран, возвраты метода –1
. Когда управление сконфигурировано для разрешения множественных выборов, можно узнать, выбран ли отдельный сегмент с помощью isSelectedForSegment:
. С другой стороны можно установить использование выбора setSelectedSegment:
и setSelected:forSegment:
.
Точно так же можно включить и отключить отдельные сегменты в использовании управления setEnabled:forSegment:
. Выполнение так может быть полезным для ограничения пользователя созданием выборов, которые допустимы для текущей среды, как проиллюстрировано ниже.
Теги и действие Target
Как с любым управлением, можно поставить цель сегментированного управления, действие и тег. Каждый сегмент в управлении, однако, может иметь свой собственный тег. Когда по любому сегменту в управлении щелкают, сообщение действия отправляется в цель — если сегмент не отключен или имеет только меню. Можно определить, по какому сегменту щелкнули путем нахождения тега для выбранного сегмента, как показано в следующем примере:
- (void)awakeFromNib |
{ |
[segControl setSegmentCount:3]; |
[[segControl cell] setTag:0 forSegment:0]; |
[[segControl cell] setTag:1 forSegment:1]; |
[[segControl cell] setTag:2 forSegment:2]; |
[segControl setTarget:self]; |
[segControl setAction:@selector(segControlClicked:)]; |
} |
- (IBAction)segControlClicked:(id)sender |
{ |
int clickedSegment = [sender selectedSegment]; |
int clickedSegmentTag = [[sender cell] tagForSegment:clickedSegment]; |
//... |
} |
Ячейка selectedSegment
метод возвращает сегмент, по которому в последний раз щелкнули. Это означает, что можно узнать, по какому сегменту щелкнули, даже когда режим отслеживания NSSegmentSwitchTrackingSelectAny
или NSSegmentSwitchTrackingMomentary
. Обратите внимание на то, что, если сегмент имеет только меню, меню выведено на экран, когда пользователь щелкает по сегменту. Если сегмент имеет и меню и действие, действие инициировано, когда пользовательские щелчки и меню выведены на экран, когда пользователь щелкает и содержит.