ZXVideoPlayerVolumeView.m 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. //
  2. // ZXVideoPlayerVolumeView.m
  3. // ZXVideoPlayer
  4. //
  5. // Created by Shawn on 16/4/22.
  6. // Copyright © 2016年 Shawn. All rights reserved.
  7. //
  8. #import "ZXVideoPlayerVolumeView.h"
  9. #import "ZXVideoPlayerControlView.h"
  10. static const CGFloat kViewSpacing = 21.0;
  11. static const CGFloat kVolumeIndicatorAutoFadeOutTimeInterval = 1.0;
  12. @interface ZXVideoPlayerVolumeView ()
  13. @property (nonatomic, strong, readwrite) NSMutableArray *blocksArray;
  14. @property (nonatomic, strong, readwrite) UIImageView *volumeImageView;
  15. @end
  16. @implementation ZXVideoPlayerVolumeView
  17. - (void)dealloc
  18. {
  19. [[NSNotificationCenter defaultCenter] removeObserver:self];
  20. }
  21. - (instancetype)initWithFrame:(CGRect)frame
  22. {
  23. self = [super initWithFrame:frame];
  24. if (self) {
  25. self.hidden = YES;
  26. self.layer.cornerRadius = 5;
  27. self.layer.masksToBounds = YES;
  28. self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.3];
  29. [self createVolumeIndicator];
  30. [self configVolumeNotification];
  31. }
  32. return self;
  33. }
  34. - (void)createVolumeIndicator
  35. {
  36. // 音量图标
  37. _volumeImageView = [[UIImageView alloc] initWithFrame:CGRectMake((kVideoVolumeIndicatorViewSide - 50) / 2, kViewSpacing, 50, 50)];
  38. [_volumeImageView setImage:[UIImage imageNamed:@"zx-video-player-volume"]];
  39. [self addSubview:_volumeImageView];
  40. // 音量条
  41. self.blocksArray = [NSMutableArray arrayWithCapacity:16];
  42. UIView *blockBackgroundView = [[UIView alloc] initWithFrame:CGRectMake((kVideoVolumeIndicatorViewSide - 105) / 2, 50 + kViewSpacing * 2, 105, 2.75 + 2)];
  43. blockBackgroundView.backgroundColor = [UIColor colorWithRed:0.25f green:0.22f blue:0.21f alpha:0.65];
  44. [self addSubview:blockBackgroundView];
  45. CGFloat margin = 1;
  46. CGFloat blockW = 5.5;
  47. CGFloat blockH = 2.75;
  48. for (int i = 0; i < 16; i++) {
  49. CGFloat locX = i * (blockW + margin) + margin;
  50. UIImageView *blockView = [[UIImageView alloc] init];
  51. blockView.backgroundColor = [UIColor whiteColor];
  52. blockView.frame = CGRectMake(locX, margin, blockW, blockH);
  53. [blockBackgroundView addSubview:blockView];
  54. [self.blocksArray addObject:blockView];
  55. }
  56. }
  57. - (void)configVolumeNotification
  58. {
  59. // or use [[AVAudioSession sharedInstance] addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:(void *)[AVAudioSession sharedInstance]];
  60. [[NSNotificationCenter defaultCenter] addObserver:self
  61. selector:@selector(volumeChanged:)
  62. name:@"AVSystemController_SystemVolumeDidChangeNotification"
  63. object:nil];
  64. }
  65. - (void)volumeChanged:(NSNotification *)notification
  66. {
  67. float outputVolume = [[[notification userInfo] objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] floatValue];
  68. [self updateVolumeIndicator:outputVolume];
  69. }
  70. - (void)updateVolumeIndicator:(CGFloat)value
  71. {
  72. self.hidden = NO;
  73. // 防止重叠显示
  74. if (self.superview.accessibilityIdentifier) {
  75. ZXVideoPlayerControlView *playerView = (ZXVideoPlayerControlView *)self.superview;
  76. playerView.timeIndicatorView.hidden = YES;
  77. playerView.brightnessIndicatorView.hidden = YES;
  78. } else {
  79. self.superview.accessibilityIdentifier = @"";
  80. }
  81. CGFloat stage = 1 / 16.0;
  82. NSInteger level = value / stage;
  83. for (NSInteger i=0; i<self.blocksArray.count; i++) {
  84. UIImageView *img = self.blocksArray[i];
  85. if (i < level) {
  86. img.hidden = NO;
  87. } else {
  88. img.hidden = YES;
  89. }
  90. }
  91. if (value == 0.0) {
  92. if (!self.volumeImageView.accessibilityIdentifier) {
  93. self.volumeImageView.accessibilityIdentifier = @"";
  94. self.volumeImageView.image = [UIImage imageNamed:@"zx-video-player-volumeMute"];
  95. }
  96. } else {
  97. if (self.volumeImageView.accessibilityIdentifier) {
  98. self.volumeImageView.accessibilityIdentifier = nil;
  99. self.volumeImageView.image = [UIImage imageNamed:@"zx-video-player-volume"];
  100. }
  101. }
  102. [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(animateHide) object:nil];
  103. [self performSelector:@selector(animateHide) withObject:nil afterDelay:kVolumeIndicatorAutoFadeOutTimeInterval];
  104. }
  105. - (void)animateHide
  106. {
  107. [UIView animateWithDuration:.3 animations:^{
  108. self.alpha = 0;
  109. } completion:^(BOOL finished) {
  110. self.hidden = YES;
  111. self.alpha = 1;
  112. self.superview.accessibilityIdentifier = nil;
  113. }];
  114. }
  115. @end