如何使拇指适合自定义尺寸开关?

How to fit a thumb to custom size switch?

我正在开发自定义 UISwitch。我用这个改变了尺寸: self.transform = CGAffineTransform(scaleX: 1.25, y: 1.16)。 现在我有一个问题,拇指仍然是默认大小。

如何与 uiswitch 配合使用?

class CustomSwitch:UISwitch {

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.viewDidLoad()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.viewDidLoad()
    }

    func viewDidLoad() {
        self.transform = CGAffineTransform(scaleX: 1.25, y: 1.16)
        self.setupAppearance()
        self.setColors()
        self.addTarget(self, action: #selector(toggleState), for: .valueChanged)
    }

    func setupAppearance() {
        self.layer.borderColor = UIColor.HavelockBlue.cgColor
        self.layer.borderWidth = 1.0
        self.layer.cornerRadius = self.bounds.height / 2
    }

    func setColors() {
        self.backgroundColor = .white
        self.subviews.first?.subviews.first?.backgroundColor = .clear
        self.onTintColor = .white
        self.thumbTintColor = .HavelockBlue
    }

    @objc func toggleState() {
        if self.isOn {
            print("Dark mode is on")
        } else {
            print("Dark mode is off")
        }
    }
}

你的问题是,你为自定义 UISwitch 设置了 constrained widthheight,然后你试图 transform这个对象,但是实际发生了什么。

在这个 override init(frame: CGRect)required init?(coder: NSCoder) 方法中,如果您使用 自动布局 ,您实际上没有 UIView 的最终尺寸,尺寸取自 IB。但是你正在设置 self.layer.cornerRadius = self.bounds.height / 2。如果您将打印 frame.size and bounds.size 的值,您将看到。

简单的解决方案是从 IB 中删除受限大小,然后 transform 达到您想要的比例。


示例:

required init?(coder: NSCoder) {
    super.init(coder: coder)
    changeSwitchSize()
}

override init(frame: CGRect) {
    super.init(frame: frame)
    changeSwitchSize()
}

private func changeSwitchSize() {
    print("Before transform switch frame size: \(frame.size), bounds size: \(bounds.size)")
    self.transform = CGAffineTransform(scaleX: 1.25, y: 1.16)
    print("After transform switch frame size: \(frame.size), bounds size: \(bounds.size)")
}

/// Before transform switch frame: (51.0, 31.0), (51.0, 31.0)
/// After transform switch frame: (63.75, 35.95999999999998), (51.0, 31.0)

But be aware than CGAffineTransform change view's frame relative to its superview

更多信息: