Change color of UISwitch in “off” state

前端 未结 18 2584
忘掉有多难
忘掉有多难 2020-11-30 20:53

I\'ve learned that we can change the UISwitch button appearance in its \"on\" state, but is it also possible to change the color of the UISwitch in the \"off\" state?

相关标签:
18条回答
  • 2020-11-30 21:40

    Try using this

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

    All thanks to @Barry Wyckoff.

    0 讨论(0)
  • 2020-11-30 21:41

    The UISwitch offTintColor is transparent, so whatever is behind the switch shows through. Therefore, instead of masking the background color, it suffices to draw a switch-shaped image behind the switch (this implementation assumes that the switch is positioned by 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),
        ])
    }
    

    [But see now my other answer.]

    0 讨论(0)
  • 2020-11-30 21:42

    objective c category to use on any UISwitch in project using code or storyboard:

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

    implementation

    #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
    
    0 讨论(0)
  • 2020-11-30 21:48

    The Best way to manage background color & size of UISwitch

    For now it's Swift 2.3 code

    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
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-30 21:49

    2020 As of Xcode 11.3.1 & Swift 5

    Here's the simplest way I've found of doing setting the UISwitch off-state colour with one line of code. Writing this here since this page is what came up first when I was looking and the other answers didn't help.

    This is if I wanted to set the off state to be red, and can be added to the viewDidLoad() function:

    yourSwitchName.subviews[0].subviews[0].backgroundColor = UIColor.red
    

    Note - what this is actually doing is setting the background colour of the switch. This may influence the colour of the switch in the on-state too (though for me this wasn't a problem since I wanted the on and off state to be the same colour).

    A solution for this:

    Simply tie in the colours with an 'if else' statement inside your IBAction. If the switch is off, colour the background red. If the switch is on, leave the background clear so your chosen 'on' colour will display properly.

    This goes inside the switch IBAction.

      if yourSwitch.isOn == false {
               yourSwitch.subviews[0].subviews[0].backgroundColor = UIColor.red
        } else {
            yourSwitch.subviews[0].subviews[0].backgroundColor = UIColor.clear
        }
    

    I found some behaviour where, upon the app resuming from background, the switch background would return to clear. To remedy this problem I simply added in the following code to set the colour every time the app comes to the foreground:

     override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        NotificationCenter.default.addObserver(
          self,
          selector: #selector(applicationWillEnterForeground(_:)),
          name: UIApplication.willEnterForegroundNotification,
          object: nil)
    }
    
    @objc func applicationWillEnterForeground(_ notification: NSNotification) {
       yourSwitch.subviews[0].subviews[0].backgroundColor = UIColor.red
       yourSwitch.subviews[0].subviews[0].backgroundColor = UIColor.red
    }
    

    Seems simpler than the other answers. Hope that helps!

    0 讨论(0)
  • 2020-11-30 21:50

    In Swift 4+:

    off state:

    switch.tintColor = UIColor.blue
    

    on state:

    switch.onTintColor = UIColor.red
    
    0 讨论(0)
提交回复
热议问题