2024-09-27

UISlider 并不能满足平时开发的需求,比如渐变色,可以正负左右滑动带渐变的美颜滑块等等 。鄙人参考网上各种大神的写法,自定义写了 UISlider自定义,自诩效果交互都是很好的。如有更好的想法,欢迎留言沟通

先上效果


IMG_3375.jpg

效果如图

IMG_3376.jpg

具体demo下载地址: https://gitee.com/enterprise-and-taiwan/xaxis-slider

思路如下:

重写 UISlider 的 override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect

1.渐变色整体滑动的slider

把原来的slider背景色置为: maximumTrackTintColor = .clear minimumTrackTintColor = .clear

自定义 背景色的view 与滑动的view 重写 方法 override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect { let result = super.thumbRect(forBounds: bounds, trackRect: rect, value: value)

        let result = super.thumbRect(forBounds: bounds, trackRect: rect, value: value)
        
        let orign = result.origin
        let size = result.size
        let centerX = orign.x + size.width/2.0
        let centerY = orign.y + size.height/2.0
        arrowImgView.frame = CGRect(origin: CGPoint(x: centerX - 3, y: orign.y - 8), size: CGSize(width: 6, height: 6))
        // 2是 微调距离; 0.5 是微调 y 
        lineSelectView.frame = CGRect(x: 2, y: centerY - sliderHeight/2.0-0.5, width: centerX, height: sliderHeight)
        
        titleLabel.text = "\(Int(value))"
        return result
    } ```

2.有正负左右滑动的 slider,同上,多加一个滑块view.同样重写

override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect {
let result = super.thumbRect(forBounds: bounds, trackRect: rect, value: value)

    let orign = result.origin
    let size = result.size
    let centerX = orign.x + size.width/2.0
    let centerY = orign.y + size.height/2.0
    
    let totalSize = rect.size
    // 永远在 thumb的中心位置
    arrowImgView.frame = CGRect(origin: CGPoint(x: centerX - 3, y: orign.y - 8), size: CGSize(width: 6, height: 6))
    // 2是 微调距离; 0.5 是微调 y
    if value > 0 {
        // 左边置灰,右边有颜色
        leftLineSelectView.startColor = .gray
        leftLineSelectView.endColor = .gray
        leftLineSelectView.frame = CGRect(x: 2, y: centerY - sliderHeight/2.0-0.5, width: totalSize.width/2.0+2, height: sliderHeight)
        
        rightLineSelectView.startColor = .orange
        rightLineSelectView.endColor = .yellow
        rightLineSelectView.frame = CGRect(x: totalSize.width/2.0+2, y: centerY - sliderHeight/2.0-0.5, width: totalSize.width*CGFloat((value/(maximumValue-minimumValue))), height: sliderHeight)
        
    }else{
        //右边置灰 ,左边有颜色
        leftLineSelectView.startColor = .orange
        leftLineSelectView.endColor = .yellow
        let leftWidth = totalSize.width*CGFloat((value*(-1)/(maximumValue-minimumValue)))
        leftLineSelectView.frame = CGRect(x: totalSize.width/2.0-leftWidth+2, y: centerY - sliderHeight/2.0-0.5, width:leftWidth+2 , height: sliderHeight)
        
        rightLineSelectView.startColor = .gray
        rightLineSelectView.endColor = .gray
        rightLineSelectView.frame = CGRect(x: totalSize.width/2.0+2, y: centerY - sliderHeight/2.0-0.5, width: totalSize.width/2.0-4, height: sliderHeight)
        
        
    }
    
    titleLabel.text = "\(Int(value))"
    return result
}

具体demo下载地址: https://gitee.com/enterprise-and-taiwan/xaxis-slider
如有更好的想法,欢迎留言沟通

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • IOS常用代码总结 1、设置UILabel行间距 NSMutableAttributedString* attrS...
    难却却阅读 588评论 0 0
  • 1、设置UILabel行间距 NSMutableAttributedString* attrString = [[...
    FF_911阅读 1,434评论 0 3
  • 1、设置UILabel行间距 NSMutableAttributedString* attrString = [[...
    十年一品温如言1008阅读 1,742评论 0 3
  • 转自:http://www.code4app.com/blog-866962-1317.html1、设置UILab...
    MMOTE阅读 1,719评论 1 1
  • 一、简介<<UISlider是一个方便的控件,让用户能够以可视化的方式设置指定范围内的值。和按钮一样,滑块也能响应...
    无邪8阅读 2,247评论 0 0