// // HMVideoSliderView.m // BuguLive // // Created by 范东 on 2018/12/27. // Copyright © 2018 xfg. All rights reserved. // #import "HMVideoSliderView.h" /** 滑块的大小 */ #define kSliderBtnWH 19.0 /** 间距 */ #define kProgressMargin 2.0 /** 进度的宽度 */ #define kProgressW self.frame.size.width - kProgressMargin * 2 /** 进度的高度 */ #define kProgressH 3.0 @interface HMVideoSliderView() /** 进度背景 */ @property (nonatomic, strong) UIImageView *bgProgressView; /** 缓存进度 */ @property (nonatomic, strong) UIImageView *bufferProgressView; /** 滑动进度 */ @property (nonatomic, strong) UIImageView *sliderProgressView; /** 滑块 */ @property (nonatomic, strong) HMSliderButton *sliderBtn; @property (nonatomic, assign) CGPoint lastPoint; @property (nonatomic, strong) UITapGestureRecognizer *tapGesture; @end @implementation HMVideoSliderView - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.allowTapped = YES; [self addSubViews]; } return self; } - (void)awakeFromNib { [super awakeFromNib]; self.allowTapped = YES; [self addSubViews]; } - (void)layoutSubviews { [super layoutSubviews]; if (self.sliderBtn.hidden) { self.bgProgressView.width = self.width; }else { self.bgProgressView.width = self.width - kProgressMargin * 2; } self.bgProgressView.centerY = self.height * 0.5; self.bufferProgressView.centerY = self.height * 0.5; self.sliderProgressView.centerY = self.height * 0.5; self.sliderBtn.centerY = self.height * 0.5; } /** 添加子视图 */ - (void)addSubViews { self.backgroundColor = [UIColor clearColor]; [self addSubview:self.bgProgressView]; [self addSubview:self.bufferProgressView]; [self addSubview:self.sliderProgressView]; [self addSubview:self.sliderBtn]; // 初始化frame self.bgProgressView.frame = CGRectMake(kProgressMargin, 0, 0, kProgressH); self.bufferProgressView.frame = self.bgProgressView.frame; self.sliderProgressView.frame = self.bgProgressView.frame; self.sliderBtn.frame = CGRectMake(0, 0, kSliderBtnWH, kSliderBtnWH); // 添加点击手势 self.tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; [self addGestureRecognizer:self.tapGesture]; } #pragma mark - Setter - (void)setMaximumTrackTintColor:(UIColor *)maximumTrackTintColor { _maximumTrackTintColor = maximumTrackTintColor; self.bgProgressView.backgroundColor = maximumTrackTintColor; } - (void)setMinimumTrackTintColor:(UIColor *)minimumTrackTintColor { _minimumTrackTintColor = minimumTrackTintColor; self.sliderProgressView.backgroundColor = minimumTrackTintColor; } - (void)setBufferTrackTintColor:(UIColor *)bufferTrackTintColor { _bufferTrackTintColor = bufferTrackTintColor; self.bufferProgressView.backgroundColor = bufferTrackTintColor; } - (void)setMaximumTrackImage:(UIImage *)maximumTrackImage { _maximumTrackImage = maximumTrackImage; self.bgProgressView.image = maximumTrackImage; self.maximumTrackTintColor = [UIColor clearColor]; } - (void)setMinimumTrackImage:(UIImage *)minimumTrackImage { _minimumTrackImage = minimumTrackImage; self.sliderProgressView.image = minimumTrackImage; self.minimumTrackTintColor = [UIColor clearColor]; } - (void)setBufferTrackImage:(UIImage *)bufferTrackImage { _bufferTrackImage = bufferTrackImage; self.bufferProgressView.image = bufferTrackImage; self.bufferTrackTintColor = [UIColor clearColor]; } - (void)setValue:(float)value { _value = value; CGFloat finishValue = self.bgProgressView.width * value; self.sliderProgressView.width = finishValue; self.sliderBtn.left = (self.width - self.sliderBtn.width) * value; self.lastPoint = self.sliderBtn.center; } - (void)setBufferValue:(float)bufferValue { _bufferValue = bufferValue; CGFloat finishValue = self.bgProgressView.width * bufferValue; self.bufferProgressView.width = finishValue; } - (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state { [self.sliderBtn setBackgroundImage:image forState:state]; [self.sliderBtn sizeToFit]; } - (void)setThumbImage:(UIImage *)image forState:(UIControlState)state { [self.sliderBtn setImage:image forState:state]; [self.sliderBtn sizeToFit]; } - (void)showLoading { [self.sliderBtn showActivityAnim]; } - (void)hideLoading { [self.sliderBtn hideActivityAnim]; } - (void)setAllowTapped:(BOOL)allowTapped { _allowTapped = allowTapped; if (!allowTapped) { [self removeGestureRecognizer:self.tapGesture]; } } - (void)setSliderHeight:(CGFloat)sliderHeight { _sliderHeight = sliderHeight; self.bgProgressView.height = sliderHeight; self.bufferProgressView.height = sliderHeight; self.sliderProgressView.height = sliderHeight; } - (void)setIsHideSliderBlock:(BOOL)isHideSliderBlock { _isHideSliderBlock = isHideSliderBlock; // 隐藏滑块,滑杆不可点击 if (isHideSliderBlock) { self.sliderBtn.hidden = YES; self.bgProgressView.left = 0; self.bufferProgressView.left = 0; self.sliderProgressView.left = 0; self.allowTapped = NO; } } #pragma mark - User Action - (void)sliderBtnTouchBegin:(UIButton *)btn { if ([self.delegate respondsToSelector:@selector(sliderTouchBegan:)]) { [self.delegate sliderTouchBegan:self.value]; } } - (void)sliderBtnTouchEnded:(UIButton *)btn { if ([self.delegate respondsToSelector:@selector(sliderTouchEnded:)]) { [self.delegate sliderTouchEnded:self.value]; } } - (void)sliderBtnDragMoving:(UIButton *)btn event:(UIEvent *)event { // 点击的位置 CGPoint point = [event.allTouches.anyObject locationInView:self]; // 获取进度值 由于btn是从 0-(self.width - btn.width) float value = (point.x - btn.width * 0.5) / (self.width - btn.width); // value的值需在0-1之间 value = value >= 1.0 ? 1.0 : value <= 0.0 ? 0.0 : value; [self setValue:value]; if ([self.delegate respondsToSelector:@selector(sliderValueChanged:)]) { [self.delegate sliderValueChanged:value]; } } - (void)tapped:(UITapGestureRecognizer *)tap { CGPoint point = [tap locationInView:self]; // 获取进度 float value = (point.x - self.bgProgressView.left) * 1.0 / self.bgProgressView.width; value = value >= 1.0 ? 1.0 : value <= 0 ? 0 : value; [self setValue:value]; if ([self.delegate respondsToSelector:@selector(sliderTapped:)]) { [self.delegate sliderTapped:value]; } } #pragma mark - 懒加载 - (UIView *)bgProgressView { if (!_bgProgressView) { _bgProgressView = [UIImageView new]; _bgProgressView.backgroundColor = [UIColor grayColor]; _bgProgressView.contentMode = UIViewContentModeScaleAspectFill; _bgProgressView.clipsToBounds = YES; } return _bgProgressView; } - (UIView *)bufferProgressView { if (!_bufferProgressView) { _bufferProgressView = [UIImageView new]; _bufferProgressView.backgroundColor = [UIColor whiteColor]; _bufferProgressView.contentMode = UIViewContentModeScaleAspectFill; _bufferProgressView.clipsToBounds = YES; } return _bufferProgressView; } - (UIView *)sliderProgressView { if (!_sliderProgressView) { _sliderProgressView = [UIImageView new]; _sliderProgressView.backgroundColor = [UIColor redColor]; _sliderProgressView.contentMode = UIViewContentModeScaleAspectFill; _sliderProgressView.clipsToBounds = YES; } return _sliderProgressView; } - (HMSliderButton *)sliderBtn { if (!_sliderBtn) { _sliderBtn = [HMSliderButton new]; // _sliderBtn.backgroundColor = [UIColor whiteColor]; [_sliderBtn addTarget:self action:@selector(sliderBtnTouchBegin:) forControlEvents:UIControlEventTouchDown]; [_sliderBtn addTarget:self action:@selector(sliderBtnTouchEnded:) forControlEvents:UIControlEventTouchCancel]; [_sliderBtn addTarget:self action:@selector(sliderBtnTouchEnded:) forControlEvents:UIControlEventTouchUpInside]; [_sliderBtn addTarget:self action:@selector(sliderBtnTouchEnded:) forControlEvents:UIControlEventTouchUpOutside]; [_sliderBtn addTarget:self action:@selector(sliderBtnDragMoving:event:) forControlEvents:UIControlEventTouchDragInside]; } return _sliderBtn; } /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ @end @interface HMSliderButton() @property (nonatomic, strong) UIActivityIndicatorView *indicatorView; @end @implementation HMSliderButton - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; self.indicatorView.hidesWhenStopped = NO; self.indicatorView.userInteractionEnabled = NO; self.indicatorView.frame = CGRectMake(0, 0, 20, 20); self.indicatorView.transform = CGAffineTransformMakeScale(0.6, 0.6); [self addSubview:self.indicatorView]; } return self; } - (void)layoutSubviews { [super layoutSubviews]; self.indicatorView.center = CGPointMake(self.width / 2, self.height/ 2); self.indicatorView.transform = CGAffineTransformMakeScale(0.6, 0.6); } - (void)showActivityAnim { self.indicatorView.hidden = NO; [self.indicatorView startAnimating]; } - (void)hideActivityAnim { self.indicatorView.hidden = YES; [self.indicatorView stopAnimating]; } // 重写此方法将按钮的点击范围扩大 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { CGRect bounds = self.bounds; // 扩大点击区域 bounds = CGRectInset(bounds, -20, -20); // 若点击的点在新的bounds里面。就返回yes return CGRectContainsPoint(bounds, point); } @end