【问题标题】:UISlider no subviews in ViewDidLoad()UISlider 在 ViewDidLoad() 中没有子视图
【发布时间】:2016-07-16 15:55:33
【问题描述】:

我想在UISlider 的拇指上加上一个UILabel

我的代码基于此:Another SO question

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

实际问题是这样的(viewDidLoad() 中的代码):

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

mySlidersubviews 数组为空。因此它会导致崩溃,因为我打开一个 nil 值。

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

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

【问题讨论】:

  • 您的视图已完全初始化,但滑块的子视图不一定。 thumbView 可能是延迟实例化的,所以它还没有在viewDidLoad 中创建,因为它还没有被调用。您应该使用@Zac Kwan 的建议来避免直接操作滑块的视图层次结构。
  • @beyowulf 有没有办法强制初始化?

标签: swift uilabel uislider


【解决方案1】:

mySlider.subviews.last 不是获取 thumbImage 中心的可靠方法。文档中的任何地方都没有提及。我个人认为那样做是很老套的。

但是,要获得slider 的中心,您可以使用trackRectForBoundsthumbRectForBounds 的组合基于valuevalue 进行计算。

这应该适合你:

@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)
}

基本上,它的作用是首先计算轨道的矩形,然后使用它来计算 thumbRect。最后设置中心,考虑滑块的宽度和高度以及拇指大小。

记得将 label 文本对齐设置为居中。

【讨论】:

  • 它确实有道理,但它不起作用。我将您的代码放在viewDidLoad() 中作为初始值,并将您的代码放在值更改时的函数中。问题在于: 1. 标签略高于拇指。 2.如果我改变值,标签不会移动。
  • 我稍微摆弄了一下,我设法让标签停留在拇指上(我之前修改了滑块以逐步工作/捕捉到值),但它仍然高于拇指和这真的很奇怪。我有另一个滑块,其中拇指被修改为 160x30pts,标签留在滑块的 x 原点。
  • 这并不能解决 OP 的问题,它所做的只是用另一个 hack 替换一个获取中心的 hack。在viewDidLoad() 方法中加载滑块后,标签仍然不会显示,这是 OP(和我)正在寻找的。​​span>
【解决方案2】:

your linked question 的代码工作正常,无需更改。

添加此方法,初始值将在您的UISlider 上显示为UILabel

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    [mySlider sendActionsForControlEvents:UIControlEventValueChanged];
}

【讨论】:

    【解决方案3】:
    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
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2011-08-13
      • 2023-04-09
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2015-03-09
      相关资源
      最近更新 更多