2017-02-23 5 views
11

Das ist mein UISegmentedControl in Swift geschrieben:Wie kann ich den Stil für UISegmentedControl ändern, wenn dieser vom Benutzer in Swift ausgewählt wurde?

enter image description here

ich es mit dem folgenden Code erstellt:

let selectedAttributes: NSDictionary = [ 
     NSForegroundColorAttributeName: UIColor.black, 
     NSFontAttributeName: fontForSegmentedControl! 
    ] 

    let normalAttributes: NSDictionary = [ 
     NSForegroundColorAttributeName: UIColor.gray, 
     NSFontAttributeName: fontForSegmentedControl! 
    ] 

    mySegmentedControl.setTitleTextAttributes(selectedAttributes as [NSObject : AnyObject], for: UIControlState.selected) 

    mySegmentedControl.setTitleTextAttributes(normalAttributes as [NSObject : AnyObject], for: UIControlState.normal) 

und die Erweiterung für die Grenzen zu entfernen, ist hier:

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

    // 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! 
    } 
} 

Aber da stimmt etwas nicht.

Wenn ich tippen (und halten) die ONE oder TWO es ändert sich die Hintergrundfarbe auf diese (für die Zeit vom Finger des Benutzers berührt hat wird):

enter image description here

Ich vermisse einige Code für Ändern des Stils für die ausgewählte (vorübergehend gedrückte) Option in UISegmentedControl.

Wie kann ich die dunkelgraue Auswahl entfernen und sie mit klarer Farbe belassen?

Antwort

9

Ähnlich wie Sie bereits das Hintergrundbild für UIControlState.normal festgelegt haben, müssen Sie die entsprechenden Bilder für UIControlState.highlighted und UIControlState.selected + UIControlState.highlighted einstellen.

Fügen Sie den folgenden Code in Ihre Erweiterungsfunktion removeBorders() (vorausgesetzt, Sie für einen klaren Hintergrund für nicht gedrückt ausgewähltes Segment und eine Tönung farbigen Hintergrund haben wollen eine gedrückt ausgewählt):

setBackgroundImage(imageWithColor(color: .clear), for: .highlighted, barMetrics: .default) 
setBackgroundImage(imageWithColor(color: tintColor!), for: [.selected, .highlighted], barMetrics: .default) 
+0

Ich habe es versucht und es funktioniert fast :) jetzt, wenn Benutzer die Option drückt, die nicht ausgewählt ist - es wird jedoch nicht in grau hervorheben - es gibt immer noch eine Möglichkeit, die Option, die gerade ausgewählt ist, zu drücken und es ändert den Hintergrund in grau - weißt du, wie ich es beheben könnte ? – user3766930

+1

@ user3766930 sicher, Sie können es tun, ich aktualisierte die Antwort. –

0
let normalAttributes: NSDictionary = [ 
    NSForegroundColorAttributeName: UIColor.gray, 
    NSFontAttributeName: fontForSegmentedControl! 
] 

mySegmentedControl.setTitleTextAttributes(selectedAttributes as [NSObject : AnyObject], for: UIControlState.selected) 

Der obige Code nur grau zur Auswahl hinzufügen, so ändern Sie es wie unten

let normalAttributes: NSDictionary = [ 
    NSForegroundColorAttributeName: UIColor.white, 
    NSFontAttributeName: fontForSegmentedControl! 
] 

mySegmentedControl.setTitleTextAttributes(selectedAttributes as [NSObject : AnyObject], for: UIControlState.selected) 
Verwandte Themen