如何使拇指适合自定义尺寸开关?
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 width
和 height
,然后你试图 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
更多信息:
我正在开发自定义 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 width
和 height
,然后你试图 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
更多信息: