我想在UILabel
的拇指上添加UISlider
。
我的代码基于:Another SO question
问题在于,使用该代码,在更改值之前,拇指上没有文字。所以我做了一些修改。我将标签设为全局变量,并在viewDidLoad()
中对其进行配置。然后我只需在滑块更改值时更改文本。
ACTUAL问题是这个(viewDidLoad()
中的代码):
let thumbView = mySlider.subviews.last
label.frame = (thumbView?.bounds)!
mySlider
的{{1}}数组为空。因此,它会导致崩溃,因为我打开了一个nil值。
我不明白为什么会发生这种情况,因为视图已完全初始化。
为什么subviews
为空?我错过了什么?有谁知道我该如何解决这个问题?是否有其他方法将标签放在拇指中间?
答案 0 :(得分:2)
mySlider.subviews.last
不是获取thumbImage中心的可靠方法。在文档的任何地方都没有提到。我个人认为这样做非常黑客。
但是,要获得slider
的中心,您可以使用value
和slider
的组合来计算trackRectForBounds
的{{1}}。
这应该适合你:
thumbRectForBounds
基本上这样做首先计算轨道的矩形然后用它来计算thumbRect。最后设置中心时要考虑滑块的宽度和高度以及拇指大小。
请务必将@IBAction func sliderValueChanged(slider: UISlider) {
let trackRect = slider.trackRectForBounds(slider.bounds)
let thumbRect = slider.thumbRectForBounds(slider.bounds, trackRect: trackRect, value: slider.value)
sliderLabel.center = CGPointMake(thumbRect.origin.x + thumbRect.size.width / 2 + slider.frame.origin.x, slider.frame.origin.y + thumbRect.size.height / 2)
}
文字对齐设置为中心。
答案 1 :(得分:0)
your linked question的代码运行正常,无需更改。
添加此方法,初始值将在UILabel
上显示为UISlider
:
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
[mySlider sendActionsForControlEvents:UIControlEventValueChanged];
}
答案 2 :(得分:0)
class ThumbTextSlider: UISlider {
var thumbTextLabel: UILabel = UILabel()
var passedValue = 0
private var thumbFrame: CGRect {
return thumbRect(forBounds: bounds, trackRect: trackRect(forBounds:
bounds), value: value)
}
override func layoutSubviews() {
super.layoutSubviews()
thumbTextLabel.frame = thumbFrame
thumbTextLabel.text = String(passedValue)
}
override func awakeFromNib() {
super.awakeFromNib()
addSubview(thumbTextLabel)
setThumbImage(#imageLiteral(resourceName: "icon-settings"), for: .normal)
thumbTextLabel.font = UIFont(name: "SFProText-Semibold", size: 16)
thumbTextLabel.textAlignment = .center
thumbTextLabel.layer.zPosition = layer.zPosition + 1
}
}