From 1ac55a583620e2bd2c64855f143ef58018c8e5c8 Mon Sep 17 00:00:00 2001 From: chy89310 Date: Thu, 12 Oct 2017 11:52:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B0=81=E9=9D=A2=E5=9C=96?= =?UTF-8?q?=E7=89=87=EF=BC=8C=E6=96=B0=E5=A2=9E=E6=97=8B=E8=BD=89=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=EF=BC=8C=E6=94=B9=E5=96=84=20Slider=20=E5=9C=96?= =?UTF-8?q?=E7=89=87=E6=B8=85=E6=99=B0=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增了coverImageView來顯示視頻/音頻封面圖片。當視頻開始播放時,圖片會隱藏,音頻文件播放則默認保留封面圖片。 2. 新增autoRoate來控制是否響應屏幕旋轉事件。 3. 修正了Slider的圖片不清晰的問題。 --- CLPlayer/CLPlayerMaskView.h | 2 + CLPlayer/CLPlayerMaskView.m | 14 +++++ CLPlayer/CLPlayerView.h | 4 ++ CLPlayer/CLPlayerView.m | 55 ++++++++++++------ CLPlayer/CLSlider.m | 10 +++- CLPlayer/Resource/CLPlayer.bundle/CLRound.png | Bin 1226 -> 15625 bytes README.md | 4 ++ 7 files changed, 69 insertions(+), 20 deletions(-) diff --git a/CLPlayer/CLPlayerMaskView.h b/CLPlayer/CLPlayerMaskView.h index b5a8121..c87e042 100755 --- a/CLPlayer/CLPlayerMaskView.h +++ b/CLPlayer/CLPlayerMaskView.h @@ -49,6 +49,8 @@ @property (nonatomic,strong) CLSlider *slider; /**加载失败按钮*/ @property (nonatomic,strong) UIButton *failButton; +/**封面圖片*/ +@property (nonatomic,strong) UIImageView *coverImageView; /**代理人*/ @property (nonatomic,weak) id delegate; /**进度条背景颜色*/ diff --git a/CLPlayer/CLPlayerMaskView.m b/CLPlayer/CLPlayerMaskView.m index 4b37335..84d13a4 100755 --- a/CLPlayer/CLPlayerMaskView.m +++ b/CLPlayer/CLPlayerMaskView.m @@ -28,6 +28,7 @@ -(instancetype)initWithFrame:(CGRect)frame{ return self; } - (void)initViews{ + [self addSubview:self.coverImageView]; [self addSubview:self.topToolBar]; [self addSubview:self.bottomToolBar]; [self addSubview:self.activity]; @@ -55,6 +56,10 @@ - (void)makeConstraints{ make.left.right.bottom.equalTo(self); make.height.mas_equalTo(ToolBarHeight); }]; + //封面圖片 + [self.coverImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.left.right.bottom.equalTo(self); + }]; //转子 [self.activity mas_makeConstraints:^(MASConstraintMaker *make) { make.center.equalTo(self); @@ -235,6 +240,15 @@ - (UIButton *) failButton } return _failButton; } +//封面圖片 +- (UIImageView *)coverImageView { + if (_coverImageView == nil){ + _coverImageView = [[UIImageView alloc] init]; + _coverImageView.backgroundColor = [UIColor blackColor]; + _coverImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _coverImageView; +} #pragma mark - 按钮点击事件 //返回按钮 - (void)backButtonAction:(UIButton *)button{ diff --git a/CLPlayer/CLPlayerView.h b/CLPlayer/CLPlayerView.h index df508d0..4b4429f 100755 --- a/CLPlayer/CLPlayerView.h +++ b/CLPlayer/CLPlayerView.h @@ -24,6 +24,8 @@ typedef void(^BeyondBlock)(); @property (nonatomic, assign) BOOL repeatPlay; /**是否支持横屏,默认NO*/ @property (nonatomic, assign) BOOL isLandscape; +/**自動旋轉,默認YES*/ +@property (nonatomic, assign) BOOL autoRotate; /**全屏是否隐藏状态栏,默认YES*/ @property (nonatomic, assign) BOOL fullStatusBarHidden; /** 静音(默认为NO)*/ @@ -38,6 +40,8 @@ typedef void(^BeyondBlock)(); @property (nonatomic, assign) VideoFillMode fillMode; /**视频url*/ @property (nonatomic, strong) NSURL *url; +/**封面圖片*/ +@property (nonatomic, strong) UIImageView *coverImageView; /**进度条背景颜色*/ @property (nonatomic, strong) UIColor *progressBackgroundColor; /**缓冲条缓冲进度颜色*/ diff --git a/CLPlayer/CLPlayerView.m b/CLPlayer/CLPlayerView.m index 0d28866..aa2ab6f 100755 --- a/CLPlayer/CLPlayerView.m +++ b/CLPlayer/CLPlayerView.m @@ -94,6 +94,8 @@ - (CLPlayerMaskView *) maskView{ selector:@selector(disappear) userInfo:nil repeats:NO]; + //封面圖片 + _coverImageView = _maskView.coverImageView; } return _maskView; } @@ -145,6 +147,10 @@ -(void)setStrokeColor:(UIColor *)strokeColor{ -(void)setIsLandscape:(BOOL)isLandscape{ _isLandscape = isLandscape; } +#pragma mark - 是否自動旋轉 +-(void)setAutoRotate:(BOOL)autoRotate{ + _autoRotate = autoRotate; +} #pragma mark - 全屏状态栏是否隐藏 -(void)setFullStatusBarHidden:(BOOL)fullStatusBarHidden{ _fullStatusBarHidden = fullStatusBarHidden; @@ -265,6 +271,7 @@ - (instancetype)initWithFrame:(CGRect)frame{ _mute = NO; //查询控制器是否支持全屏 _isLandscape = NO; + _autoRotate = YES; _isPlay = NO; _statusBarHiddenState = self.statusBar.isHidden; _toolBarDisappearTime = 10; @@ -395,6 +402,14 @@ - (void)timeStack{ NSInteger durMin = (NSInteger)_playerItem.duration.value / _playerItem.duration.timescale / 60;//总分钟 NSInteger durSec = (NSInteger)_playerItem.duration.value / _playerItem.duration.timescale % 60;//总秒 self.maskView.totalTimeLabel.text = [NSString stringWithFormat:@"%02ld:%02ld", (long)durMin, (long)durSec]; + AVURLAsset *urlAsset = (AVURLAsset *)_playerItem.asset; + NSArray *audioExt = @[@"mp3", @"wav", @"m4a", @"wma"]; + if (urlAsset != nil && [audioExt containsObject:[urlAsset.URL.pathExtension lowercaseString]] ) { + self.maskView.coverImageView.hidden = false; + } else { + self.maskView.coverImageView.hidden = true; + } + } } #pragma mark - 播放暂停按钮方法 @@ -556,29 +571,31 @@ - (void)destroyTimer{ } #pragma mark - 屏幕旋转通知 - (void)orientChange:(NSNotification *)notification{ - UIDeviceOrientation orientation = [UIDevice currentDevice].orientation; - if (orientation == UIDeviceOrientationLandscapeLeft){ - if (_isFullScreen == NO){ - if (_isLandscape) { - //播放器所在控制器页面支持旋转情况下,和正常情况是相反的 - [self fullScreenWithDirection:UIInterfaceOrientationLandscapeRight]; - }else{ - [self fullScreenWithDirection:UIInterfaceOrientationLandscapeLeft]; + if (_autoRotate) { + UIDeviceOrientation orientation = [UIDevice currentDevice].orientation; + if (orientation == UIDeviceOrientationLandscapeLeft){ + if (_isFullScreen == NO){ + if (_isLandscape) { + //播放器所在控制器页面支持旋转情况下,和正常情况是相反的 + [self fullScreenWithDirection:UIInterfaceOrientationLandscapeRight]; + }else{ + [self fullScreenWithDirection:UIInterfaceOrientationLandscapeLeft]; + } } } - } - else if (orientation == UIDeviceOrientationLandscapeRight){ - if (_isFullScreen == NO){ - if (_isLandscape) { - [self fullScreenWithDirection:UIInterfaceOrientationLandscapeLeft]; - }else{ - [self fullScreenWithDirection:UIInterfaceOrientationLandscapeRight]; + else if (orientation == UIDeviceOrientationLandscapeRight){ + if (_isFullScreen == NO){ + if (_isLandscape) { + [self fullScreenWithDirection:UIInterfaceOrientationLandscapeLeft]; + }else{ + [self fullScreenWithDirection:UIInterfaceOrientationLandscapeRight]; + } } } - } - else if (orientation == UIDeviceOrientationPortrait){ - if (_isFullScreen == YES){ - [self originalscreen]; + else if (orientation == UIDeviceOrientationPortrait){ + if (_isFullScreen == YES){ + [self originalscreen]; + } } } } diff --git a/CLPlayer/CLSlider.m b/CLPlayer/CLSlider.m index 95ed3de..52ecee4 100755 --- a/CLPlayer/CLSlider.m +++ b/CLPlayer/CLSlider.m @@ -30,7 +30,7 @@ -(instancetype)initWithFrame:(CGRect)frame{ return self; } - (void)setup { - UIImage *thumbImage = [self getPictureWithName:@"CLRound"]; + UIImage *thumbImage = [self imageWithImage:[self getPictureWithName:@"CLRound"] scaledToSize:CGSizeMake(25, 25)]; [self setThumbImage:thumbImage forState:UIControlStateHighlighted]; [self setThumbImage:thumbImage forState:UIControlStateNormal]; } @@ -88,5 +88,13 @@ - (UIImage *)getPictureWithName:(NSString *)name{ return [UIImage imageWithContentsOfFile:path]; } +- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { + UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); + [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; + UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return newImage; +} + @end diff --git a/CLPlayer/Resource/CLPlayer.bundle/CLRound.png b/CLPlayer/Resource/CLPlayer.bundle/CLRound.png index e617f3d8dbc79d7c3a8368a84363ecd149a14073..b7c7a26455ddc3f6159f159941f4b037756a40c1 100755 GIT binary patch literal 15625 zcmeI3dsGv57RM*yp+rCyte{p5(c+6RNgy#9LqrJ3!zf6sq~e+(8DKPILNb^@ZH-U` zt#9k9)mqfGx;+%%4}5F2K5Nl))`PnBq-W~`d{L@aR+jGM0sKJdw0rvJg%g2pzyl2Nw@wm7?jyFTB z5~xgxSOK0=YR0lkr>J$Mb9FL3Z-Rm&w;@!5LX1SYwnBr^g4p7CuDl3kJKZpk>ynUj z<9HLD1-aR(3~nM}#<=2W3126Sk#fh$qJ?6aR1_P<6$ykASRjLiv3!9L5y%jMkn8#I z6dcNuoAr6fG-a}<9Q9WmuYe>?2n<`T)@W-?G-1w%g)*587KmVxh)*f_mJ%b0+W1Dx zaCegSJW9->Gvg)_CyZQYUNn~|CgXTKXQ7UdXI_P-jzUI@haE)`wxK3i7%hN%3exL3 zVob$mgX`AxIv6uxg_x1FP;tT@<4gqvNmvSqUP^Wh_ga`*6P2o?c8~X4SlDA}3z;;J zLf}E#W28l0V#45Qn1v`d>#(GG)KrG|Gs*{JnVciN-aBT)dkJ%nxWinn;9em) zHCH6jjG-i^q`nHOgU0cN0=`hB777rN7!gUv3Z#fYAcwmtJ6GA2Lq+KEyplI^2oa$W z5sSbafUa0TzfW~?Ef3!poY2GN6f?G(!Tmp11)xWOOEDI~@>TMq| z;I322gqkgwbI--`+BaRtG1hTPIb&RV7eRH-^Gsnu=V5v|+{M>lvohKnewGTBJ)U|9vIsAsNv$9*C?Q8=>u}eQrB%nU9 z(D~~L1&6zbYJNKu9PS?489CjElM0ciS~oWkO5gNyycuOjAKn={pc)FNdI( zU#V*Y1QiP)s8I_+$OZ@sCDzP7pA13XV^Wn9)wbJ@H_c2}XAZcqVE?x>$BjJ}k(Y3@ zJa^Edq!&TtJEI;&jCwfsIo>#Az^l6Sfl77%6XaT6`tyhv5$meRsQt~?8h)q_*@=Ji z#r~JF_w$Xm!nJRQc_lC0 zU34;MOeDL}{;qcCsISgQ1<-T$FwRDMns(Tp8EtopwEnh$<7m^boka@i%_9qWLt%@@a8 zD+5>iNqrxGVcR=I8oth+=jeNW<=4TrZA59bJ{df$P9T6N`<+C$pF z`MyVYG;TVaa@Oj2?}+{K2*)nDq|Sfy8n4y6Hn5+1{dZuhE$X{rimHUP_xSIow4T_d z4%aTf*l-c8$ux0uE_~!yPi)MOn(~-<-PIqeGjCqcEq~bhv3+2_z}?IBb&-$o>%oy#skJYrj@(?o z`H+^QVzK64A3Ez<2=Up7o7qj8AqxkG)R(cJthh0ANW`(b(9CrWPf90wSFe2`uFtKT zmHT*_$uhSPI~hE$!f=HP$#t&BP?WZix-cA4l@v~{xmQ2dv% zX{?`D_+{5|1P^OAE|5mXA8V^--5)c02UVE)7uBot=9+K3a zcy)O1j>>4!;1QDpD`IlWF89y3T)Wk`sp(i$ep*V)pzD{eRM@#w?(!qpPw!v0{0#|t z?6u_+d-GJyw(?e@V%tjl;iT%;nXT7~wgo$uJa{`Q;a;D6->-k{JKMN^cKC+u@Qs@A zPnRAo;G9Amyp0#`ho>!G|FAwMk99BCv~P%Q@z-ZAO>RBBegCbDiU~FQ(pwk#hMXRs zI)_tgLqf}bYWdb27_{uW8CMow;m4(c7EFfDB#MN4~iDw+vI#%IW=jD JvL-=W_CHd}n`;07 delta 904 zcmV;319$w1dddl1iBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqV*mgE1ZP1_ zK>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhP zJdq(60RfRY9FdDG4p>c4AVY6*Wgs;!G%hfa^?sA40wj~Z2RM^P2`+z3!Y5e(00P@d zL_t(Y4Yk(EYE(fO1>o)^4sk*P3GM>YYd1m=-1rDSj*pPX$s@QCB#@132?Sh4Xv8T_ zu{~dP|IMY+!65j<>AH35uXAd;w|YG4Vm6zN6Ek$4*Hdf~V6-$TgOo=5I52v`ZG6gLN@GpX!K_A~j><6!c-pJB!1g{BMCgm`g5io-?sJ+m+ z_J*-`dGd#YOtpXM?hyAT_e&)iXNd?gFe-dO9j{%U{N4n&#l+DyvSEToZ@N7Y_H9)Z zFHgRH74+zCGLfiKq0uHfNjCW^Ay2-3!@<&BXVOno1Ku%oimnp!>iG8qJ}2gDT2m`Q zv-8n&OvP{+=FI%JczN<``Lr^ld&XoM3>#Bz2{`Y8Q&WGNtYe`LgLZlHhqFkvaZ@I~ zoc)U=*{L}W_JcAqvI1kgc6su96S}8fMk9C@_+0e+V-WxH#xtY)Ie2MQE}7jFK4|sz zMOQE~VgqnYog$lDdte5uR^obicgqO@U&@mdmaUErJcUFeS5 zeG)<(1@(NT?K_%2&dlr0S6{UU4Cv5nS8=;fvRpA8JIaT_*T7T>^dg}y<>cz8zngJ+ z1-Cs3xxD;i_