Прокрутите динамический UISegmentedControl в Swift 3

Привет, я хочу создать динамическое представление UISegmented с более чем 20 элементами. Я пробовал, но вывод такой.

введите здесь описание изображения

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

Контроллер просмотра

override func viewDidLoad() {
    super.viewDidLoad()

    let items = ["All Fruits", "Orange", "Grapes", "Banana",  "Mango", "papaya", "coconut", "django"]
    let filtersSegment = UISegmentedControl(items: items)
    filtersSegment.frame = CGRect.init(x: 10, y: 60, width: 300, height: 50)
    filtersSegment.selectedSegmentIndex = 0
    filtersSegment.tintColor = UIColor.black
    filtersSegment.addTarget(self, action: #selector(self.filterApply), for: UIControlEvents.valueChanged)
    self.view.addSubview(filtersSegment)
}

@objc private func filterApply(segment:UISegmentedControl) -> Void {
    print("Selected Index : \(segment.selectedSegmentIndex)")
}

person Sathya Baman    schedule 02.10.2017    source источник
comment
Используйте прокрутку. Добавьте контроллер сегмента в scrollview.   -  person Krunal    schedule 02.10.2017
comment
Используйте что-то другое, кроме сегментированного элемента управления. Возможно, вид выбора.   -  person rmaddy    schedule 02.10.2017
comment
Вставьте элемент управления сегментом в scrollView. Также ограничьте элемент управления сегментом, чтобы отображать видимый текст 3,4, установив его рамку.   -  person Jamil    schedule 02.10.2017
comment
Вероятно, это не очень удобно для пользователя, если сегментированный элемент управления содержит 20 элементов, вам может потребоваться выбрать для него другое подходящее представление, например, представление выбора или представление таблицы...   -  person Ahmad F    schedule 02.10.2017


Ответы (3)


Для достижения вашей цели лучше использовать другой контроллер, а не контроллер сегмента.

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

Сначала добавьте контроллер сегмента для просмотра прокрутки. а контроллер сегмента имеет имя метода setWidth(_ width: CGFloat, forSegmentAt segment: Int) для установки ширины каждого сегмента по индексу.

так вот я пишу свою логику.

    var scrollViewWidth:Float = 0.0
    let items  = ["All Fruits", "Orange", "Grapes", "Banana",  "Mango", "papaya", "coconut", "django"]
    for (index, element) in items.enumerated() {
        let size = element.size(attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 20.0)]) //you can change font as you want
        segmentCon.setWidth(size.width, forSegmentAt: index)
        scrollViewWidth = scrollViewWidth + Float(size.width)
    }

    // Here you can set content width of UIScollView by use of "scrollViewWidth"
    // scrollView.contentSize = CGSize(width: scrollViewWidth, height: 40)// height should whatever you want.
person iPatel    schedule 02.10.2017
comment
попробовал ваше решение, нормально для большого количества сегментов (~ ›8), но как управлять шириной, если у меня всего 2-3 сегмента, в этом случае он уменьшает ширину и сдвигает все сегменты в крайнее левое из сегментаView. - person Mohit G.; 04.10.2019

Вы можете попробовать, как

[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];

segment.apportionsSegmentWidthsByContent = YES;

Свифт:

Что-то типа,

   UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
   segment.apportionsSegmentWidthsByContent = true

и вы можете получить свой сегментированный контроль в прокрутке. Но с UISegmentedControl не следует использовать более четырех или пяти сегментов. Его основная цель - показать три или четыре варианта! Вы должны попробовать другой механизм для достижения своей цели!

Вам также следует обратиться к этому сообщению если это может помочь!

person Ketan Parmar    schedule 02.10.2017

Попробуйте этот https://github.com/lestadNew/SASScrolletSegment, я не нахожу решения и пишу собственные стручки какао

Надеюсь, это поможет вам

введите здесь описание изображения

person AndrewSas    schedule 16.05.2018
comment
если вы хотите обновить этот CocoaPods, напишите мне, и я исправлю - person AndrewSas; 16.05.2018