【问题标题】:How to make UISlider default thumb to be smaller like the ones in the iOS control center如何使 UISlider 默认拇指像 iOS 控制中心中的一样小
【发布时间】:2017-06-24 21:03:54
【问题描述】:

我正在开发一个应用程序,我有一个自定义 UISlider
但是,我在如何使 default 拇指看起来像 iOS 控制中心中的拇指一样小时遇到了一些问题。
请注意,我想要相同的 iOS 拇指,而不是自定义拇指图像。到目前为止,我已经尝试过 thumbRect(forBounds...) 但没有运气。
有什么建议吗?

【问题讨论】:

  • UISliders 有一个内在的高度,这使得(我认为)对自定义滑块的需求几乎是给定的。

标签: swift swift3 uikit uislider


【解决方案1】:
  1. 下载与您在 iOS 控制中心中的图像相似的图像。

  2. 将其缩放到您想要的大小(20x20 或更小)并将其保存在您的资源中。

  3. 在 viewDidLoad 中粘贴以下代码:

    self.yourSlider.setThumbImage(UIImage(named: "SliderName")!, for: .normal)
    

【讨论】:

  • 自己尝试一下——它会导致错误
  • 你能同时改变拇指的色调吗?
【解决方案2】:

您无法更改默认缩略图的大小,但 UISlider 有一个方法 setThumbImage(_:for:) 可以让您传递类似的较小图像。

在您的视图控制器中 viewDidLoad

let image:UIImage? = // ...
yourSlider.setThumbImage(image, for: .normal)
yourSlider.setThumbImage(image, for: .highlighted) // Also change the image when dragging the slider

请参阅 API 参考的Customizing the Slider’s Appearance


在 iOS10 上,默认的拇指图像看起来不超过一个带有细阴影的带边框的白色圆圈(如果您没有设置 thumbTintColor)。

我使用这个snippet 来生成一个可以缩小的类似图像;)

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var data = " \
<svg xmlns='http://www.w3.org/2000/svg' width='86' height='86'> \
<foreignObject width='100%' height='100%'> \
	<div xmlns='http://www.w3.org/1999/xhtml'> \
		<style> \
		#ios-uislider-thumb { \
		  -webkit-box-sizing: content-box; \
		  -moz-box-sizing: content-box; \
		  box-sizing: content-box; \
		  width: 66px; \
		  height: 66px; \
		  overflow: hidden; \
		  border: 1px solid #CCC; \
		  -webkit-border-radius: 33px; \
		  border-radius: 33px; \
		  background: #FFFFFF; \
		  -webkit-box-shadow: 0 6px 6px 0 rgba(0,0,0,0.2); \
		  box-shadow: 0 6px 6px 0 rgba(0,0,0,0.2); \
		  margin : 5px 10px 15px 10px; \
		} \
		</style> \
		<div id='ios-uislider-thumb'></div> \
	</div> \
</foreignObject> \
</svg> \
";
var DOMURL = self.URL || self.webkitURL || self;
var img = new Image();
var svg = new Blob([data], {
  type: "image/svg+xml;charset=utf-8"
});
var url = DOMURL.createObjectURL(svg);
img.onload = function() {
  ctx.drawImage(img, 0, 0);
  DOMURL.revokeObjectURL(url);
};
img.src = url;
&lt;canvas id="canvas" style="border:2px dotted black;" width="86" height="86"&gt;&lt;/canvas&gt;

【讨论】:

  • 我根据图像生成器做了一个小小提琴:jsfiddle.net/x0ry14oL/1/embedded/result/dark(我知道它很乱,但我只是把它放在一起,它可以工作)
  • 如果你使用拇指图像,那么你不能设置色调颜色;我的要求是改变尺寸和色调;滑动时色调颜色值会不断更新。
【解决方案3】:

这是一个适合您的选项,使用 CGAffineTransform。

斯威夫特 4

mySlider.transform = CGAffineTransform(scaleX: 0.85, y: 0.85)

这将改变滑块的宽度和高度,因此您可能需要将其与界面重新对齐。

