UISlider跟踪标注未对齐拇指

时间:2018-10-05 21:20:12

标签: ios swift uislider

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

我在iPhone 7上对其进行了测试,它可以完美运行,一旦拇指移动,它也可以在其他设备上完美运行。

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

我相信将两个对象对齐的计算是正确的,因为当您实际移动拇指时,它可以很好地工作,但是对拇指x进行初始计算的操作已关闭。对于某些控制台日志,拇指的X最初将读取为180 pts,但是在触摸时,第一个值实际上是201 pts。然后气泡会相应调整。

我正在为渐变等使用自定义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
    }
}

1 个答案:

答案 0 :(得分:0)

尝试在viewDidLayoutSubviews()中的行下面进行设置。看起来添加了滑块的视图布局不正确。

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

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

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