我正在对 UIControl
进行子类化,以制作自定义 slider ,作为学习 UIKit
的练习。 setValue(value:)
方法采用 float/double 参数并将 slider 设置为该值的动画。但是,如果 slider 不是使用显式框架实例化,而是使用约束来调整大小,则调用 setValue()
方法时会崩溃,因为它需要 slider 的固有宽度来确定动画的位置 slider 的拇指。
确保可选属性(在本例中为 self
的宽度)在已调用的方法完全执行之前可用的正确策略是什么?
func addSlider() {
slider.minimumValue = 0
slider.maximumValue = 42
slider.setValue(39)
slider.addTarget(self, action: #selector(sliderAction(_:)), for: .valueChanged)
slider.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(slider)
slider.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
slider.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
slider.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -64).isActive = true
}
问题是 slider.setValue(39)
需要 slider 的宽度才能进行计算。
override func draw(_ rect: CGRect) {
superWidth = rect.width
drawTrack()
drawThumb()
}
...
func setValue(_ value: Float) {
let thumbX = CGFloat(value / maximumValue!) * (superWidth - thumbDimension)
UIView.animate(withDuration: 1, animations: { [weak self] in
self?.thumbLayer.frame.origin.x = thumbX
})
}
最佳答案
我最喜欢的方式是
guard let widthValue = width else { return }
// use widthValue
或者
if let widthValue = width {
// use widthValue
}
两者都很好,都有优点。第一个为您提供了更多的语句控制权。这更符合您的需求。如果宽度不存在,则返回。如果我们解开 widthValue 然后使用它。
关于swift - UISlider 如何在 self 可用之前调用 setValue() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47647385/