UISlider 跟踪标注未与拇指对齐

UISlider Tracking Callout Unaligned to Thumb

我有一个 uislider,它有一个标注气泡,其中心 X 位于 uislider 拇指的中心 X 上方。

我在 iPhone 7 上对其进行了测试,它运行良好,移动拇指后它在其他设备上也能正常运行。

我遇到的问题是,在初始加载时,气泡和拇指应该像移动拇指时那样对齐,但在 iPhone 8+ 或 iPhone 这样的设备上SE,气泡的中心 x 偏离拇指的中心 x (+/- 20-ish pts)。

我相信使两个对象对齐的计算是正确的,因为当您实际移动拇指时它工作正常,但拇指 x 的初始计算有些问题。对于一些控制台日志,拇指的 X 最初会读作 180 点,但在触摸时第一个值实际上是 201 点。然后气泡会相应地调整。

我正在为渐变等使用自定义 uislider 子类,这可能会影响它(?)但它仍然在触摸时如何工作令人困惑。

如有任何帮助,我们将不胜感激。

在 viewDidLoad 上(前导约束是安全区域):

distanceSlider.setValue(Float(sliderValue), animated: false)

distanceCalloutViewLeadingConstraint.constant = distanceSlider.thumbCenterX - (distanceCalloutView.center.x - distanceCalloutView.frame.minX)

关于距离变化:

distanceCalloutViewLeadingConstraint.constant = distanceSlider.thumbCenterX - (distanceCalloutView.center.x - distanceCalloutView.frame.minX)

拇指中心 X 扩展:

extension UISlider {
    var thumbCenterX: CGFloat {
        let trackRect = self.trackRect(forBounds: frame)
        let thumbRect = self.thumbRect(forBounds: bounds, trackRect: trackRect, value: value)
        return thumbRect.midX
    }
}

尝试在 viewDidLayoutSubviews() 中设置以下行。看起来添加了滑块的视图未正确布局其大小。

distanceCalloutViewLeadingConstraint.constant = distanceSlider.thumbCenterX - (distanceCalloutView.center.x - distanceCalloutView.frame.minX)

为什么要使用自定义图像并根据滑块值进行调整。可以直接使用

func setThumbImage(_ image: UIImage?, for state: UIControl.State) 检查参考苹果文档 link https://developer.apple.com/documentation/uikit/uislider/1621336-setthumbimage