2015-03-28 5 views
6

Ab Swift zu lernen und ist versucht zu wandeln diesen ObjectiveC Code setzen:Wie UISegmentedControl Tint Farbe für einzelnes Segment

[[mySegmentedControl.subviews objectAtIndex:0] setTintColor:[UIColor blueColor]] 

Dieser richtig setzen mit dem den Farbton des ersten Segments.


Dies ist der am nächsten komme ich habe eine Swift-Version des gleichen Code zu bekommen:

mySegmentedControl?.subviews[0].tintColor = UIColor.blueColor() 

Der Fehler, den ich bekommen ist '@Ivalue $T9' is not identical to 'UIColor!!'


Ich verstehe nicht, was dieser Fehler bedeutet. Wenn ich mir die .tintColor Methode ansehe, listet sie UIColor!? auf und ich habe noch nicht gefunden, was die !? zusammen in Swift bedeutet.

+0

Wenn mySegmentedControl ein IBOutlet? Wenn ja, deklariere es @IBOutlet var mySegmentedControl = UISegmentedControl! Dann brauchst du das nicht? Operator. Das wird das ganze Problem nicht lösen, aber das ist eine Sache. Wenn Subviews [0] null zurückgeben können, ist es optional, also setzen Sie vielleicht ein! nach [0]. – clearlight

Antwort

16

Dies wird Ihr Problem lösen:

var subViewOfSegment: UIView = mySegmentedControl.subviews[0] as UIView 
subViewOfSegment.tintColor = UIColor.blueColor() 

Sie können auch

(mySegmentedControl.subviews[0] as UIView).tintColor = UIColor .blueColor() 
+0

Das war es! Danke für die Hilfe. –

+0

Ist dies dokumentiert? – igrek

0

Für die tintColor des ausgewählten Segments zu ändern

Verwenden Sie den Wert geändert Ereignis für die UISegmentControl zu Sortieren Sie die Segmente in der Reihenfolge ihres Ursprungs x-Werts, führen Sie dann eine Schleife durch und vergleichen Sie die selectedSegmentIndex-Eigenschaft. Hier ist ein Beispiel mit einer segmentierten Steuerung von 4 Segmenten angenommen wird:

@IBAction func indexChanged(sender: UISegmentedControl) { 

    let sortedViews = sender.subviews.sort({ $0.frame.origin.x < $1.frame.origin.x }) 

    for (index, view) in sortedViews.enumerate() { 
     if index == sender.selectedSegmentIndex { 
      view.tintColor = UIColor.blueColor() 
     } else { 
      view.tintColor = UIColor.lightGrayColor() 
     } 
    } 

} 

dann in viewDidLoad eingestellt den tintColor für das anfänglich ausgewählte Segment, in diesem Fall ist es die erste:

let sortedViews = segmentedControlOutletVariable.subviews.sort({ $0.frame.origin.x < $1.frame.origin.x }) 
sortedViews[0].tintColor = UIColor.blueColor() 
9

Der einfachste Weg, ich gefunden habe ist:

segmentControl.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.redColor()], forState: UIControlState.Selected) 
+0

Dies funktioniert in einfachen Fällen, wenn Sie die Farbe der Schaltfläche basierend auf der Auswahl ändern möchten. Ich musste eine bestimmte Indexfarbe unabhängig vom ausgewählten Status für eine benutzerdefinierte Benutzeroberfläche ändern. –

-1
class MyUISegmentedControl: UISegmentedControl { 

    required init(coder aDecoder: NSCoder){ 
     super.init(coder: aDecoder)! 
     for subViewOfSegment: UIView in subviews { 
      subViewOfSegment.tintColor = UIColor.red 
     } 
    } 
} 
0

Dieser Code mit der neuesten Version von Swift als auf März 2017 funktioniert gut (Swift 3.0)

Hier ist dieser Code, den ich implementiert habe, die Erweiterung für das Segment-Steuerelement und kann für alle Segmentsteuerelemente in der Anwendung verwendet werden, wo der Satz von Code in der Anwendungsklasse definiert werden muss.

Die Erweiterungsmethode kann direkt in der Anwendung verwendet werden. Sie können auch alle Einstellungen derselben Methode oder verschiedenen Methoden in der Erweiterungsklasse hinzufügen, wie unten gezeigt.

extension UISegmentedControl { 
func setSegmentStyle() { 
    setBackgroundImage(imageWithColor(color: backgroundColor!), for: .normal, barMetrics: .default) 
    setBackgroundImage(imageWithColor(color: tintColor!), for: .selected, barMetrics: .default) 
    setDividerImage(imageWithColor(color: UIColor.clear), forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default) 



    let segAttributes: NSDictionary = [ 
      NSForegroundColorAttributeName: UIColor.gray, 
      NSFontAttributeName: UIFont(name: "System-System", size: 14)! 
     ] 

     setTitleTextAttributes(segAttributes as [NSObject : AnyObject], for: UIControlState.selected) 
    } 

    // create a 1x1 image with this color 
    private func imageWithColor(color: UIColor) -> UIImage { 
     let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0) 
     UIGraphicsBeginImageContext(rect.size) 
     let context = UIGraphicsGetCurrentContext() 
     context!.setFillColor(color.cgColor); 
     context!.fill(rect); 
     let image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     return image! 
    } 
} 

Überall für die Segmente die folgenden Code verwendet werden kann

self.mySegment.setSegmentStyle() 

enter image description here

1

Nach der Analyse und versucht, viele Antworten auf diese und ähnliche Fragen stellte ich fest, dass mit einem 3rd-Party benutzerdefinierte segmentierte Steuerung es wird viel einfacher und sicherer Anpassungen vorzunehmen als zu versuchen, Apples UISegmentedControl zu hacken.

Hier ist ein Beispiel für die Anpassung mit XMSegmentedControl (Swift 3).

in Code Einige:

mySegmentControl.delegate = self 
    mySegmentControl.font = UIFont.systemFont(ofSize: 12) 

und einige im Interface Builder (kann auch im Code ausgeführt werden, wenn Sie möchten):

enter image description here

Das Ergebnis ist:

enter image description here

In meinem Fall ist es sieht sehr nach System 1 aus, aber es gibt immer noch kleine Unterschiede, die ich genau so machen musste, wie der Designer es wollte.

Beachten Sie, dass XMSegmentedControl keine unterschiedlichen Hintergrundfarben für verschiedene Segmente zulässt. Sie können dies jedoch bei Bedarf einfach hinzufügen, da es sich um eine einfache .swift-Datei handelt, die sehr einfach zu verstehen und zu ändern ist.

+0

Ich habe meine Antwort aktualisiert, um Anpassungsmöglichkeiten zu zeigen. Das benutzerdefinierte segmentierte Steuerelement verfügt über einfachen und eindeutigen Code - Sie können es problemlos ändern, um für jedes Segment individuelle Farben festlegen zu können. – Vitalii