Change color of UISwitch in “off” state

前端 未结 18 2715
忘掉有多难
忘掉有多难 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:33

    XCode 11, Swift 4.2

    Starting with Matt's solution I added it to a custom, IBDesignable control. There is a timing issue in that didMoveToSuperview() is called before the offTintColor is set that needed to be handled.

    @IBDesignable public class UISwitchCustom: UISwitch {
    
        var switchMask: UIImageView?
        private var observers = [NSKeyValueObservation]()
    
        @IBInspectable dynamic var offTintColor : UIColor! = UIColor.gray {
            didSet {
                 switchMask?.tintColor = offTintColor
            }
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            initializeObservers()
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            initializeObservers()
        }
    
        private func initializeObservers() {
            observers.append(observe(\.isHidden, options: [.initial]) {(model, change) in
                self.switchMask?.isHidden = self.isHidden
            })
        }
    
        override public func didMoveToSuperview() {
            addOffColorMask(offTintColor)
            super.didMoveToSuperview()
        }
    
       private func addOffColorMask(_ color: UIColor) {
            guard self.superview != nil else {return}
            let onswitch = UISwitch()
            onswitch.isOn = true
            let r = UIGraphicsImageRenderer(bounds:self.bounds)
            let im = r.image { ctx in
                onswitch.layer.render(in: ctx.cgContext)
                }.withRenderingMode(.alwaysTemplate)
            let iv = UIImageView(image:im)
            iv.tintColor = color
            self.superview!.insertSubview(iv, belowSubview: self)
            iv.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                iv.topAnchor.constraint(equalTo: self.topAnchor),
                iv.bottomAnchor.constraint(equalTo: self.bottomAnchor),
                iv.leadingAnchor.constraint(equalTo: self.leadingAnchor),
                iv.trailingAnchor.constraint(equalTo: self.trailingAnchor),
                ])
            switchMask = iv
            switchMask?.isHidden = self.isHidden
        }
    
    }
    

提交回复
热议问题