swift - UISlider 在 ViewDidLoad() 中没有 subview

标签 swift uilabel uislider

我想在 UISlider 的拇指上放置一个 UILabel

我的代码基于此:Another SO question

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

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

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

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

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

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

最佳答案

mySlider.subviews.last 不是获取 thumbImage 中心的可靠方法。文档中的任何地方都没有提到它。我个人认为以这种方式来做是很老套的。

但是,要获得 slider 的中心,您可以根据 slidervalue 使用 的组合进行计算trackRectForBoundsthumbRectForBounds

这应该适合你:

@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。最后设置中心,同时考虑 slider 的宽度和高度以及拇指大小。

请记住将您的 label 文本对齐设置为居中。

关于swift - UISlider 在 ViewDidLoad() 中没有 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38412877/

相关文章:

ios - 使用滑动手势快速更改 UISlider 值

ios - UISlider 移动不稳定和/或重绘缓慢

ios - SwiftUI 中的 WKWebView - 用户与网站交互时如何切换 View ?

swift - 无法将 firebase 导入到我的 swift 项目中

swift - 在 swift 中将整数更新为标签

ios - 更改 UILabel 文本会导致可移动的 UIImageView 对象恢复到原始位置

iOS:UILabel 文本不会加载

ios - Swift 3 - Firebase 推送通知,我该怎么做?

cocoa - 无法在 Swift 中创建对 AppDelegate 类的引用

ios - 尝试从 UISlider 和文本标签中删除小数