如何读取 UISlider 拇指图像的大小

Posted

技术标签:

【中文标题】如何读取 UISlider 拇指图像的大小【英文标题】:How to read size of UISlider thumb image 【发布时间】:2014-01-23 16:22:55 【问题描述】:

我正在尝试在 UISlider 的拇指上方居中放置一个额外的 UIView。为此,我需要拇指图像的宽度。在 ios6 中,这工作正常。我可以使用:

CGFloat thumbWidth = self.navSlider.currentThumbImage.size.width;

(如本答案所示:How to get the center of the thumb image of UISlider)

这在 iOS7 中返回 0.0f。我也尝试过使用:

UIImage *thumb = [self.navSlider thumbImageForState:UIControlStateNormal];

但拇指最终为零。

是否可以读取默认滑块缩略图的大小?还是我必须找到它,设置一个常量,Apple 以后如何不更改它?

【问题讨论】:

【参考方案1】:

currentThumbImage 属性上的文档说:

如果没有使用 setThumbImage:forState: 方法,该属性包含值 nil。 在这种情况下,接收器使用默认拇指图像 绘图。

thumbImageForState: 上的文档不太清楚:

返回值与指定状态关联的缩略图,或 如果无法检索到合适的图像,则为零。

我认为您在尝试找出默认拇指大小时可能会不走运。安装一个看起来与系统图像完全一样的“自定义”拇指图像怎么样?这将解决 Apple 将其从您的下方换掉的问题。

【讨论】:

我希望在没有自定义图像的情况下执行此操作,但我认为这可能是唯一的方法。至少它在整个操作系统中看起来是一致的。谢谢!【参考方案2】:

我在我的子类中使用它:

CGRect trackRect = [self trackRectForBounds:self.bounds];
CGRect thumbRect = [self thumbRectForBounds:self.bounds trackRect:trackRect value:0];
CGSize thumbSize = thumbRect.size;

【讨论】:

聪明的答案。但是,我们仍然可以在没有子类的情况下获得拇指的大小或矩形: ` 使用slider?.superview.convertRect(thumbRect, fromView: slider) 在superview的坐标中使用它。 太棒了!【参考方案3】:

您需要使用 setThumbImage forState 设置初始拇指图像。这在 iOS7 中对我来说很好,并返回图像的正确宽度。滑块设置在故事板中并通过 IBOutlet 连接。

- (void)viewDidLoad

    [super viewDidLoad];

    [self.slider setThumbImage:[UIImage imageNamed:@"tick.jpg"] forState:UIControlStateNormal];

    float check = self.slider.currentThumbImage.size.width;
    NSLog(@"Check is %f", check);


【讨论】:

我希望在不为滑块提供自定义图像的情况下做到这一点。不过,这可能是让它发挥作用的唯一方法。【参考方案4】:

如果布局流程尚未完成,我相信这有时会返回 0。我遇到了一些麻烦。

CGRect thumbRect = [self thumbRectForBounds:self.bounds
                                  trackRect:[self trackRectForBounds:self.bounds]
                                      value:self.value];
CGFloat thumbDiameter = CGRectGetHeight(thumbRect);

【讨论】:

【参考方案5】:

这是另一个可行的方法,但它比第一个更“hackier”,并假设默认拇指图像宽度在未来版本的 iOS(过去 11 版)中不会改变

- (CGFloat)thumbImageWidth // default thumb image is 30 px,

    double imgThumbImageWidth = self.currentThumbImage.size.width;
    if (imgThumbImageWidth && imgThumbImageWidth != 0 && imgThumbImageWidth != thumbImageWidth) 
        thumbImageWidth = imgThumbImageWidth;
    
    else if (!thumbImageWidth || thumbImageWidth == 0)  // No custom image set, use 30
        thumbImageWidth = 31;
    
    return thumbImageWidth;

【讨论】:

以上是关于如何读取 UISlider 拇指图像的大小的主要内容,如果未能解决你的问题,请参考以下文章

查找时如何更改 UISlider 拇指的大小

在 Swift 中更改 UISlider 拇指的大小

如何保持 UISlider 拇指小但分辨率更高的照片?

UISlider 拇指图像像素化

调整 UISlider 拇指图像

具有清晰背景的 UISlider 拇指图像在其后面显示轨道