【问题标题】:UISlider: changed hight, but maximum value flashesUISlider:改变了高度,但最大值闪烁
【发布时间】:2018-11-12 13:16:12
【问题描述】:

我自定义了一个 UISlider 并且一切正常,除非我将滑块拖动到 100%。然后用正方形替换圆形帽。

这是我自定义 Slider 的方法:

@IBInspectable var trackHeight: CGFloat = 14

override func trackRect(forBounds bounds: CGRect) -> CGRect {
    return CGRect(origin: bounds.origin, size: CGSize(width: bounds.width, height: trackHeight))
}

98% 图片:

100% 图片:

【问题讨论】:

    标签: ios swift uiview uislider


    【解决方案1】:

    您可以通过将minimumTrackTintColormaximumTrackTintColor设置为UIColor.clear来移除轨道背景并自己绘制轨道背景。

    例如:

    class CustomSlider: UISlider {
    
        override func trackRect(forBounds bounds: CGRect) -> CGRect {
            return bounds
        }
    
        override func draw(_ rect: CGRect) {
            guard let context = UIGraphicsGetCurrentContext() else {
                return
            }
    
            context.setFillColor(UIColor.green.cgColor)
            let path = UIBezierPath(roundedRect: rect, cornerRadius: rect.size.height / 2).cgPath
            context.addPath(path)
            context.fillPath()
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      这里有一些快速解决方案

      你已经改变了线条的框架,默认的高度更高,这就是你看到它的原因。

      您可以在 100% 处移动一点点滑块。

      override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect {
          var rect = super.thumbRect(forBounds: bounds, trackRect: rect, value: value)
          if value > 0.99 {
              rect = CGRect(x: rect.origin.x+2, y: rect.origin.y, width: rect.size.width, height: rect.size.height)
          }
          return rect
      }
      

      或者你可以让拇指变大以覆盖角落,这取决于你。

      【讨论】:

      • 但是为什么在 (>1 value
      • 我把你的 0.99 换成了 99
      • 抱歉,我使用了最小值和最大值的默认设置。而它的 0.0 到 1.0。
      • 让 normalizedValue = value / maximumValue if normalizedValue > 0.98 { 解决这个问题
      【解决方案3】:

      这里的原始答案:Thumb image does not move to the edge of UISlider

      更新到 swift 4.2:

      override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect {
          let unadjustedThumbrect = super.thumbRect(forBounds: bounds, trackRect: rect, value: value)
          let thumbOffsetToApplyOnEachSide:CGFloat = unadjustedThumbrect.size.width / 2.0
          let minOffsetToAdd = -thumbOffsetToApplyOnEachSide
          let maxOffsetToAdd = thumbOffsetToApplyOnEachSide
          let offsetForValue = minOffsetToAdd + (maxOffsetToAdd - minOffsetToAdd) * CGFloat(value / (self.maximumValue - self.minimumValue))
          var origin = unadjustedThumbrect.origin
          origin.x += offsetForValue
          return CGRect(origin: origin, size: unadjustedThumbrect.size)
      }
      

      【讨论】:

      • 边缘仍然存在。没有任何改变
      • 奇怪,对我来说很好用,你有没有在你的 UISlider 子类中实现这个代码?
      • 是的,我也实现了轨道矩形。最大值是 100 而不是 1
      • 好的,我改成 100 还在工作,你用什么 trackHeight 测试它?
      • with 14. 我是否正确地认为我必须最小化滑块的框架,以便为现在需要更多空间的拇指留出空间?
      猜你喜欢
      • 2014-06-12
      • 2011-09-15
      • 2014-03-27
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多