关于ios:如何自定义UISlider高度

How to customise UISlider height

我有一个必须自定义UISlider元素的项目。
我想知道是否有人知道如何更改,或者是否可以更改UISlide条形线的高度。

我尝试过类似的操作,但不起作用:

1
2
3
let customBounds = CGRect(origin: bounds.origin,
                          size: CGSize(width: bounds.size.width, height: 15.0))
feedbackSlider.trackRectForBounds(customBounds)

谢谢


我希望您要在情节提要中对其进行编辑,并且仅在行大小中将其用于自定义UISlider

1
2
3
4
5
6
7
8
9
10
11
12
class CustomSlide: UISlider {

     @IBInspectable var trackHeight: CGFloat = 2

     override func trackRectForBounds(bounds: CGRect) -> CGRect {
         //set your bounds here
         return CGRect(origin: bounds.origin, size: CGSizeMake(bounds.width, trackHeight))



       }
}

覆盖trackRect是一种方法,但是,如果您使用其他UISlider的视图,例如minimumValueImage, maximumValueImage,则还需要考虑其边界,否则它们将与滑块的轨迹重叠。作为快捷方式,您可以简单地使用super的func:

固定版本。

雨燕3

1
2
3
4
5
6
7
8
9
10
11
12
 @IBDesignable
    class CustomSlider: UISlider {
       /// custom slider track height
       @IBInspectable var trackHeight: CGFloat = 3

       override func trackRect(forBounds bounds: CGRect) -> CGRect {
           // Use properly calculated rect
           var newRect = super.trackRect(forBounds: bounds)
           newRect.size.height = trackHeight
           return newRect
       }
}


您可以在自定义滑块中覆盖方法

对于Objective-C

1
2
3
4
- (CGRect)trackRectForBounds:(CGRect)bounds {
    CGRect rect = CGRectMake(0, 0, 100, 30);//change it to any size you want
    return rect;
}

对于Swift

1
2
3
4
override func trackRectForBounds(bounds: CGRect) -> CGRect {
    var rect:CGRect = CGRectMake(0, 0, 100, 30)
    return rect
}


不带thumbImage的Swift 4版本。

1
2
3
4
5
6
7
class CustomSlider: UISlider {
  @IBInspectable var trackHeight: CGFloat = 2

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

迅捷3

1
2
3
4
5
6
7
class MySlide: UISlider {

    @IBInspectable var height: CGFloat = 2        
    override func trackRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(origin: bounds.origin, size: CGSize(width: bounds.width, height: height))
    }
}

U可以通过子类化UISlider轻松完成。参见以下代码

1
2
3
4
5
6
7
8
class CustomUISlider : UISlider
{        
    override func trackRectForBounds(bounds: CGRect) -> CGRect {
    //set your bounds here
    return bounds

   }
}

我认为上面的答案有一个缺陷:必须校正Railsrect的原点以解决Rails高度的变化,否则它将偏心显示。这是我的操作方式:

1
2
3
4
5
6
7
8
9
class CustomSlider: UISlider {

@IBInspectable var sliderTrackHeight : CGFloat = 2

    override func trackRect(forBounds bounds: CGRect) -> CGRect {
        let originalRect = super.trackRect(forBounds: bounds)
        return CGRect(origin: CGPoint(x: originalRect.origin.x, y: originalRect.origin.y + (sliderTrackHeight / 2)), size: CGSize(width: bounds.width, height: sliderTrackHeight))
    }
}

您应该能够继承UISlider的子类,然后实现:

1
- (CGRect)trackRectForBounds:(CGRect)bounds

只需在此处返回新的CGRect。


如果使用的是autolayout,则可以在storyboard中的UISlider上设置height约束。如果需要在运行时进行更改-为约束创建一个IBOutlet并修改其.constant值。