iOS开发 UISlider设置滑块形状

1,930 阅读1分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。

需求

今天需求是做一个播放器界面,如下图

e78b77ae6759367a87fc9eca31729637_webp.webp

播放进度条呢,一般有两种方式

  • ProgressView
  • UISlider
    最开始需求是进度条不让拖动,本着后期需求的一个更改性,最终选择了使用UISlider来实现播放进度条。
    好久没用到过UISlider了,需要注意的地方有设置UISlider的高度可不只是看到的那一丢丢高度,就因为高度设置的不对,会走很多弯路。
    UISlider的高度不小于你定义滑块样式的高度,如下代码
    self.slider = [[UISlider alloc]init];
    self.slider.minimumTrackTintColor = [UIColor whiteColor];
    self.slider.maximumTrackTintColor = kColorRGBA(0xFFFFFF, 0.1);
    [self.view addSubview:self.slider];
    [self.slider makeConstraints:^(MASConstraintMaker *make) {
        make.height.equalTo(scaleFactorForWidth(10));
        make.width.equalTo(kScreen_width - scaleFactorForWidth(78));
        make.centerX.equalTo(self.contentImageView);
        make.top.equalTo(self.typeLabel.mas_bottom).offset(scaleFactorForWidth(35));
    }];
    self.slider.layer.cornerRadius = 2;
    self.slider.layer.masksToBounds = YES;
    
    UIView * SliderImageView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 2, 10)];
    SliderImageView.layer.cornerRadius = 1;
    SliderImageView.layer.masksToBounds = YES;
    SliderImageView.backgroundColor = [UIColor whiteColor];

    [self.slider setThumbImage: [UIImage convertViewToImage:SliderImageView] forState:UIControlStateNormal];
    [self.slider setThumbImage: [UIImage convertViewToImage:SliderImageView]  forState:UIControlStateHighlighted];

UI设计稿中UISlider轨道高度是4个像素,然后误以为整个UISlider高度就是4,这个时候就会出现因为高度不够导致滑块的样式是个错误的。

其中minimumTrackTintColor为左边轨道的颜色可以理解为已播放部分的颜色,maximumTrackTintColor为右边轨道的颜色可以理解为未播放部分的颜色 。SliderImageView是一个view,一个滑块的view,convertViewToImage是一个image的类拓展,将view转化成image

+ (UIImage *)convertViewToImage:(UIView *)view {
    UIImage *image = [[UIImage alloc]init];
    //UIGraphicsBeginImageContextWithOptions(区域大小, 是否是非透明的, 屏幕密度);
    UIGraphicsBeginImageContextWithOptions(view.frame.size, YES, [UIScreen mainScreen].scale);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

后面内容想起来多少,或者使用过程中遇到什么问题了再进行补充!

参考

IOS 控件 自定义UISlider Slider

iOS 自定义UISlider