YBIBVideoActionBar.m 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. //
  2. // YBIBVideoActionBar.m
  3. // YBImageBrowserDemo
  4. //
  5. // Created by 波儿菜 on 2019/7/11.
  6. // Copyright © 2019 杨波. All rights reserved.
  7. //
  8. #import "YBIBVideoActionBar.h"
  9. #import "YBIBIconManager.h"
  10. @interface YBVideoBrowseActionSlider : UISlider
  11. @end
  12. @implementation YBVideoBrowseActionSlider
  13. - (instancetype)initWithFrame:(CGRect)frame {
  14. self = [super initWithFrame:frame];
  15. if (self) {
  16. [self setThumbImage:YBIBIconManager.sharedManager.videoDragCircleImage() forState:UIControlStateNormal];
  17. self.minimumTrackTintColor = LZ7C69FEColor;
  18. self.maximumTrackTintColor = HexColorFromRGB(0xCBCBCB);
  19. self.layer.shadowColor = UIColor.darkGrayColor.CGColor;
  20. self.layer.shadowOffset = CGSizeMake(0, 1);
  21. self.layer.shadowOpacity = 1;
  22. self.layer.shadowRadius = 4;
  23. }
  24. return self;
  25. }
  26. - (CGRect)trackRectForBounds:(CGRect)bounds {
  27. CGRect frame = [super trackRectForBounds:bounds];
  28. return CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, 2);
  29. }
  30. - (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value {
  31. CGRect frame = [super thumbRectForBounds:bounds trackRect:rect value:value];
  32. return CGRectMake(frame.origin.x - 10, frame.origin.y - 10, frame.size.width + 20, frame.size.height + 20);
  33. }
  34. @end
  35. @interface YBIBVideoActionBar ()
  36. @property (nonatomic, strong) UIButton *playButton;
  37. @property (nonatomic, strong) UILabel *preTimeLabel;
  38. @property (nonatomic, strong) UILabel *sufTimeLabel;
  39. @property (nonatomic, strong) YBVideoBrowseActionSlider *slider;
  40. @end
  41. @implementation YBIBVideoActionBar {
  42. BOOL _dragging;
  43. }
  44. #pragma mark - life cycle
  45. - (instancetype)initWithFrame:(CGRect)frame {
  46. self = [super initWithFrame:frame];
  47. if (self) {
  48. _dragging = NO;
  49. [self addSubview:self.playButton];
  50. [self addSubview:self.preTimeLabel];
  51. [self addSubview:self.sufTimeLabel];
  52. [self addSubview:self.slider];
  53. }
  54. return self;
  55. }
  56. - (void)layoutSubviews {
  57. [super layoutSubviews];
  58. CGFloat width = self.bounds.size.width, height = self.bounds.size.height, labelWidth = 55, buttonWidth = 44, labelOffset = 10;
  59. CGFloat imageWidth = YBIBIconManager.sharedManager.videoPlayImage().size.width;
  60. CGFloat offset = (buttonWidth - imageWidth) * 0.5;
  61. self.playButton.frame = CGRectMake(10, 0, buttonWidth, height);
  62. self.preTimeLabel.frame = CGRectMake(CGRectGetMaxX(self.playButton.frame) + labelOffset - offset, 0, labelWidth, height);
  63. self.sufTimeLabel.frame = CGRectMake(width - labelWidth - labelOffset, 0, labelWidth, height);
  64. self.slider.frame = CGRectMake(CGRectGetMaxX(self.preTimeLabel.frame), 0, CGRectGetMinX(self.sufTimeLabel.frame) - CGRectGetMaxX(self.preTimeLabel.frame), height);
  65. }
  66. #pragma mark - public
  67. + (CGFloat)defaultHeight {
  68. return 44;
  69. }
  70. - (void)setMaxValue:(float)value {
  71. self.slider.maximumValue = value;
  72. self.sufTimeLabel.attributedText = [self.class timeformatFromSeconds:value];
  73. }
  74. - (void)setCurrentValue:(float)value {
  75. if (!_dragging) {
  76. [self.slider setValue:value animated:YES];
  77. }
  78. self.preTimeLabel.attributedText = [self.class timeformatFromSeconds:value];
  79. }
  80. - (void)pause {
  81. self.playButton.selected = NO;
  82. }
  83. - (void)play {
  84. _dragging = NO;
  85. self.playButton.selected = YES;
  86. self.slider.userInteractionEnabled = YES;
  87. }
  88. #pragma mark - private
  89. + (NSAttributedString *)timeformatFromSeconds:(NSInteger)seconds {
  90. NSInteger hour = seconds / 3600, min = (seconds % 3600) / 60, sec = seconds % 60;
  91. NSString *text = seconds > 3600 ? [NSString stringWithFormat:@"%02ld:%02ld:%02ld", (long)hour, (long)min, (long)sec] : [NSString stringWithFormat:@"%02ld:%02ld", (long)min, (long)sec];
  92. NSShadow *shadow = [NSShadow new];
  93. shadow.shadowBlurRadius = 4;
  94. shadow.shadowOffset = CGSizeMake(0, 1);
  95. shadow.shadowColor = UIColor.darkGrayColor;
  96. NSAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:text attributes:@{NSShadowAttributeName:shadow, NSFontAttributeName:[UIFont boldSystemFontOfSize:11]}];
  97. return attr;
  98. }
  99. #pragma mark - touch event
  100. - (void)clickPlayButton:(UIButton *)button {
  101. button.userInteractionEnabled = NO;
  102. if (button.selected) {
  103. [self.delegate yb_videoActionBar:self clickPauseButton:button];
  104. } else {
  105. [self.delegate yb_videoActionBar:self clickPlayButton:button];
  106. }
  107. button.userInteractionEnabled = YES;
  108. }
  109. - (void)respondsToSliderTouchFinished:(UISlider *)slider {
  110. [self.delegate yb_videoActionBar:self changeValue:slider.value];
  111. }
  112. - (void)respondsToSliderTouchDown:(UISlider *)slider {
  113. _dragging = YES;
  114. slider.userInteractionEnabled = NO;
  115. }
  116. #pragma mark - getters
  117. - (UIButton *)playButton {
  118. if (!_playButton) {
  119. _playButton = [UIButton buttonWithType:UIButtonTypeCustom];
  120. [_playButton setImage:YBIBIconManager.sharedManager.videoPlayImage() forState:UIControlStateNormal];
  121. [_playButton setImage:YBIBIconManager.sharedManager.videoPauseImage() forState:UIControlStateSelected];
  122. [_playButton addTarget:self action:@selector(clickPlayButton:) forControlEvents:UIControlEventTouchUpInside];
  123. _playButton.layer.shadowColor = UIColor.darkGrayColor.CGColor;
  124. _playButton.layer.shadowOffset = CGSizeMake(0, 1);
  125. _playButton.layer.shadowOpacity = 1;
  126. _playButton.layer.shadowRadius = 4;
  127. }
  128. return _playButton;
  129. }
  130. - (UILabel *)preTimeLabel {
  131. if (!_preTimeLabel) {
  132. _preTimeLabel = [UILabel new];
  133. _preTimeLabel.attributedText = [self.class timeformatFromSeconds:0];
  134. _preTimeLabel.adjustsFontSizeToFitWidth = YES;
  135. _preTimeLabel.textAlignment = NSTextAlignmentCenter;
  136. _preTimeLabel.textColor = [UIColor.whiteColor colorWithAlphaComponent:0.9];
  137. }
  138. return _preTimeLabel;
  139. }
  140. - (UILabel *)sufTimeLabel {
  141. if (!_sufTimeLabel) {
  142. _sufTimeLabel = [UILabel new];
  143. _sufTimeLabel.attributedText = [self.class timeformatFromSeconds:0];
  144. _sufTimeLabel.adjustsFontSizeToFitWidth = YES;
  145. _sufTimeLabel.textAlignment = NSTextAlignmentCenter;
  146. _sufTimeLabel.textColor = [UIColor.whiteColor colorWithAlphaComponent:0.9];
  147. }
  148. return _sufTimeLabel;
  149. }
  150. - (YBVideoBrowseActionSlider *)slider {
  151. if (!_slider) {
  152. _slider = [YBVideoBrowseActionSlider new];
  153. [_slider addTarget:self action:@selector(respondsToSliderTouchFinished:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchCancel|UIControlEventTouchUpOutside];
  154. [_slider addTarget:self action:@selector(respondsToSliderTouchDown:) forControlEvents:UIControlEventTouchDown];
  155. }
  156. return _slider;
  157. }
  158. - (BOOL)isTouchInside {
  159. return self.slider.isTouchInside;
  160. }
  161. @end