You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
488 lines
18 KiB
Objective-C
488 lines
18 KiB
Objective-C
//
|
|
// SPWeiboControlView.m
|
|
// SuperPlayer
|
|
//
|
|
// Created by annidyfeng on 2018/10/8.
|
|
//
|
|
|
|
#import "SPWeiboControlView.h"
|
|
#import <Masonry/Masonry.h>
|
|
#import "UIView+Fade.h"
|
|
#import "UIView+MMLayout.h"
|
|
#import "StrUtils.h"
|
|
#import "DataReport.h"
|
|
#import "SuperPlayer.h"
|
|
|
|
@interface SPWeiboControlView() <PlayerSliderDelegate>
|
|
@property BOOL isLive;
|
|
@end
|
|
|
|
@implementation SPWeiboControlView
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame {
|
|
self = [super initWithFrame:frame];
|
|
if (self) {
|
|
|
|
[self addSubview:self.startBtn];
|
|
[self addSubview:self.currentTimeLabel];
|
|
[self addSubview:self.totalTimeLabel];
|
|
[self addSubview:self.videoSlider];
|
|
[self addSubview:self.fullScreenBtn];
|
|
[self addSubview:self.resolutionBtn];
|
|
[self addSubview:self.muteBtn];
|
|
[self addSubview:self.moreBtn];
|
|
[self addSubview:self.backBtn];
|
|
|
|
// 添加子控件的约束
|
|
[self makeSubViewsConstraints];
|
|
[self resetControlView];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)makeSubViewsConstraints {
|
|
[self.startBtn mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.center.equalTo(self);
|
|
}];
|
|
[self.currentTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.bottom.equalTo(self).offset(-8);
|
|
make.left.mas_equalTo(@0);
|
|
make.width.mas_equalTo(@60);
|
|
}];
|
|
[self.fullScreenBtn mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.centerY.equalTo(self.currentTimeLabel);
|
|
make.right.equalTo(self).offset(-12);
|
|
}];
|
|
[self.resolutionBtn mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.centerY.equalTo(self.currentTimeLabel);
|
|
make.right.equalTo(self.fullScreenBtn.mas_left);
|
|
make.width.mas_equalTo(0);
|
|
}];
|
|
[self.totalTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.centerY.equalTo(self.currentTimeLabel);
|
|
make.right.equalTo(self.resolutionBtn.mas_left);
|
|
make.width.mas_equalTo(@60);
|
|
}];
|
|
[self.videoSlider mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.centerY.equalTo(self.currentTimeLabel);
|
|
make.left.equalTo(self.currentTimeLabel.mas_right);
|
|
make.right.equalTo(self.totalTimeLabel.mas_left);
|
|
}];
|
|
|
|
[self.backBtn mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.leading.equalTo(self).offset(5);
|
|
make.top.equalTo(self).offset(3);
|
|
make.width.mas_equalTo(@60);
|
|
}];
|
|
|
|
[self.moreBtn mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.trailing.equalTo(self).offset(-10);
|
|
make.centerY.equalTo(self.backBtn);
|
|
make.width.mas_equalTo(@40);
|
|
}];
|
|
[self.muteBtn mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.trailing.equalTo(self.moreBtn.mas_leading).offset(-10);
|
|
make.centerY.equalTo(self.backBtn);
|
|
make.width.mas_equalTo(@40);
|
|
}];
|
|
}
|
|
|
|
|
|
- (UIButton *)startBtn {
|
|
if (!_startBtn) {
|
|
_startBtn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
[_startBtn setImage:SuperPlayerImage(@"wb_play") forState:UIControlStateNormal];
|
|
[_startBtn setImage:SuperPlayerImage(@"wb_pause") forState:UIControlStateSelected];
|
|
[_startBtn addTarget:self action:@selector(playBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
}
|
|
return _startBtn;
|
|
}
|
|
|
|
- (UILabel *)currentTimeLabel {
|
|
if (!_currentTimeLabel) {
|
|
_currentTimeLabel = [[UILabel alloc] init];
|
|
_currentTimeLabel.textColor = [UIColor whiteColor];
|
|
_currentTimeLabel.font = [UIFont systemFontOfSize:12.0f];
|
|
_currentTimeLabel.textAlignment = NSTextAlignmentCenter;
|
|
}
|
|
return _currentTimeLabel;
|
|
}
|
|
|
|
- (UIButton *)resolutionBtn {
|
|
if (!_resolutionBtn) {
|
|
_resolutionBtn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
_resolutionBtn.titleLabel.font = [UIFont systemFontOfSize:12];
|
|
_resolutionBtn.backgroundColor = [UIColor clearColor];
|
|
[_resolutionBtn addTarget:self action:@selector(resolutionBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
}
|
|
return _resolutionBtn;
|
|
}
|
|
|
|
- (PlayerSlider *)videoSlider {
|
|
if (!_videoSlider) {
|
|
_videoSlider = [[PlayerSlider alloc] init];
|
|
[_videoSlider setThumbImage:SuperPlayerImage(@"wb_thumb") forState:UIControlStateNormal];
|
|
_videoSlider.minimumTrackTintColor = RGBA(223, 223, 223, 1);
|
|
// slider开始滑动事件
|
|
[_videoSlider addTarget:self action:@selector(progressSliderTouchBegan:) forControlEvents:UIControlEventTouchDown];
|
|
// slider滑动中事件
|
|
[_videoSlider addTarget:self action:@selector(progressSliderValueChanged:) forControlEvents:UIControlEventValueChanged];
|
|
// slider结束滑动事件
|
|
[_videoSlider addTarget:self action:@selector(progressSliderTouchEnded:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside|UIControlEventTouchCancel];
|
|
_videoSlider.delegate = self;
|
|
}
|
|
return _videoSlider;
|
|
}
|
|
|
|
- (UILabel *)totalTimeLabel {
|
|
if (!_totalTimeLabel) {
|
|
_totalTimeLabel = [[UILabel alloc] init];
|
|
_totalTimeLabel.textColor = [UIColor whiteColor];
|
|
_totalTimeLabel.font = [UIFont systemFontOfSize:12.0f];
|
|
_totalTimeLabel.textAlignment = NSTextAlignmentCenter;
|
|
}
|
|
return _totalTimeLabel;
|
|
}
|
|
|
|
- (UIButton *)fullScreenBtn {
|
|
if (!_fullScreenBtn) {
|
|
_fullScreenBtn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
[_fullScreenBtn setImage:SuperPlayerImage(@"wb_fullscreen") forState:UIControlStateNormal];
|
|
[_fullScreenBtn setImage:SuperPlayerImage(@"wb_fullscreen_back") forState:UIControlStateSelected];
|
|
[_fullScreenBtn addTarget:self action:@selector(fullScreenBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
}
|
|
return _fullScreenBtn;
|
|
}
|
|
|
|
- (UIButton *)backBtn {
|
|
if (!_backBtn) {
|
|
_backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
[_backBtn setImage:SuperPlayerImage(@"wb_back") forState:UIControlStateNormal];
|
|
[_backBtn addTarget:self action:@selector(fullScreenBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
}
|
|
return _backBtn;
|
|
}
|
|
- (UIButton *)moreBtn {
|
|
if (!_moreBtn) {
|
|
_moreBtn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
[_moreBtn setImage:SuperPlayerImage(@"wb_more") forState:UIControlStateNormal];
|
|
[_moreBtn addTarget:self action:@selector(moreBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
}
|
|
return _moreBtn;
|
|
}
|
|
- (UIButton *)muteBtn {
|
|
if (!_muteBtn) {
|
|
_muteBtn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
[_muteBtn setImage:SuperPlayerImage(@"wb_volume_on") forState:UIControlStateNormal];
|
|
[_muteBtn setImage:SuperPlayerImage(@"wb_volume_off") forState:UIControlStateSelected];
|
|
[_muteBtn addTarget:self action:@selector(muteBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
}
|
|
return _muteBtn;
|
|
}
|
|
|
|
- (UIView *)resolutionView {
|
|
if (!_resolutionView) {
|
|
// 添加分辨率按钮和分辨率下拉列表
|
|
|
|
_resolutionView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
_resolutionView.hidden = YES;
|
|
[self addSubview:_resolutionView];
|
|
[_resolutionView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.width.mas_equalTo(330);
|
|
make.height.mas_equalTo(self.mas_height);
|
|
make.trailing.equalTo(self.mas_trailing).offset(0);
|
|
make.top.equalTo(self.mas_top).offset(0);
|
|
}];
|
|
|
|
_resolutionView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
|
|
}
|
|
return _resolutionView;
|
|
}
|
|
|
|
- (SuperPlayerSettingsView *)moreContentView {
|
|
if (!_moreContentView) {
|
|
_moreContentView = [[SuperPlayerSettingsView alloc] initWithFrame:CGRectZero];
|
|
_moreContentView.controlView = self;
|
|
[self addSubview:_moreContentView];
|
|
[_moreContentView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.width.mas_equalTo(330);
|
|
make.height.mas_equalTo(self.mas_height);
|
|
make.trailing.equalTo(self.mas_trailing).offset(0);
|
|
make.top.equalTo(self.mas_top).offset(0);
|
|
}];
|
|
_moreContentView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
|
|
}
|
|
return _moreContentView;
|
|
}
|
|
|
|
- (void)playBtnClick:(UIButton *)sender {
|
|
sender.selected = !sender.selected;
|
|
if (sender.selected) {
|
|
[self.delegate controlViewPlay:self];
|
|
} else {
|
|
[self.delegate controlViewPause:self];
|
|
}
|
|
[self cancelFadeOut];
|
|
}
|
|
|
|
- (void)fullScreenBtnClick:(UIButton *)sender {
|
|
sender.selected = !sender.selected;
|
|
[self.delegate controlViewChangeScreen:self withFullScreen:sender.selected];
|
|
}
|
|
|
|
- (void)progressSliderTouchBegan:(UISlider *)sender {
|
|
self.isDragging = YES;
|
|
self.startBtn.hidden = YES; // 播放按钮挡住了fastView
|
|
[self cancelFadeOut];
|
|
}
|
|
|
|
- (void)progressSliderValueChanged:(UISlider *)sender {
|
|
if (self.maxPlayableRatio > 0 && sender.value * self.maxPlayableRatio) {
|
|
sender.value = self.maxPlayableRatio;
|
|
}
|
|
[self.delegate controlViewPreview:self where:sender.value];
|
|
}
|
|
|
|
- (void)progressSliderTouchEnded:(UISlider *)sender {
|
|
[self.delegate controlViewSeek:self where:sender.value];
|
|
self.isDragging = NO;
|
|
self.startBtn.hidden = NO;
|
|
[self cancelFadeOut];
|
|
}
|
|
|
|
- (void)setProgressTime:(NSInteger)currentTime totalTime:(NSInteger)totalTime
|
|
progressValue:(CGFloat)progress playableValue:(CGFloat)playable;
|
|
{
|
|
if (!self.isDragging) {
|
|
// 更新slider
|
|
self.videoSlider.value = progress;
|
|
// 更新当前播放时间
|
|
self.currentTimeLabel.text = [StrUtils timeFormat:currentTime];
|
|
}
|
|
// 更新总时间
|
|
self.totalTimeLabel.text = [StrUtils timeFormat:totalTime];
|
|
[self.videoSlider.progressView setProgress:playable animated:NO];
|
|
}
|
|
|
|
- (void)muteBtnClick:(UIButton *)sender
|
|
{
|
|
sender.selected = self.playerConfig.mute = !self.playerConfig.mute;
|
|
[self.delegate controlViewConfigUpdate:self withReload:NO];
|
|
[self fadeOut:3];
|
|
}
|
|
|
|
|
|
/** 重置ControlView */
|
|
- (void)resetControlView {
|
|
self.videoSlider.value = 0;
|
|
self.videoSlider.progressView.progress = 0;
|
|
self.currentTimeLabel.text = @"00:00";
|
|
self.totalTimeLabel.text = @"00:00";
|
|
self.moreContentView.hidden = YES;
|
|
}
|
|
|
|
- (void)setHidden:(BOOL)hidden
|
|
{
|
|
[super setHidden:hidden];
|
|
|
|
for (UIView *view in self.subviews) {
|
|
if (view != self.resolutionView && view != self.moreContentView) {
|
|
if (!self.isFullScreen && (view == self.backBtn || view == self.moreBtn || view == self.muteBtn))
|
|
view.hidden = YES;
|
|
else
|
|
view.hidden = NO;
|
|
} else {
|
|
view.hidden = YES;
|
|
}
|
|
}
|
|
self.isShowSecondView = NO;
|
|
self.pointJumpBtn.hidden = YES;
|
|
}
|
|
|
|
/** 播放按钮状态 */
|
|
- (void)setPlayState:(BOOL)isPlay {
|
|
self.startBtn.selected = isPlay;
|
|
}
|
|
|
|
- (void)resolutionBtnClick:(UIButton *)sender {
|
|
for (UIView *view in self.subviews) {
|
|
view.hidden = YES;
|
|
}
|
|
|
|
// 显示分辨率View
|
|
self.resolutionView.hidden = NO;
|
|
[DataReport report:@"change_resolution" param:nil];
|
|
|
|
[self cancelFadeOut];
|
|
self.isShowSecondView = YES;
|
|
}
|
|
|
|
- (void)moreBtnClick:(UIButton *)sender {
|
|
for (UIView *view in self.subviews) {
|
|
view.hidden = YES;
|
|
}
|
|
|
|
self.moreContentView.playerConfig = self.playerConfig;
|
|
self.moreContentView.enableSpeedAndMirrorControl = !self.isLive;
|
|
[self.moreContentView update];
|
|
self.moreContentView.hidden = NO;
|
|
|
|
[self cancelFadeOut];
|
|
self.isShowSecondView = YES;
|
|
}
|
|
|
|
- (void)resetWithResolutionNames:(NSArray<NSString *> *)resolutionNames
|
|
currentResolutionIndex:(NSUInteger)currentResolutionIndex
|
|
isLive:(BOOL)isLive
|
|
isTimeShifting:(BOOL)isTimeShifting
|
|
isPlaying:(BOOL)isPlaying
|
|
{
|
|
[self setPlayState:isPlaying];
|
|
|
|
_resolutionArray = resolutionNames;
|
|
NSAssert(currentResolutionIndex < resolutionNames.count,
|
|
@"Invalid argument when reseeting %@", NSStringFromClass(self.class));
|
|
if (resolutionNames.count > 0) {
|
|
[self.resolutionBtn setTitle:resolutionNames[currentResolutionIndex]
|
|
forState:UIControlStateNormal];
|
|
}
|
|
for (UIView *subview in self.resolutionView.subviews)
|
|
[subview removeFromSuperview];
|
|
|
|
UILabel *lable = [UILabel new];
|
|
lable.text = @"清晰度";
|
|
lable.textAlignment = NSTextAlignmentCenter;
|
|
lable.textColor = [UIColor whiteColor];
|
|
[self.resolutionView addSubview:lable];
|
|
[lable mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.width.equalTo(self.resolutionView.mas_width);
|
|
make.height.mas_equalTo(30);
|
|
make.left.equalTo(self.resolutionView.mas_left);
|
|
make.top.equalTo(self.resolutionView.mas_top).mas_offset(20);
|
|
}];
|
|
|
|
// 分辨率View上边的Btn
|
|
for (NSInteger i = 0 ; i < _resolutionArray.count; i++) {
|
|
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
[btn setTitle:_resolutionArray[i] forState:UIControlStateNormal];
|
|
[btn setTitleColor:RGBA(252, 89, 81, 1) forState:UIControlStateSelected];
|
|
[self.resolutionView addSubview:btn];
|
|
[btn addTarget:self action:@selector(changeResolution:) forControlEvents:UIControlEventTouchUpInside];
|
|
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.width.equalTo(self.resolutionView.mas_width);
|
|
make.height.mas_equalTo(45);
|
|
make.left.equalTo(self.resolutionView.mas_left);
|
|
make.centerY.equalTo(self.resolutionView.mas_centerY).offset((i-self.resolutionArray.count/2.0+0.5)*45);
|
|
}];
|
|
|
|
if (i == currentResolutionIndex) {
|
|
btn.selected = YES;
|
|
btn.backgroundColor = RGBA(34, 30, 24, 1);
|
|
self.resoultionCurrentBtn = btn;
|
|
}
|
|
}
|
|
if (self.isLive != isLive) {
|
|
self.isLive = isLive;
|
|
[self setNeedsLayout];
|
|
}
|
|
// 时移的时候不能切清晰度
|
|
self.resolutionBtn.userInteractionEnabled = !isTimeShifting;
|
|
}
|
|
|
|
/**
|
|
* 点击切换分别率按钮
|
|
*/
|
|
- (void)changeResolution:(UIButton *)sender {
|
|
self.resoultionCurrentBtn.selected = NO;
|
|
self.resoultionCurrentBtn.backgroundColor = [UIColor clearColor];
|
|
self.resoultionCurrentBtn = sender;
|
|
self.resoultionCurrentBtn.selected = YES;
|
|
self.resoultionCurrentBtn.backgroundColor = RGBA(34, 30, 24, 1);
|
|
|
|
// topImageView上的按钮的文字
|
|
[self.resolutionBtn setTitle:sender.titleLabel.text forState:UIControlStateNormal];
|
|
[self.delegate controlViewSwitch:self withDefinition:sender.titleLabel.text];
|
|
}
|
|
|
|
- (void)setOrientationLandscapeConstraint {
|
|
self.fullScreen = YES;
|
|
self.fullScreenBtn.selected = YES;
|
|
self.moreBtn.hidden = NO;
|
|
self.backBtn.hidden = NO;
|
|
self.muteBtn.hidden = NO;
|
|
[self.resolutionBtn mas_updateConstraints:^(MASConstraintMaker *make) {
|
|
make.width.mas_equalTo(@60);
|
|
}];
|
|
|
|
self.videoSlider.hiddenPoints = NO;
|
|
}
|
|
|
|
- (void)setOrientationPortraitConstraint {
|
|
self.fullScreen = NO;
|
|
self.fullScreenBtn.selected = NO;
|
|
self.moreBtn.hidden = YES;
|
|
self.backBtn.hidden = YES;
|
|
self.muteBtn.hidden = YES;
|
|
[self.resolutionBtn mas_updateConstraints:^(MASConstraintMaker *make) {
|
|
make.width.mas_equalTo(@0);
|
|
}];
|
|
|
|
|
|
self.videoSlider.hiddenPoints = YES;
|
|
self.pointJumpBtn.hidden = YES;
|
|
}
|
|
|
|
- (void)setPointArray:(NSArray *)pointArray
|
|
{
|
|
[super setPointArray:pointArray];
|
|
|
|
for (PlayerPoint *holder in self.videoSlider.pointArray) {
|
|
[holder.holder removeFromSuperview];
|
|
}
|
|
[self.videoSlider.pointArray removeAllObjects];
|
|
|
|
for (SPVideoFrameDescription *p in pointArray) {
|
|
PlayerPoint *point = [self.videoSlider addPoint:p.where];
|
|
point.content = p.text;
|
|
point.timeOffset = p.time;
|
|
}
|
|
}
|
|
|
|
- (UIButton *)pointJumpBtn {
|
|
if (!_pointJumpBtn) {
|
|
_pointJumpBtn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
UIImage *image = SuperPlayerImage(@"copywright_bg");
|
|
UIImage *resizableImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(0, 20, 0, 20) resizingMode:UIImageResizingModeStretch];
|
|
[_pointJumpBtn setBackgroundImage:resizableImage forState:UIControlStateNormal];
|
|
_pointJumpBtn.titleLabel.font = [UIFont systemFontOfSize:14];
|
|
[_pointJumpBtn addTarget:self action:@selector(pointJumpClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
[self addSubview:_pointJumpBtn];
|
|
}
|
|
return _pointJumpBtn;
|
|
}
|
|
|
|
- (void)pointJumpClick:(UIButton *)sender {
|
|
PlayerPoint *point = [self.videoSlider.pointArray objectAtIndex:self.pointJumpBtn.tag];
|
|
[self.delegate controlViewSeek:self where:point.where];
|
|
[self fadeOut:0.1];
|
|
}
|
|
|
|
- (void)onPlayerPointSelected:(PlayerPoint *)point {
|
|
NSString *text = [NSString stringWithFormat:@" %@ %@ ", [StrUtils timeFormat:point.timeOffset],
|
|
point.content];
|
|
|
|
[self.pointJumpBtn setTitle:text forState:UIControlStateNormal];
|
|
[self.pointJumpBtn sizeToFit];
|
|
CGFloat x = self.videoSlider.mm_x + self.videoSlider.mm_w * point.where - self.pointJumpBtn.mm_w/2;
|
|
if (x < 0)
|
|
x = 0;
|
|
if (x + self.pointJumpBtn.mm_w/2 > ScreenWidth)
|
|
x = ScreenWidth - self.pointJumpBtn.mm_w/2;
|
|
self.pointJumpBtn.tag = [self.videoSlider.pointArray indexOfObject:point];
|
|
self.pointJumpBtn.m_left(x).m_bottom(60);
|
|
self.pointJumpBtn.hidden = NO;
|
|
|
|
[DataReport report:@"player_point" param:nil];
|
|
}
|
|
@end
|