switch iphone ios uiswitch

iphone - Cambiar el color de UISwitch en estado "apagado"



uiswitch swift (9)

La mejor forma de administrar el color y el tamaño de fondo de UISwitch

Por ahora es el código Swift 2.3

import Foundation import UIKit @IBDesignable class UICustomSwitch : UISwitch { @IBInspectable var OnColor : UIColor! = UIColor.blueColor() @IBInspectable var OffColor : UIColor! = UIColor.grayColor() @IBInspectable var Scale : CGFloat! = 1.0 override 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 color self.layer.cornerRadius = 16 self.layer.masksToBounds = true //Scale down to make it smaller in look self.transform = CGAffineTransformMakeScale(self.Scale, self.Scale); //add target to get user interation to update user-interface accordingly self.addTarget(self, action: #selector(UICustomSwitch.updateUI), forControlEvents: UIControlEvents.ValueChanged) //set onTintColor : is necessary to make it colored self.onTintColor = self.OnColor //setup to initial state self.updateUI() } //to track programatic update override func setOn(on: Bool, animated: Bool) { super.setOn(on, animated: true) updateUI() } //Update user-interface according to on/off state func updateUI() { if self.on == true { self.backgroundColor = self.OnColor } else { self.backgroundColor = self.OffColor } } }

He aprendido que podemos cambiar la apariencia del botón UISwitch en su estado "on", pero ¿también es posible cambiar el color del UISwitch en el estado "off"?


El UISwitch offTintColor es transparente, por lo que todo lo que está detrás del interruptor se muestra. Por lo tanto, en lugar de enmascarar el color de fondo, basta con dibujar una imagen en forma de interruptor detrás del interruptor (esta implementación asume que el interruptor está posicionado por autolayout):

func putColor(_ color: UIColor, behindSwitch sw: UISwitch) { guard sw.superview != nil else {return} let onswitch = UISwitch() onswitch.isOn = true let 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 = false NSLayoutConstraint.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), ]) }


Intenta usar esto

yourSwitch.backgroundColor = [UIColor whiteColor]; youSwitch.layer.cornerRadius = 16.0;

Todo gracias a @Barry Wyckoff.


Mi solución con # swift2:

let onColor = _your_on_state_color let offColor = _your_off_state_color let mSwitch = UISwitch(frame: CGRectZero) mSwitch.on = true /*For on state*/ mSwitch.onTintColor = onColor /*For off state*/ mSwitch.tintColor = offColor mSwitch.layer.cornerRadius = mSwitch.frame.height / 2 mSwitch.backgroundColor = offColor

Resultado:


Puede usar la propiedad tintColor en el interruptor.

switch.tintColor = [UIColor redColor]; // the "off" color switch.onTintColor = [UIColor greenColor]; // the "on" color

Tenga en cuenta que esto requiere iOS 5+


Swift IBDesignable

import UIKit @IBDesignable class UISwitchCustom: UISwitch { @IBInspectable var OffTint: UIColor? { didSet { self.tintColor = OffTint self.layer.cornerRadius = 16 self.backgroundColor = OffTint } } }

establecer clase en inspector de identidad

cambiar el color del inspector de Atributos

Salida


Una forma más segura en Swift 3 sin valores mágicos de 16pt:

class ColoredBackgroundSwitch: UISwitch { var offTintColor: UIColor { get { return backgroundColor ?? UIColor.clear } set { backgroundColor = newValue } } override func layoutSubviews() { super.layoutSubviews() let minSide = min(frame.size.height, frame.size.width) layer.cornerRadius = ceil(minSide / 2) } }


categoría objetiva c para usar en cualquier UISlider en proyecto usando código o guión gráfico:

#import <UIKit/UIKit.h> @interface UISwitch (SAHelper) @property (nonatomic) IBInspectable UIColor *offTint; @end

implementación

#import "UISwitch+SAHelper.h" @implementation UISwitch (SAHelper) @dynamic offTint; - (void)setOffTint:(UIColor *)offTint { self.tintColor = offTint; //comment this line to hide border in off state self.layer.cornerRadius = 16; self.backgroundColor = offTint; } @end


Swift 4 forma más fácil y rápida de obtenerlo en 3 pasos:

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

Si cambia manualmente el tamaño del interruptor (por ejemplo, mediante el uso de autolayout), también deberá actualizar el switch.layer.cornerRadius , por ejemplo, anulando el layoutSubviews y después de llamar a super layoutSubviews actualizando el radio de la esquina:

override func layoutSubviews() { super.layoutSubviews() switchControl.layer.cornerRadius = switchControl.bounds.height / 2 }