【问题标题】:How to fit a thumb to custom size switch?如何让拇指适合自定义尺寸开关?
【发布时间】:2019-12-24 08:27:11
【问题描述】:

我正在开发自定义 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")
        }
    }
}

【问题讨论】:

  • 你在哪里打电话self.transform = CGAffineTransform(scaleX: 1.25, y: 1.16) 请添加代码(编辑你的问题)
  • 整个实现都在那里 -> imgur.com/A1V74LS
  • 为什么会有这行:self.transform = .identity?这将设置默认转换
  • 我尝试过与 SOF 等不同的方法。无论如何,它不起作用。

标签: ios swift user-interface uiswitch


【解决方案1】:

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

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

简单的解决方案是从IBtransform 中删除受限制的大小,使其达到您想要的比例。


例子:

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)

但请注意CGAffineTransform 相对于其父视图更改视图的框架

更多信息:https://stackoverflow.com/a/11288488/6057764

【讨论】:

  • 我明白了!非常感谢。问题很简单,不需要宽高限制。
猜你喜欢
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2017-05-21
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多