| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- //
- // 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
|