簡體   English   中英

如何自定義 UISlider 高度

[英]How to customise UISlider height

我有一個項目,必須在其中自定義UISlider元素。 我想知道是否有人知道如何更改,或者是否可以更改UISlide條線的高度。

我試過這樣的事情,但不工作:

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

謝謝

我希望你想在故事板中編輯它,只有行大小,在你的自定義 UISlider 中使用它

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+

 @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

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

對於斯威夫特

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

斯威夫特 3

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))
    }
}

沒有拇指圖像的Swift 4版本。

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))
  }
}

你可以通過UISlider輕松完成它。 看下面的代碼

class CustomUISlider : UISlider
{        
    override func trackRectForBounds(bounds: CGRect) -> CGRect {
    //set your bounds here
    return bounds

   }
}

您應該能夠對 UISlider 進行子類化,然后實現:

- (CGRect)trackRectForBounds:(CGRect)bounds

只需在此處返回新的 CGRect 即可。

我認為上面的答案有一個缺陷:軌道 rect 的原點必須偏移以考慮軌道高度的變化,否則會偏心顯示。 這是我這樣做的方式:

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))
    } 
}

如果您使用自動autolayout您可以在storyboardUISlider上設置height約束。 如果您需要在運行時更改它 - 為約束創建一個IBOutlet並修改其.constant值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM