How to get the center of the thumb image of UISlider

后端 未结 12 1652
挽巷
挽巷 2020-11-29 23:18

I\'m creating a custom UISlider to test out some interface ideas. Mostly based around making the thumb image larger.

I found out how to do that, <

相关标签:
12条回答
  • 2020-11-29 23:48

    This will return the correct X position of center of thumb image of UISlider in view coordinates:

    - (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;
    }
    

    Put it in your view controller and use it like this: (assumes property named slider)

    float x = [self xPositionFromSliderValue:self.slider];
    
    0 讨论(0)
  • 2020-11-29 23:52

    I approached it by first mapping the UISlider's value interval in percents and then taking the same percent of the slider's size minus the percent of the thumb's size, a value to which I added half of the thumb's size to obtain its center.

        - (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;
        }
    
    0 讨论(0)
  • 2020-11-29 23:53

    Here is a Swift 2.2 solution, I created an extension for it. I have only tried this with the default image.

    import UIKit
    
    extension UISlider {
    
        var thumbImageCenterX: CGFloat {
            let trackRect = trackRectForBounds(bounds)
            let thumbRect = thumbRectForBounds(bounds, trackRect: trackRect, value: value)
    
            return thumbRect.origin.x + thumbRect.width / 2 - frame.size.width / 2
        }
    }
    
    0 讨论(0)
  • 2020-11-29 23:56

    AFter a little playing with IB and a 1px wide thumb image, the position of the thumb is exactly where you'd expect it:

    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);
    
    0 讨论(0)
  • 2020-11-29 23:58

    It's better to use -[UIView convertRect:fromView:] method instead. It's cleaner and easier without any complicated calculations:

    - (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];
    }
    
    0 讨论(0)
  • 2020-11-29 23:58

    step 1 :get View for detect position (use same extension top commet of# Ovi Bortas)

    @IBOutlet weak var sliderView: UIView!

    step 2 : set label frame for add sub view func setLabelThumb(slider:UISlider,value:Float){ slider.value = value

    let label = UILabel(frame:  CGRect(x: slider.thumbCenterX - 20, y: slider.frame.origin.y - 25, width: 50, height: 30))
    label.font = UIFont.systemFont(ofSize: 10.0)
    label.textColor = UIColor.red
    label.textAlignment = .center
    label.text = "\(value) kg."
    
    sliderView.addSubview(label)
    

    }

    0 讨论(0)
提交回复
热议问题