Dowiedziałem się, że możemy zmienić wygląd przycisku UISwitch w stanie „on”, ale czy jest też możliwa zmiana koloru przełącznika UISwitch w stanie „off”?
Hej, @longpham, dokonałbym tylko małej zmiany w kodzie promienia. W przypadku zmiany wysokości użyłbym: mSwitch.layer.cornerRadius = mSwitch.frame.height / 2 (jestem po prostu paranoikiem).
Felipe
@Felipe Gringo Nie ma problemu. Zależy od interfejsu użytkownika. Standard UISwitchto 31 pkt.
TO jest poprawna odpowiedź :) setTint zmienia również kolor "konturu", co wizualnie "ukrywa" tło na białym tle.
Łukasz 'Severiaan' Grela 30.07.14
2
Pamiętaj, że tło ma prostokątny kształt.
Łukasz 'Severiaan' Grela
Rozmiar mojego przełącznika jest zmieniany za pomocą CGAffineTransformMakeScale(0.80, 0.80). A to nie działa w przypadku widoku skalowanego. Ponieważ rozmiar warstwy widoku nie jest zmieniany. Jak mogę to zrobić?
@KetanP Czy możesz wyjaśnić problem bardziej szczegółowo?
Afzaal Ahmad
z Xcode 11.2.1, działa podczas uruchamiania aplikacji, ale nie pokazuje koloru w IB ... w każdym razie działa po wdrożeniu na urządzeniu.
zumzum
11
Oto całkiem niezła sztuczka: możesz po prostu sięgnąć bezpośrednio do widoku podrzędnego UISwitch, który rysuje jego „wyłączone” tło i zmienić jego kolor tła. Działa to znacznie lepiej w iOS 13 niż w iOS 12:
Najlepszy sposób na zarządzanie kolorem i rozmiarem tła w UISwitch
Na razie jest to kod Swift 2.3
importFoundationimportUIKit@IBDesignableclassUICustomSwitch:UISwitch{@IBInspectablevarOnColor:UIColor!=UIColor.blueColor()@IBInspectablevarOffColor:UIColor!=UIColor.grayColor()@IBInspectablevarScale:CGFloat!=1.0override init(frame:CGRect){super.init(frame: frame)self.setUpCustomUserInterface()}
required init?(coder aDecoder:NSCoder){super.init(coder: aDecoder)self.setUpCustomUserInterface()}
func setUpCustomUserInterface(){//clip the background colorself.layer.cornerRadius =16self.layer.masksToBounds =true//Scale down to make it smaller in lookself.transform =CGAffineTransformMakeScale(self.Scale,self.Scale);//add target to get user interation to update user-interface accordinglyself.addTarget(self, action:#selector(UICustomSwitch.updateUI), forControlEvents: UIControlEvents.ValueChanged)//set onTintColor : is necessary to make it coloredself.onTintColor =self.OnColor//setup to initial stateself.updateUI()}//to track programatic updateoverride func setOn(on:Bool, animated:Bool){super.setOn(on, animated:true)
updateUI()}//Update user-interface according to on/off state
func updateUI(){ifself.on ==true{self.backgroundColor =self.OnColor}else{self.backgroundColor =self.OffColor}}}
Swift 4 najłatwiejszy i najszybszy sposób na to w 3 krokach:
// background color is the color of the background of the switch
switchControl.backgroundColor =UIColor.white.withAlphaComponent(0.9)// tint color is the color of the border when the switch is off, use// clear if you want it the same as the background, or different otherwise
switchControl.tintColor =UIColor.clear
// and make sure that the background color will stay in border of the switch
switchControl.layer.cornerRadius = switchControl.bounds.height /2
Jeśli ręcznie zmienisz rozmiar przełącznika (np. Używając autoukładu), będziesz musiał również zaktualizować switch.layer.cornerRadius, np. Przez nadpisanie layoutSubviewsi po wywołaniu super aktualizacji promienia narożnika:
@iOSCalendarViewOnMyProfile ma zmienić kolor tła, a nie sam punktor .. w iOS wygląd i styl to zawsze kolor domyślny ..
Milan Nosáľ
4
Jeśli potrzebujesz innych przełączników w swojej aplikacji, dobrym pomysłem może być również zaimplementowanie kodu @ LongPham w klasie niestandardowej. Jak zauważyli inni, w stanie „wyłączonym” musisz także zmienić kolor tła, ponieważ domyślny jest przezroczysty.
Przełącznik UISwitch offTintColorjest przezroczysty, więc widać to, co znajduje się za przełącznikiem. Dlatego zamiast maskować kolor tła wystarczy narysować obraz w kształcie przełącznika za przełącznikiem (ta implementacja zakłada, że przełącznik jest pozycjonowany przez autoukład):
func putColor(_ color:UIColor, behindSwitch sw:UISwitch){
guard sw.superview !=nilelse{return}let onswitch =UISwitch()
onswitch.isOn =truelet r =UIGraphicsImageRenderer(bounds:sw.bounds)let im = r.image { ctx in
onswitch.layer.render(in: ctx.cgContext)}.withRenderingMode(.alwaysTemplate)let iv =UIImageView(image:im)
iv.tintColor = color
sw.superview!.insertSubview(iv, belowSubview: sw)
iv.translatesAutoresizingMaskIntoConstraints =falseNSLayoutConstraint.activate([
iv.topAnchor.constraint(equalTo: sw.topAnchor),
iv.bottomAnchor.constraint(equalTo: sw.bottomAnchor),
iv.leadingAnchor.constraint(equalTo: sw.leadingAnchor),
iv.trailingAnchor.constraint(equalTo: sw.trailingAnchor),])}
Oto najprostszy sposób, jaki znalazłem, ustawiania koloru stanu wyłączenia UISwitch za pomocą jednej linii kodu . Pisząc to tutaj, ponieważ ta strona pojawiła się jako pierwsza, kiedy szukałem, a inne odpowiedzi nie pomogły.
To tak, gdybym chciał ustawić stan wyłączenia na czerwony i można go dodać do funkcji viewDidLoad ():
Uwaga - to, co tak naprawdę robi, to ustawienie koloru tła przełącznika. Może to również wpłynąć na kolor przełącznika w stanie włączonym (chociaż dla mnie to nie był problem, ponieważ chciałem, aby stan włączania i wyłączania był tego samego koloru).
Rozwiązanie tego problemu:
Po prostu połącz kolory za pomocą stwierdzenia „jeśli jeszcze” w IBAction. Jeśli przełącznik jest wyłączony, pokoloruj tło na czerwono. Jeśli przełącznik jest włączony, pozostaw tło czyste, aby wybrany kolor „włączony” był wyświetlany prawidłowo.
To znajduje się wewnątrz przełącznika IBAction.
if yourSwitch.isOn ==false{
yourSwitch.subviews[0].subviews[0].backgroundColor =UIColor.red
}else{
yourSwitch.subviews[0].subviews[0].backgroundColor =UIColor.clear
}
Znalazłem pewne zachowanie, w którym po wznowieniu aplikacji z tła tło przełączania wracało do czystego. Aby rozwiązać ten problem, po prostu dodałem w poniższym kodzie, aby ustawić kolor za każdym razem, gdy aplikacja pojawia się na pierwszym planie:
Nie wolę używać subViews, ponieważ nigdy nie wiadomo, kiedy Apple zmieni hierarchię.
więc zamiast tego używam widoku maski.
działa z iOS 12, iOS 13
private lazy var settingSwitch:UISwitch={let swt:UISwitch=UISwitch()// set border color when isOn is false
swt.tintColor =.cloudyBlueTwo
// set border color when isOn is true
swt.onTintColor =.greenishTeal
// set background color when isOn is false
swt.backgroundColor =.cloudyBlueTwo
// create a mask view to clip background over the size you expected.let maskView =UIView(frame: swt.frame)
maskView.backgroundColor =.red
maskView.layer.cornerRadius = swt.frame.height /2
maskView.clipsToBounds =true
swt.mask = maskView
// set the scale to your expectation, here is around height: 34, width: 21.let scale:CGFloat=2/3
swt.transform =CGAffineTransform(scaleX: scale, y: scale)
swt.addTarget(self, action:#selector(switchOnChange(_:)), for: .valueChanged)return swt
}()@objc
func switchOnChange(_ sender:UISwitch){if sender.isOn {// set background color when isOn is true
sender.backgroundColor =.greenishTeal
}else{// set background color when isOn is false
sender.backgroundColor =.cloudyBlueTwo
}}
Zaczynając od rozwiązania Matta, dodałem je do niestandardowej kontrolki IBDesignable. Występuje problem z synchronizacją, który didMoveToSuperview()jest wywoływany przed ustawieniem offTintColorzestawu i wymagał obsługi.
#import "UISwitch+SAHelper.h"@implementationUISwitch(SAHelper)@dynamic offTint;-(void)setOffTint:(UIColor*)offTint {self.tintColor = offTint;//comment this line to hide border in off stateself.layer.cornerRadius =16;self.backgroundColor = offTint;}@end
Odpowiedzi:
Moje rozwiązanie z # swift2:
Wynik:
źródło
UISwitch
to 31 pkt.Spróbuj tego użyć
Wszystko dzięki @Barry Wyckoff.
źródło
CGAffineTransformMakeScale(0.80, 0.80)
. A to nie działa w przypadku widoku skalowanego. Ponieważ rozmiar warstwy widoku nie jest zmieniany. Jak mogę to zrobić?Możesz użyć
tintColor
właściwości na przełączniku.Pamiętaj, że wymaga to iOS 5+
źródło
Swift IBDesignable
ustaw klasę w Inspektorze tożsamości
zmień kolor w Inspektorze atrybutów
Wynik
źródło
Oto całkiem niezła sztuczka: możesz po prostu sięgnąć bezpośrednio do widoku podrzędnego UISwitch, który rysuje jego „wyłączone” tło i zmienić jego kolor tła. Działa to znacznie lepiej w iOS 13 niż w iOS 12:
źródło
Na razie jest to kod Swift 2.3
źródło
W Swift 4+:
off
stan:on
stan:źródło
tintColor
nie ma wpływu.Swift 5:
źródło
Swift 4 najłatwiejszy i najszybszy sposób na to w 3 krokach:
Jeśli ręcznie zmienisz rozmiar przełącznika (np. Używając autoukładu), będziesz musiał również zaktualizować
switch.layer.cornerRadius
, np. Przez nadpisanielayoutSubviews
i po wywołaniu super aktualizacji promienia narożnika:źródło
switchControl
Jeśli potrzebujesz innych przełączników w swojej aplikacji, dobrym pomysłem może być również zaimplementowanie kodu @ LongPham w klasie niestandardowej. Jak zauważyli inni, w stanie „wyłączonym” musisz także zmienić kolor tła, ponieważ domyślny jest przezroczysty.
źródło
Przełącznik UISwitch
offTintColor
jest przezroczysty, więc widać to, co znajduje się za przełącznikiem. Dlatego zamiast maskować kolor tła wystarczy narysować obraz w kształcie przełącznika za przełącznikiem (ta implementacja zakłada, że przełącznik jest pozycjonowany przez autoukład):[Ale zobacz teraz moją drugą odpowiedź .]
źródło
2020 Od Xcode 11.3.1 i Swift 5
Oto najprostszy sposób, jaki znalazłem, ustawiania koloru stanu wyłączenia UISwitch za pomocą jednej linii kodu . Pisząc to tutaj, ponieważ ta strona pojawiła się jako pierwsza, kiedy szukałem, a inne odpowiedzi nie pomogły.
To tak, gdybym chciał ustawić stan wyłączenia na czerwony i można go dodać do funkcji viewDidLoad ():
Uwaga - to, co tak naprawdę robi, to ustawienie koloru tła przełącznika. Może to również wpłynąć na kolor przełącznika w stanie włączonym (chociaż dla mnie to nie był problem, ponieważ chciałem, aby stan włączania i wyłączania był tego samego koloru).
Rozwiązanie tego problemu:
Po prostu połącz kolory za pomocą stwierdzenia „jeśli jeszcze” w IBAction. Jeśli przełącznik jest wyłączony, pokoloruj tło na czerwono. Jeśli przełącznik jest włączony, pozostaw tło czyste, aby wybrany kolor „włączony” był wyświetlany prawidłowo.
To znajduje się wewnątrz przełącznika IBAction.
Znalazłem pewne zachowanie, w którym po wznowieniu aplikacji z tła tło przełączania wracało do czystego. Aby rozwiązać ten problem, po prostu dodałem w poniższym kodzie, aby ustawić kolor za każdym razem, gdy aplikacja pojawia się na pierwszym planie:
Wydaje się prostsze niż inne odpowiedzi. Mam nadzieję, że to pomoże!
źródło
Bezpieczniejszy sposób w Swift 3 bez magicznych wartości 16 punktów:
źródło
XCode 11, Swift 5
Nie wolę używać subViews, ponieważ nigdy nie wiadomo, kiedy Apple zmieni hierarchię.
więc zamiast tego używam widoku maski.
działa z iOS 12, iOS 13
źródło
Działający w 100% IOS 13.0 i Swift 5.0 przełączają oba stany kolor ustawiony na ten sam # ios13 #swift # swift5
źródło
XCode 11, Swift 4.2
Zaczynając od rozwiązania Matta, dodałem je do niestandardowej kontrolki IBDesignable. Występuje problem z synchronizacją, który
didMoveToSuperview()
jest wywoływany przed ustawieniemoffTintColor
zestawu i wymagał obsługi.źródło
kategoria celu c do użycia na dowolnym przełączniku UISwitch w projekcie przy użyciu kodu lub scenorysu:
realizacja
źródło
w końcu użyłem też transform i layer.cornerRadius. Ale dodałem do tego tłumaczenie, aby być w centrum.
W projektancie użyłem również backgroundColor i tintColor. Mam nadzieję, że to pomoże.
źródło