2017-02-23 8 views
11

To jest mój UISegmentedControl napisany w Swift:Jak mogę zmienić styl dla UISegmentedControl po wybraniu przez użytkownika w Swift?

enter image description here

Stworzyłem ją z następującego kodu:

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) 

i rozszerzenia do usuwania granic jest tutaj:

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

Ale jest w tym coś złego.

Kiedy dotknij (i przytrzymaj) ONE lub TWO zmienia kolor tła na to (po raz to dotknięcie palcem użytkownika):

enter image description here

Brakuje mi jakiś kod zmiana stylu dla wybranej (tymczasowo wciśniętej) opcji w UISegmentedControl.

Jak mogę usunąć ciemnoszary wybór i pozostawić go z jasnym kolorem?

Odpowiedz

9

Podobny do tego, jak już ustawiłeś obraz tła dla UIControlState.normal, musisz ustawić odpowiednie obrazy dla UIControlState.highlighted i UIControlState.selected + UIControlState.highlighted.

Dodaj następujący kod do funkcji rozszerzenia removeBorders() (zakładając, że chcesz mieć jasne tło dla prasowanego nie wybranym segmencie i odcień kolorowe tło dla wciśnięty wybrany jeden):

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

Próbowałem go i prawie działa :) teraz, gdy użytkownik naciśnie opcję, która nie jest aktualnie wybrana - nie będzie podświetlona na szaro, jednak - nadal istnieje możliwość naciśnięcia aktualnie wybranej opcji i zmienia kolor tła na szary - czy wiesz, jak to naprawić ? – user3766930

+1

@ user3766930 Oczywiście, możesz to zrobić, zaktualizowałem odpowiedź. –

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

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

Powyższy kod dodaje tylko szary do wyboru, więc zmień go poniżej:

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

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