UISlider在ViewDidLoad()中没有子视图

时间:2016-07-16 15:55:33

标签: swift uilabel uislider

我想在UILabel的拇指上添加UISlider

我的代码基于:Another SO question

问题在于,使用该代码,在更改值之前,拇指上没有文字。所以我做了一些修改。我将标签设为全局变量,并在viewDidLoad()中对其进行配置。然后我只需在滑块更改值时更改文本。

ACTUAL问题是这个(viewDidLoad()中的代码):

let thumbView = mySlider.subviews.last
label.frame = (thumbView?.bounds)!

mySlider的{​​{1}}数组为空。因此,它会导致崩溃,因为我打开了一个nil值。

我不明白为什么会发生这种情况,因为视图已完全初始化。

为什么subviews为空?我错过了什么?有谁知道我该如何解决这个问题?是否有其他方法将标签放在拇指中间?

3 个答案:

答案 0 :(得分:2)

mySlider.subviews.last不是获取thumbImage中心的可靠方法。在文档的任何地方都没有提到。我个人认为这样做非常黑客。

但是,要获得slider的中心,您可以使用valueslider的组合来计算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
 }
}