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

Привет я хочу создать динамический UISegmented View с более чем 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)")
}

4 ответа

Решение

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

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

Сначала добавьте контроллер сегмента для просмотра с прокруткой. и контроллер сегмента имеет имя метода 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.

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

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

segment.apportionsSegmentWidthsByContent = YES;

Свифт:

Что-то вроде,

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

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

Вы должны ссылаться на этот пост также, если он может помочь!

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

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

Это очень сложно (не невозможно) управлять UISegmenteControll с UIScrollview

Лучший вариант - использовать другой контроллер или библиотеку вместо контроллера UISegment.

Я упоминаю ссылку библиотеки, которую я использовал в одном из моих проектов для создания динамического контроллера UISegment

PageMenu

https://github.com/PageMenu/PageMenu

Надеюсь, эта библиотека поможет вам

Спасибо

Другие вопросы по тегам