如何获得UISlider拇指图像的中心

wil*_*lc2 30 iphone user-interface cocoa-touch uislider

我正在创建一个自定义UISlider来测试一些界面的想法.主要是基于使拇指图像更大.

我发现了如何做到这一点,如下:

UIImage *thumb = [UIImage imageNamed:@"newThumbImage_64px.png"];  
[self.slider setThumbImage:thumb forState:UIControlStateNormal];  
[self.slider setThumbImage:thumb forState:UIControlStateHighlighted];  
[thumb release];  
Run Code Online (Sandbox Code Playgroud)

为了计算相关值,我需要知道拇指图像的中心点在被操纵时的位置.这一点应该是它的超视图的坐标.

看看UISlider文档,我没有看到跟踪这个的任何属性.

是否有一些简单的方法来计算这个或者它是否可以从一些现有的价值中得出?

wil*_*lc2 57

这将在视图坐标中返回UISlider的拇指中心图像的正确X位置:

- (float)xPositionFromSliderValue:(UISlider *)aSlider {
     float sliderRange = aSlider.frame.size.width - aSlider.currentThumbImage.size.width;
     float sliderOrigin = aSlider.frame.origin.x + (aSlider.currentThumbImage.size.width / 2.0);

     float sliderValueToPixels = (((aSlider.value - aSlider.minimumValue)/(aSlider.maximumValue - aSlider.minimumValue)) * sliderRange) + sliderOrigin;

     return sliderValueToPixels;
}
Run Code Online (Sandbox Code Playgroud)

将它放在视图控制器中并像这样使用它:(假设属性名为slider)

float x = [self xPositionFromSliderValue:self.slider];
Run Code Online (Sandbox Code Playgroud)

  • 实际上,为了容纳非0(或接近它)的自定义最小值,您需要将其更改为:float sliderValueToPixels =(((aSlider.value-aSlider.minimumValue)/(aSlider.maximumValue-aSlider .minimumValue))*sliderRange)+ sliderOrigin; (9认同)
  • 这适用于我,除了需要一个更改以允许具有自定义最小/最大值的滑块:float sliderValueToPixels =(aSlider.value/aSlider.maximumValue*sliderRange)+ sliderOrigin; 此外,它被调用如下:float x = [self xPositionFromSliderValue:someSlider]; (3认同)

gir*_*_vr 22

我在阅读了上述建议后试过这个 -

yourLabel = [[UILabel alloc]initWithFrame:....];

//Call this method on Slider value change event

-(void)sliderValueChanged{
    CGRect trackRect = [self.slider trackRectForBounds:self.slider.bounds];
    CGRect thumbRect = [self.slider thumbRectForBounds:self.slider.bounds
                               trackRect:trackRect
                                   value:self.slider.value];

    yourLabel.center = CGPointMake(thumbRect.origin.x + self.slider.frame.origin.x,  self.slider.frame.origin.y - 20);
}
Run Code Online (Sandbox Code Playgroud)

对于Swift版本

func sliderValueChanged() -> Void {
        let trackRect =  self.slider.trackRect(forBounds: self.slider.bounds)
        let thumbRect = self.slider.thumbRect(forBounds: self.slider.bounds, trackRect: trackRect, value: self.slider.value)
        yourLabel.center = CGPoint(x: thumbRect.origin.x + self.slider.frame.origin.x + 30, y: self.slider.frame.origin.y - 60)
    }
Run Code Online (Sandbox Code Playgroud)

通过使用此代码段,我可以获得最准确的价值.


Med*_*ida 19

斯威夫特3

extension UISlider {
    var thumbCenterX: CGFloat {
        let trackRect = self.trackRect(forBounds: frame)
        let thumbRect = self.thumbRect(forBounds: bounds, trackRect: trackRect, value: value)
        return thumbRect.midX
    }
}
Run Code Online (Sandbox Code Playgroud)


Psy*_*cho 11

我想知道为什么没有人提供阅读手册中最简单的答案.您可以通过简单地使用以下方法准确地计算所有这些值并确保它们保持原样:

- (CGRect)trackRectForBounds:(CGRect)bounds
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value
Run Code Online (Sandbox Code Playgroud)

您可以在开发人员文档中轻松找到它.

如果拇指图像发生更改并且您想要更改其定位方式,则可以继承并覆盖这些方法.第一个给你一个矩形,拇指可以在第二个移动拇指本身的位置.

  • 文档说明了这两种方法:"你不应该直接调用这种方法." (6认同)

Yar*_*sim 10

最好使用-[UIView convertRect:fromView:]方法代替.没有任何复杂的计算,它更清洁,更容易:

- (IBAction)scrub:(UISlider *)sender
{
    CGRect _thumbRect = [sender thumbRectForBounds:sender.bounds
                                        trackRect:[sender trackRectForBounds:sender.bounds]
                                            value:sender.value];
    CGRect thumbRect = [self.view convertRect:_thumbRect fromView:sender];

    // Use the rect to display a popover (pre iOS 8 code)
    [self.popover dismissPopoverAnimated:NO];
    self.popover = [[UIPopoverController alloc] initWithContentViewController:[UIViewController new]];
    [self.popover presentPopoverFromRect:thumbRect inView:self.view
                permittedArrowDirections:UIPopoverArrowDirectionDown|UIPopoverArrowDirectionUp animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

  • 这是明确的答案.无需子类化UISlider.谢谢 (2认同)

luv*_*ere 6

我通过首先将UISlider的值间隔以百分比映射,然后取滑块大小的相同百分比减去拇指大小的百分比来接近它,这是我添加拇指大小的一半以获得其中心的值.

    - (float)mapValueInIntervalInPercents: (float)value min: (float)minimum max: (float)maximum
    {
        return (100 / (maximum - minimum)) * value -
               (100 * minimum)/(maximum - minimum);
    }    


    - (float)xPositionFromSliderValue:(UISlider *)aSlider
    {
        float percent = [self mapValueInIntervalInPercents: aSlider.value
                              min: aSlider.minimumValue
                              max: aSlider.maximumValue] / 100.0;

        return percent * aSlider.frame.size.width -
               percent * aSlider.currentThumbImage.size.width +
               aSlider.currentThumbImage.size.width / 2;
    }
Run Code Online (Sandbox Code Playgroud)


Ben*_*ieb 2

稍微玩了一下 IB 和 1px 宽的拇指图像后,拇指的位置正是您所期望的位置:

UIImage       *thumb = [UIImage imageNamed:@"newThumbImage_64px.png"];  
CGRect        sliderFrame = self.slider.frame;
CGFloat       x = sliderFrame.origin.x + slideFrame.size.width * slider.value + thumb.size.width / 2;
CGFloat       y = sliderFrame.origin.y + sliderFrame.size.height / 2;

return CGPointMake(x, y);
Run Code Online (Sandbox Code Playgroud)