swift - UISlider 如何在 self 可用之前调用 setValue() 方法?

标签 swift

我正在对 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/

相关文章:

swift - 在快速调用 super 指定初始化程序之前初始化属性值的目的是什么?

ios - 这个错误是什么意思?不能下标值类型

iphone - 隐藏 TabBarController 中的项目 [xcode6/swift]

ios - 我应该将 pickerViews 内容保留在 NSUserDefaults 中吗?

ios - 如何在 SwiftUI 中为多维 View 修复 "index out of Range"

ios - 在 Swift 中实时更新 UILabel

swift - 在 swift 3 中优化搜索结果

Swift - 实现字符串的源文件在哪里

swift - 在我的购物 list 中添加产品 - 创建购物 list 应用程序

ios - UICollectionView无法显示自定义单元格内容