2017-10-02 5 views
2

Bonjour, je souhaite créer une vue UISegmented dynamique avec plus de 20 éléments. J'ai essayé, mais la sortie est comme ça.Scroll dynamic UISegmentedControl dans Swift 3

enter image description here

le texte est découpé en tranches pas visible entièrement. Je veux qu'il défile vers la gauche et la droite et affiche également le texte intégral. quelqu'un peut-il m'aider à résoudre ce problème. TNX

View Controller

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)") 
} 
+0

Utilisez scrollview. Ajoutez votre contrôleur de segment dans scrollview. – Krunal

+0

Utilisez autre chose qu'un contrôle segmenté. Peut-être une vue sélecteur. – rmaddy

+0

Intégrez votre contrôle de segment dans un scrollView. Limitez également le contrôle de segment pour afficher 3,4 du texte visible en définissant son cadre. – Jamil

Répondre

1

Il est préférable d'utiliser un autre contrôleur plutôt que contrôleur de segment pour atteindre votre objectif.

Mais si vous utilisez un contrôleur de segment seulement, vous devez ajouter un contrôleur de segment pour faire défiler la vue, car les titres sont dynamiques, donc nous ne pouvons pas reconnaître comment il est large, c'est pourquoi.

D'abord ajouter un contrôleur de segment pour faire défiler la vue. et le contrôleur de segment a le nom de méthode setWidth(_ width: CGFloat, forSegmentAt segment: Int) pour définir la largeur de chaque segment à l'index. Donc, ici, j'écris ma logique.

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. 
1

Vous pouvez essayer comme

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

segment.apportionsSegmentWidthsByContent = YES; 

Swift:

Quelque chose comme,

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

et vous pouvez prendre votre contrôle segmentée en scrollview. Mais avec UISegmentedControl vous ne devriez pas utiliser plus de quatre ou cinq segments. Son but principal est de montrer trois ou quatre options! Vous devriez essayer différents mécanismes pour atteindre votre objectif!

Vous devriez également consulter this post si cela peut vous aider!

0

Il est très difficile (impossible) de gérer UISegmenteControll avec UIScrollview

meilleure option est que l'utilisation d'un autre contrôleur ou d'une bibliothèque au lieu de contrôleur UISegment

Je mentionnais lien de la bibliothèque que je dans l'un des mon projet de création contrôleur UISegment dynamique

PageMenu

https://github.com/PageMenu/PageMenu

espoir cette bibliothèque peut vous aider à

Merci