Как я могу включить выбор нескольких сегментов UISegmentedControl?

Допустим, мой UISegmentedControl имеет 8 пронумерованных сегментов. Я бы хотел, чтобы пользователь мог одновременно включать 2, 3 или более из них. Переключение их. По сути, как бит в байте. Это возможно? Я считаю, что это на обычной Mac OS X, но я не могу найти способ сделать это в iPhone SDK.

Если мне нужно смоделировать это, поместив кнопки в представление, есть ли способ сделать следующее:

  1. Скруглить углы представления так, чтобы оно выглядело как «полоса» стиля UISegmentedControl?
  2. Использовать встроенный фон кнопок в стиле «полосы»?
  3. Придать кнопкам тень, как у всего стиля «полоса»? (не текст)

person dlamblin    schedule 22.06.2009    source источник


Ответы (6)


Это невозможно при использовании UIKit. Я бы рекомендовал создать настраиваемый элемент управления или массив из UISwitch элементов управления, представляющих каждый из параметров в вашем UISegmentedControl.

person pix0r    schedule 22.06.2009

Обновление: пользовательский элемент управления, о котором я упоминал здесь, больше не работает в iOS 13.

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

https://github.com/yonat/MultiSelectSegmentedControl

Это подкласс UISegmentedControl, что удобно. Я его здесь раздвоил:

https://github.com/stewartmacdonald/MultiSelectSegmentedControl

и добавил несколько примеров кода в ReadMe и добавил метод, который позволяет вам получить NSArray заголовков всех выбранных сегментов.

person Stewart Macdonald    schedule 03.06.2015
comment
MultiSelectSegmentedControl очень приятно. Он расширяет UISegmentedControl, поэтому все его методы доступны. - person Ferran Maylinch; 10.10.2017

Я думаю, что самый простой способ - создать собственный сегментированный элемент управления с помощью UIButton.

Марко

person Marco    schedule 22.06.2009
comment
Один из способов сделать это, который я сделал в приложениях для доставки, - использовать UILabel с закругленными краями и поместить внутрь прямоугольные UIButton. Таким образом можно получить скругленные края для комбинированного элемента управления. Наслаждаться. - person Damien Del Russo; 13.02.2012

Кажется, теперь есть способ сделать это в XCode. В Инспекторе атрибутов есть раздел с сегментом, заголовком, изображением, поведением. Варианты поведения - «Включено» и «Выбрано». Вы можете выбрать «Выбрано» для нескольких сегментов.

person Blamdarot    schedule 08.02.2012
comment
Я не думаю, что это работает. В Xcode, когда я выбираю Selected для сегмента, все остальные сегменты становятся невыделенными. Кроме того, методы для UISegmentedControl включают setEnabled: forSegmentAtIndex, но не setSelected: forSegmentAtIndex (что было бы удобно). Я пытаюсь сделать то же самое, что и OP, и, похоже, мне нужно создать настраиваемый элемент управления. Какая-то ирония, поскольку вспомогательные кнопки в самом верху Xcode - это именно то, для чего я стреляю (хотя приложение для Mac). - person Damien Del Russo; 13.02.2012

Я рекомендую вам попробовать https://github.com/tayhalla/THSegmentedControl
это фактический подкласс of UISegmentedControl, поэтому он прекрасно сочетается с Интерфейсным разработчиком и всем остальным.

person Ali    schedule 15.10.2014
comment
Это подкласс UIControl, а не UISegmentedControl - person Amr Lotfy; 10.05.2015

Ответ для тех, кто перейдет сюда из Google: теперь можно изменить поведение UISegmentedControl. Перейдите в Inspector -> Mode -> Select Any вместо Select One. Чтобы узнать, какие сегменты выбраны, я предлагаю создать такую ​​функцию:

extension UISegmentedControl {
    func getBarState() -> [Bool] {
        var states: [Bool] = []
        for i in 0..<segmentCount {
            states.append(isEnabledForSegment(forSegment: i))
        }
        return states
    }
}

Поскольку Google привел меня сюда во время поиска версии OSX, я также опубликую рабочее решение для NSSegmentedControl:

extension NSSegmentedControl {
    func getBarState() -> [Bool] {
        var states: [Bool] = []
        for i in 0..<segmentCount {
            states.append(isSelected(forSegment: i))
        }
        return states
    }
}
person AlexPera    schedule 28.03.2020
comment
Это было бы здорово, но в Инспекторе атрибутов (или в других) Xcode 11.5 я не могу найти режим - ›Выберите любой / тот, который вы упомянули. Что мне не хватает? - person cdf1982; 04.06.2020