UISlider with ProgressView combined

后端 未结 9 1359
无人共我
无人共我 2020-11-29 16:07

Is there an apple-house-made way to get a UISlider with a ProgressView. This is used by many streaming applications e.g. native quicktimeplayer or youtube. (Just to be sure:

相关标签:
9条回答
  • 2020-11-29 17:08

    for Swift5

    First, add tap gesture to slider:

    let tap_gesture = UITapGestureRecognizer(target: self, action: #selector(self.sliderTapped(gestureRecognizer:)))
    self.slider.addGestureRecognizer(tap_gesture)
    

    Then, implement this function:

    @objc func sliderTapped(gestureRecognizer: UIGestureRecognizer) {
        
        let locationOnSlider = gestureRecognizer.location(in: self.slider)
        let maxWidth = self.slider.frame.size.width
        let touchLocationRatio = locationOnSlider.x * CGFloat(self.slider.maximumValue) / CGFloat(maxWidth)
        self.slider.value = Float(touchLocationRatio)
        
        print("New value: ", round(self.slider.value))
       
    }
    
    0 讨论(0)
  • 2020-11-29 17:09

    Here is a solution in Objective C. https://github.com/abhimuralidharan/BufferSlider

    The idea is to create a UIProgressview as a property in the UISlider subclass and add the required constraints programatically.

    #import <UIKit/UIKit.h> //.h file
    
    @interface BufferSlider : UISlider
    @property(strong,nonatomic) UIProgressView *bufferProgress;
    @end
    
    #import "BufferSlider.h" //.m file
    
    @implementation BufferSlider
    
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            [self setup];
        }
        return self;
    }
    -(void)setup {
        self.bufferProgress = [[UIProgressView alloc] initWithFrame:self.bounds];
        self.minimumTrackTintColor = [UIColor redColor];
        self.maximumTrackTintColor = [UIColor clearColor];
        self.value = 0.2;
        self.bufferProgress.backgroundColor = [UIColor clearColor];
        self.bufferProgress.userInteractionEnabled = NO;
        self.bufferProgress.progress = 0.7;
        self.bufferProgress.progressTintColor = [[UIColor blueColor] colorWithAlphaComponent:0.5];
        self.bufferProgress.trackTintColor = [[UIColor lightGrayColor] colorWithAlphaComponent:2];
        [self addSubview:self.bufferProgress];
        [self setThumbImage:[UIImage imageNamed:@"redThumb"] forState:UIControlStateNormal];
        self.bufferProgress.translatesAutoresizingMaskIntoConstraints = NO;
    
        NSLayoutConstraint *left = [NSLayoutConstraint constraintWithItem:self.bufferProgress attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1 constant:0];
        NSLayoutConstraint *centerY = [NSLayoutConstraint constraintWithItem:self.bufferProgress attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1 constant:0.75];  // edit the constant value based on the thumb image
        NSLayoutConstraint *right = [NSLayoutConstraint constraintWithItem:self.bufferProgress attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTrailing multiplier:1 constant:0];
    
        [self addConstraints:@[left,right,centerY]];
        [self sendSubviewToBack:self.bufferProgress];
    }
    - (instancetype)initWithCoder:(NSCoder *)coder
    {
        self = [super initWithCoder:coder];
        if (self) {
            [self setup];
        }
        return self;
    }
    @end
    
    0 讨论(0)
  • 2020-11-29 17:10

    This is doable using the standard controls.

    In Interface Builder place your UISlider immediately on top of your UIProgressView and make them the same size.

    On a UISlider the background horizontal line is called the track, the trick is to make it invisible. We do this with a transparent PNG and the UISlider methods setMinimumTrackImage:forState: and setMaximumTrackImage:forState:.

    In the viewDidLoad method of your view controller add:

    [self.slider setMinimumTrackImage:[UIImage imageNamed:@"transparent.png"] forState:UIControlStateNormal];
    [self.slider setMaximumTrackImage:[UIImage imageNamed:@"transparent.png"] forState:UIControlStateNormal];
    

    where self.slider refers to your UISlider.

    I've tested the code in Xcode, and this will give you a slider with an independent progress bar.

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