【讨论】:

  • 您还可以添加如下约束:mySlider.centerXAnchor.constraint(equalTo: centerXAnchor)mySlider.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 1 / 0.85) 使其像以前一样重新填充大小。
  • 它缩放整个滑块。问题只是调整拇指的大小!
【解决方案4】:

如果您想更改拇指图像和色调颜色,那么两者都不可能;此问题有一种解决方法。以编程方式创建圆形图像并更改图像的颜色并将该图像分配给滑块;这样,您还可以调整图像的大小和颜色。

这是完整的示例代码:

fileprivate func makeCircleWith(size: CGSize, backgroundColor: UIColor) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
    let context = UIGraphicsGetCurrentContext()
    context?.setFillColor(backgroundColor.cgColor)
    context?.setStrokeColor(UIColor.clear.cgColor)
    let bounds = CGRect(origin: .zero, size: size)
    context?.addEllipse(in: bounds)
    context?.drawPath(using: .fill)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

你可以这样调用这个函数:

    func setSliderThumbTintColor(_ color: UIColor) {
    let circleImage = makeCircleWith(size: CGSize(width: 20, height: 20),
                   backgroundColor: color)
    slider.setThumbImage(circleImage, for: .normal)
    slider.setThumbImage(circleImage, for: .highlighted)
}

这个方法setSliderThumbTintColor将在UISlider的valueChanged事件上被调用。

【讨论】:

  • 我认为这是最好的答案!竖起大拇指(双关语)??
【解决方案5】:

我创建了一个UISlider 子类,它允许在不使用图像的情况下更改拇指大小和轨道大小。

import UIKit

class CustomSlider: UISlider {

    @IBInspectable var trackHeight: CGFloat = 3

    @IBInspectable var thumbRadius: CGFloat = 20

    // Custom thumb view which will be converted to UIImage
    // and set as thumb. You can customize it's colors, border, etc.
    private lazy var thumbView: UIView = {
        let thumb = UIView()
        thumb.backgroundColor = .yellow//thumbTintColor
        thumb.layer.borderWidth = 0.4
        thumb.layer.borderColor = UIColor.darkGray.cgColor
        return thumb
    }()

    override func awakeFromNib() {
        super.awakeFromNib()
        let thumb = thumbImage(radius: thumbRadius)
        setThumbImage(thumb, for: .normal)
    }

    private func thumbImage(radius: CGFloat) -> UIImage {
        // Set proper frame
        // y: radius / 2 will correctly offset the thumb

        thumbView.frame = CGRect(x: 0, y: radius / 2, width: radius, height: radius)
        thumbView.layer.cornerRadius = radius / 2

        // Convert thumbView to UIImage
        // See this: https://stackoverflow.com/a/41288197/7235585

        let renderer = UIGraphicsImageRenderer(bounds: thumbView.bounds)
        return renderer.image { rendererContext in
            thumbView.layer.render(in: rendererContext.cgContext)
        }
    }

    override func trackRect(forBounds bounds: CGRect) -> CGRect {
        // Set custom track height
        // As seen here: https://stackoverflow.com/a/49428606/7235585
        var newRect = super.trackRect(forBounds: bounds)
        newRect.size.height = trackHeight
        return newRect
    }

}

结果:

【讨论】:

  • 太棒了!谢谢。
  • 很好的答案,但我认为“半径”应该是“直径”,因为它是拇指的宽度和高度。
  • 这段代码不会改变我的拇指大小——至少它不能让它变小。
  • 它适用于较小的,但需要为选定的拇指添加 setThumbImage(thumb, for: .highlighted)
  • @Steve Macdonald 更改 thumbImage 函数中的“thumbView.frame”半径,您可以更改拇指大小。我把它改成“radius / 4”,看起来更小了。
【解决方案6】:

使用如下自定义图片..

for state: UIControl.State in [.normal, .selected, .application, .reserved] {
            editorSlider.setThumbImage(UIImage.init(named: "slider_thumb"), for: state)
        }

【讨论】:

    【解决方案7】:

    只是一个快速而干净的修复:

       [.normal, .highlighted].forEach { state in
            slider.setThumbImage(thumbImage, for: state)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多