diff --git a/README.md b/README.md index 2aec01b13..928a407e6 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,139 @@ pod 'SJVideoPlayer' ``` -# Example - - +### play +```Objective-C + Player.asset = [[SJVideoPlayerAssetCarrier alloc] initWithAssetURL:[NSURL URLWithString:@"http://....."] beginTime:10]; +``` +___ + +### play on the table or collection view +```Objective-C + Player.asset = + [[SJVideoPlayerAssetCarrier alloc] initWithAssetURL:[NSURL URLWithString:cell.model.playURLStr] + scrollView:self.tableView + indexPath:[self.tableView indexPathForCell:cell] + superviewTag:playerParentView.tag]; +``` +___ + +### play on the nested table or collection view +```Objective-C + Player.asset = + [[SJVideoPlayerAssetCarrier alloc] initWithAssetURL:playURL + indexPath:indexPath + superviewTag:playerParentView.tag + scrollViewIndexPath:embeddedScrollViewIndexPath + scrollViewTag:embeddedScrollView.tag + rootScrollView:self.tableView]; +``` +___ + +### play method +```Objective-C +@property (nonatomic, strong, readwrite, nullable) SJVideoPlayerAssetCarrier *asset; + +- (void)playWithURL:(NSURL *)playURL jumpedToTime:(NSTimeInterval)time; + +@property (nonatomic, strong, readwrite, nullable) NSURL *assetURL; + +- (void)playWithURL:(NSURL *)playURL; + +- (UIImage *__nullable)screenshot; + +- (NSTimeInterval)currentTime; + +- (NSTimeInterval)totalTime; + +``` +___ + +### prompt method +```Objective-C + +@property (nonatomic, strong, readonly) SJPrompt *prompt; + +- (void)showTitle:(NSString *)title; + +- (void)showTitle:(NSString *)title duration:(NSTimeInterval)duration; + +- (void)hiddenTitle; +``` +___ + +### control method +```Objective-C + +@property (nonatomic, assign, readonly) BOOL userPaused; + +@property (nonatomic, assign, readwrite, getter=isAutoplay) BOOL autoplay; + +- (BOOL)play; + +- (BOOL)pause; + +- (void)stop; + +- (void)stopAndFadeOut; + +@property (nonatomic, copy, readwrite, nullable) void(^playDidToEnd)(SJVideoPlayer *player); + +- (void)jumpedToTime:(NSTimeInterval)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler; + +- (void)seekToTime:(CMTime)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler; + +``` +___ + +### screen rotation method +```Objective-C + +@property (nonatomic, assign, readwrite) BOOL disableRotation; + +@property (nonatomic, copy, readwrite, nullable) void(^willRotateScreen)(SJVideoPlayer *player, BOOL isFullScreen); + +@property (nonatomic, copy, readwrite, nullable) void(^rotatedScreen)(SJVideoPlayer *player, BOOL isFullScreen); + +@property (nonatomic, assign, readonly) BOOL isFullScreen; + +``` +___ + +### setting method +```Objective-C + +- (void)setPlaceholder:(UIImage *)placeholder; + +@property (nonatomic, copy, readwrite) void(^clickedBackEvent)(SJVideoPlayer *player); + +@property (class, nonatomic, copy, readonly) void(^update)(void(^block)(SJVideoPlayerSettings *commonSettings)); + ++ (void)resetSetting; // 重置配置, 恢复默认设置 + +@property (nonatomic, strong, readwrite, nullable) NSArray *moreSettings; + +@property (nonatomic, assign, readwrite) BOOL generatePreviewImages; + +``` +___ + +### rate method +```Objective-C + +@property (nonatomic, assign, readwrite) float rate; /// 0.5 .. 1.5 +- (void)resetRate; + +@property (nonatomic, copy, readwrite, nullable) void(^rateChanged)(SJVideoPlayer *player); + +@property (nonatomic, copy, readwrite, nullable) void(^internallyChangedRate)(SJVideoPlayer *player, float rate); + +``` +___ + +# example + + +___ # 抽离出的组件 ### [加载视图](https://github.com/changsanjiang/SJLoadingView) @@ -34,9 +164,4 @@ pod 'SJVideoPlayer' ### 其他组件陆续抽离中... -### Use -```Objective-C - Player.asset = [[SJVideoPlayerAssetCarrier alloc] initWithAssetURL:[NSURL URLWithString:@"http://....."] beginTime:10]; -``` - - +___ diff --git a/SJVideoPlayer.podspec b/SJVideoPlayer.podspec index b5e3b9cad..a381ef89e 100644 --- a/SJVideoPlayer.podspec +++ b/SJVideoPlayer.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = 'SJVideoPlayer' -s.version = '1.4.3' +s.version = '1.4.4' s.summary = 'video player.' s.description = 'https://github.com/changsanjiang/SJVideoPlayer/blob/master/README.md' s.homepage = 'https://github.com/changsanjiang/SJVideoPlayer' diff --git a/SJVideoPlayer/Player/SJVideoPlayer.h b/SJVideoPlayer/Player/SJVideoPlayer.h index 9cedf9b4a..2d6437142 100644 --- a/SJVideoPlayer/Player/SJVideoPlayer.h +++ b/SJVideoPlayer/Player/SJVideoPlayer.h @@ -5,7 +5,9 @@ // Created by BlueDancer on 2017/11/29. // Copyright © 2017年 SanJiang. All rights reserved. // -// Address: https://github.com/changsanjiang/SJVideoPlayer +// https://github.com/changsanjiang/SJVideoPlayer +// changsanjiang@gmail.com +// #import #import @@ -39,8 +41,46 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nonatomic, strong, readonly, nullable) NSError *error; +/*! + * play status + * + * 播放状态 + **/ @property (nonatomic, assign, readonly) SJVideoPlayerPlayState state; +@end + + +#pragma mark - 播放 + +@interface SJVideoPlayer (Play) + +/*! + * Create It By Video URL. + * + * 创建一个播放资源. + * 如果在 `tableView` 或者 `collectionView` 中播放, 使用它来初始化播放资源. + * 它也可以直接从某个时刻开始播放. 单位是秒. + **/ +@property (nonatomic, strong, readwrite, nullable) SJVideoPlayerAssetCarrier *asset; + +/*! + * unit: sec. + * + * 单位是秒. + **/ +- (void)playWithURL:(NSURL *)playURL jumpedToTime:(NSTimeInterval)time; + +/*! + * Video URL + */ +@property (nonatomic, strong, readwrite, nullable) NSURL *assetURL; + +/*! + * Video URL + **/ +- (void)playWithURL:(NSURL *)playURL; + /*! * 获取当前截图 **/ @@ -53,176 +93,191 @@ NS_ASSUME_NONNULL_BEGIN */ - (NSTimeInterval)currentTime; +/*! + * unit sec. + * + * 当前视频的全部播放时间. + **/ - (NSTimeInterval)totalTime; @end -#pragma mark - +#pragma mark - 控制 -@interface SJVideoPlayer (Setting) +@interface SJVideoPlayer (Control) /*! - * Configure the player, Note: This `block` is run on the child thread. + * The user clicked paused. * - * 配置播放器, 注意: 这个`block`在子线程运行. + * 这个状态用来判断是我们调用的pause, 还是用户主动pause的. + * 用户点击暂停或者双击暂停时, 会设置它. 当我们(开发者)调用`pause`, 不会设置它. + * 当返回播放界面时, 如果是我们自己调用`pause`, 则可以使用`play`, 使其继续播放. **/ -@property (class, nonatomic, copy, readonly) void(^update)(void(^block)(SJVideoPlayerSettings *commonSettings)); -+ (void)resetSetting; // 重置配置 +@property (nonatomic, assign, readonly) BOOL userPaused; /*! - * clicked back btn exe block. + * default is YES. * - * 点击返回按钮的回调. + * 是否自动播放, 默认是 YES. */ -@property (nonatomic, copy, readwrite) void(^clickedBackEvent)(SJVideoPlayer *player); +@property (nonatomic, assign, readwrite, getter=isAutoplay) BOOL autoplay; -- (void)playWithURL:(NSURL *)playURL; +- (BOOL)play; -/*! - * unit: sec. - * - * 单位是秒. - **/ -- (void)playWithURL:(NSURL *)playURL jumpedToTime:(NSTimeInterval)time; +- (BOOL)pause; -/*! - * Video URL - */ -@property (nonatomic, strong, readwrite, nullable) NSURL *assetURL; +- (void)stop; + +/// 停止播放并淡出 +- (void)stopAndFadeOut; /*! - * Create It By Video URL. - * - * 创建一个播放资源. - * 如果在`tableView或者collectionView`中播放, 使用它来初始化播放资源. - * 它也可以直接从某个时刻开始播放. 单位是秒. + * 播放完毕的时候调用. **/ -@property (nonatomic, strong, readwrite, nullable) SJVideoPlayerAssetCarrier *asset; +@property (nonatomic, copy, readwrite, nullable) void(^playDidToEnd)(SJVideoPlayer *player); /*! - * clicked More button to display items. + * 停止旋转. * - * 点击更多按钮, 弹出来的选项. + * 相当于 `player.disableRotation = YES;` . **/ -@property (nonatomic, strong, readwrite, nullable) NSArray *moreSettings; +- (void)stopRotation; /*! - * Call when the rate changes. + * 开启旋转. * - * 调速时调用. + * 相当于 `player.disableRotation = NO;` . **/ -@property (nonatomic, copy, readwrite, nullable) void(^rateChanged)(SJVideoPlayer *player); +- (void)enableRotation; /*! - * Call when the rate changes. - * - * 调速时调用. - * 当滑动内部的`rate slider`时候调用. 外部改变`rate`不会调用. + * 跳转到指定位置, 不建议使用 + * 如果要跳转到某个位置, 可以在初始化时, 设置`SJVideoPlayerAssetCarrier`的`beginTime`. **/ -@property (nonatomic, copy, readwrite, nullable) void(^internallyChangedRate)(SJVideoPlayer *player, float rate); -@property (nonatomic, assign, readwrite) float rate; /// 0.5 .. 1.5 +- (void)jumpedToTime:(NSTimeInterval)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler; + +- (void)seekToTime:(CMTime)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler; + +@end + + +#pragma mark - 配置 + +@interface SJVideoPlayer (Setting) /*! * loading show this. * - * 占位图. 初始化播放loading的时候显示. + * `占位图`. 初始化播放loading的时候显示. **/ - (void)setPlaceholder:(UIImage *)placeholder; /*! - * default is YES. - * - * 是否自动播放, 默认是 YES. - */ -@property (nonatomic, assign, readwrite, getter=isAutoplay) BOOL autoplay; - -/*! - * default is YES. + * clicked back btn exe block. * - * 是否自动生成预览视图, 默认是 YES. 如果为NO, 则预览按钮将不会显示. + * 点击`返回`按钮的回调. */ -@property (nonatomic, assign, readwrite) BOOL generatePreviewImages; +@property (nonatomic, copy, readwrite) void(^clickedBackEvent)(SJVideoPlayer *player); /*! - * Whether screen rotation is disabled. default is NO. + * Configure the player, Note: This `block` is run on the child thread. * - * 是否禁用屏幕旋转, 默认是NO. - */ -@property (nonatomic, assign, readwrite) BOOL disableRotation; - -/*! - * Call when the screen is rotated. + * 配置播放器, 注意: 这个`block`在子线程运行. * - * 屏幕旋转的时候调用. + * SJVideoPlayer.update(^(SJVideoPlayerSettings * _Nonnull commonSettings) { + ..... setting player ...... + commonSettings.placeholder = [UIImage imageNamed:@"placeholder"]; + commonSettings.more_trackColor = [UIColor whiteColor]; + commonSettings.progress_trackColor = [UIColor colorWithWhite:0.4 alpha:1]; + commonSettings.progress_bufferColor = [UIColor whiteColor]; + }); **/ -@property (nonatomic, copy, readwrite, nullable) void(^rotatedScreen)(SJVideoPlayer *player, BOOL isFullScreen); -@property (nonatomic, assign, readonly) BOOL isFullScreen; // 是否全屏 +@property (class, nonatomic, copy, readonly) void(^update)(void(^block)(SJVideoPlayerSettings *commonSettings)); ++ (void)resetSetting; // 重置配置, 恢复默认设置 /*! - * 播放完毕的时候调用. + * clicked More button to display items. + * + * 点击`更多(右上角的三个点)`按钮, 弹出来的选项. **/ -@property (nonatomic, copy, readwrite, nullable) void(^playDidToEnd)(SJVideoPlayer *player); +@property (nonatomic, strong, readwrite, nullable) NSArray *moreSettings; /*! - * Call when the control view is hidden or displayed. + * default is YES. * - * 控制视图隐藏或显示的时候调用. - **/ -@property (nonatomic, copy, readwrite, nullable) void(^controlViewDisplayStatus)(SJVideoPlayer *player, BOOL displayed); -@property (nonatomic, assign, readonly) BOOL controlViewDisplayed; // 控制视图是否显示 + * 是否自动生成预览视图, 默认是 YES. 如果为NO, 则预览按钮将不会显示. + */ +@property (nonatomic, assign, readwrite) BOOL generatePreviewImages; @end -#pragma mark - +#pragma mark - 调速 -@interface SJVideoPlayer (Control) +@interface SJVideoPlayer (Rate) + +@property (nonatomic, assign, readwrite) float rate; /// 0.5 .. 1.5 +- (void)resetRate; /*! - * The user clicked paused. + * Call when the rate changes. * - * 用户点击暂停或者双击暂停的时候, 会设置它. 当我们调用`pause`, 不会设置它. - * 可以根据这个状态, 来判断是我们调用的pause, 还是用户主动pause的. - * 当返回播放界面时, 如果是我们自己调用`pause`, 则可以使用`play`, 使其继续播放. + * 调速时调用. **/ -@property (nonatomic, assign, readonly) BOOL userPaused; +@property (nonatomic, copy, readwrite, nullable) void(^rateChanged)(SJVideoPlayer *player); -- (BOOL)play; +/*! + * Call when the rate changes. + * + * 调速时调用. + * 当滑动内部的`rate slider`时候调用. 外部改变`rate`不会调用. + **/ +@property (nonatomic, copy, readwrite, nullable) void(^internallyChangedRate)(SJVideoPlayer *player, float rate); -- (BOOL)pause; +@end -- (void)stop; -/// 停止播放并淡出 -- (void)stopAndFadeOut; +#pragma mark - 屏幕旋转 + +@interface SJVideoPlayer (Rotation) /*! - * 停止旋转. + * Whether screen rotation is disabled. default is NO. * - * 相当于 `player.disableRotation = YES;` . - **/ -- (void)stopRotation; + * 是否禁用屏幕旋转, 默认是NO. + */ +@property (nonatomic, assign, readwrite) BOOL disableRotation; /*! - * 开启旋转. + * Call when the screen is rotated. * - * 相当于 `player.disableRotation = NO;` . + * 屏幕旋转的时候调用. **/ -- (void)enableRotation; +@property (nonatomic, copy, readwrite, nullable) void(^willRotateScreen)(SJVideoPlayer *player, BOOL isFullScreen); +@property (nonatomic, copy, readwrite, nullable) void(^rotatedScreen)(SJVideoPlayer *player, BOOL isFullScreen); +@property (nonatomic, assign, readonly) BOOL isFullScreen; // 是否全屏 + +@end + + +#pragma mark - 控制视图 + +@interface SJVideoPlayer (ControlView) /*! - * 跳转到指定位置, 不建议使用 - * 如果要跳转到某个位置, 可以在初始化时, 设置`SJVideoPlayerAssetCarrier`的`beginTime`. + * Call when the control view is hidden or displayed. + * + * 控制视图隐藏或显示的时候调用. **/ -- (void)jumpedToTime:(NSTimeInterval)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler; +@property (nonatomic, copy, readwrite, nullable) void(^controlViewDisplayStatus)(SJVideoPlayer *player, BOOL displayed); -- (void)seekToTime:(CMTime)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler; +@property (nonatomic, assign, readonly) BOOL controlViewDisplayed; // 控制视图是否显示 @end -#pragma mark - +#pragma mark - 提示 @interface SJVideoPlayer (Prompt) diff --git a/SJVideoPlayer/Player/SJVideoPlayer.m b/SJVideoPlayer/Player/SJVideoPlayer.m index 68ecf6be0..981b0bf97 100644 --- a/SJVideoPlayer/Player/SJVideoPlayer.m +++ b/SJVideoPlayer/Player/SJVideoPlayer.m @@ -330,6 +330,18 @@ - (void)_showControlState { _sjHiddenViews(@[self.controlView.bottomProgressSlider]); self.controlView.previewView.hidden = YES; + if ( !self.orentation.isFullScreen ) { + _sjHiddenViews(@[self.controlView.topControlView.previewBtn, self.controlView.topControlView.moreBtn]); + } + else { + if ( self.generatePreviewImages && + self.asset.generatedPreviewImages ) { + _sjShowViews(@[self.controlView.topControlView.previewBtn]); + } + + _sjShowViews(@[self.controlView.topControlView.moreBtn]); + } + // transform show if ( self.playOnCell && !self.orentation.fullScreen ) { self.controlView.topControlView.transform = CGAffineTransformMakeTranslation(0, -SJControlTopH); @@ -412,18 +424,6 @@ - (void)dealloc { NSLog(@"%s - %zd", __func__, __LINE__); } -- (UIImage *)screenshot { - return [_asset screenshot]; -} - -- (NSTimeInterval)currentTime { - return _asset.currentTime; -} - -- (NSTimeInterval)totalTime { - return _asset.duration; -} - - (BOOL)playOnCell { return _asset.indexPath ? YES : NO; } @@ -651,7 +651,7 @@ - (SJOrentationObserver *)orentation { return YES; }; - _orentation.orientationWillChange = ^(SJOrentationObserver * _Nonnull observer) { + _orentation.orientationWillChange = ^(SJOrentationObserver * _Nonnull observer, BOOL isFullScreen) { __strong typeof(_self) self = _self; if ( !self ) return; _sjAnima(^{ @@ -660,20 +660,15 @@ - (SJOrentationObserver *)orentation { self.hideControl = YES; if ( !observer.isFullScreen ) self.hiddenLeftControlView = YES; self.controlView.previewView.hidden = YES; + if ( self.willRotateScreen ) self.willRotateScreen(self, isFullScreen); }); }; - _orentation.orientationChanged = ^(SJOrentationObserver * _Nonnull observer) { + _orentation.orientationChanged = ^(SJOrentationObserver * _Nonnull observer, BOOL isFullScreen) { __strong typeof(_self) self = _self; if ( !self ) return; _sjAnima_Complete(^{ - self.hideControl = NO; if ( observer.isFullScreen ) { - self.hiddenLeftControlView = NO; - _sjShowViews(@[self.controlView.topControlView.moreBtn]); - if ( self.asset.hasBeenGeneratedPreviewImages ) { - _sjShowViews(@[self.controlView.topControlView.previewBtn]); - } // `iPhone_X` remake constraints. if ( SJ_is_iPhoneX() ) { [self.controlView mas_remakeConstraints:^(MASConstraintMaker *make) { @@ -684,8 +679,6 @@ - (SJOrentationObserver *)orentation { } } else { - _sjHiddenViews(@[self.controlView.topControlView.moreBtn, - self.controlView.topControlView.previewBtn,]); // `iPhone_X` remake constraints. if ( SJ_is_iPhoneX() ) { [self.controlView mas_remakeConstraints:^(MASConstraintMaker *make) { @@ -1174,21 +1167,9 @@ - (void)setState:(SJVideoPlayerPlayState)state { @end +#pragma mark - 播放 - - -#pragma mark - - -@implementation SJVideoPlayer (Setting) - -- (void)setClickedBackEvent:(void (^)(SJVideoPlayer *player))clickedBackEvent { - objc_setAssociatedObject(self, @selector(clickedBackEvent), clickedBackEvent, OBJC_ASSOCIATION_COPY_NONATOMIC); -} - -- (void (^)(SJVideoPlayer * _Nonnull))clickedBackEvent { - return objc_getAssociatedObject(self, _cmd); -} - +@implementation SJVideoPlayer (Play) - (void)playWithURL:(NSURL *)playURL { [self playWithURL:playURL jumpedToTime:0]; } @@ -1210,7 +1191,7 @@ - (void)setAsset:(SJVideoPlayerAssetCarrier *)asset { [self _clear]; _asset = asset; if ( !asset || !asset.assetURL ) return; - [self _resetRate]; + [self resetRate]; _view.alpha = 1; _presentView.asset = asset; _controlView.asset = asset; @@ -1270,7 +1251,7 @@ - (void)setAsset:(SJVideoPlayerAssetCarrier *)asset { if ( self.state == SJVideoPlayerPlayState_Buffing ) return; [self _buffering]; }; - + if ( asset.indexPath ) { /// 默认滑入 self.scrollIn = YES; @@ -1278,7 +1259,7 @@ - (void)setAsset:(SJVideoPlayerAssetCarrier *)asset { else { self.scrollIn = NO; } - + // scroll view if ( asset.scrollView ) { /// 滑入 @@ -1296,10 +1277,10 @@ - (void)setAsset:(SJVideoPlayerAssetCarrier *)asset { make.edges.equalTo(self.view.superview); }]; } -// if ( !self.userPaused && -// self.state != SJVideoPlayerPlayState_PlayEnd ) [self play]; + // if ( !self.userPaused && + // self.state != SJVideoPlayerPlayState_PlayEnd ) [self play]; }; - + /// 滑出 asset.scrollOut = ^(SJVideoPlayerAssetCarrier * _Nonnull asset) { __strong typeof(_self) self = _self; @@ -1308,7 +1289,7 @@ - (void)setAsset:(SJVideoPlayerAssetCarrier *)asset { self.scrollIn = NO; self.view.alpha = 0.001; if ( !self.userPaused && - self.state != SJVideoPlayerPlayState_PlayEnd ) [self pause]; + self.state != SJVideoPlayerPlayState_PlayEnd ) [self pause]; }; /// @@ -1324,12 +1305,146 @@ - (SJVideoPlayerAssetCarrier *)asset { return _asset; } +- (UIImage *)screenshot { + return [_asset screenshot]; +} + +- (NSTimeInterval)currentTime { + return _asset.currentTime; +} + +- (NSTimeInterval)totalTime { + return _asset.duration; +} + - (void)_clear { _presentView.asset = nil; _controlView.asset = nil; _asset = nil; } +@end + + +#pragma mark - 控制 + +@implementation SJVideoPlayer (Control) + +- (BOOL)userPaused { + return self.userClickedPause; +} + +- (void)setAutoplay:(BOOL)autoplay { + objc_setAssociatedObject(self, @selector(isAutoplay), @(autoplay), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (BOOL)isAutoplay { + return [objc_getAssociatedObject(self, _cmd) boolValue]; +} + +- (BOOL)play { + self.suspend = NO; + self.stopped = NO; + + if ( !self.asset ) return NO; + self.userClickedPause = NO; + _sjAnima(^{ + [self _playState]; + }); + [self _play]; + return YES; +} + +- (BOOL)pause { + self.suspend = YES; + + if ( !self.asset ) return NO; + _sjAnima(^{ + [self _pauseState]; + self.hideControl = NO; + }); + [self _pause]; + if ( !self.playOnCell || self.orentation.fullScreen ) [self showTitle:@"已暂停"]; + return YES; +} + +- (void)stop { + self.suspend = NO; + self.stopped = YES; + + if ( !self.asset ) return; + _sjAnima(^{ + [self _unknownState]; + }); + [self _clear]; +} + +- (void)stopAndFadeOut { + self.suspend = NO; + self.stopped = YES; + // state + _sjAnima(^{ + [self _unknownState]; + }); + // pause + [self _pause]; + // fade out + [UIView animateWithDuration:0.5 animations:^{ + self.view.alpha = 0.001; + } completion:^(BOOL finished) { + [self stop]; + [_view removeFromSuperview]; + }]; +} + +- (void)setPlayDidToEnd:(void (^)(SJVideoPlayer * _Nonnull))playDidToEnd { + objc_setAssociatedObject(self, @selector(playDidToEnd), playDidToEnd, OBJC_ASSOCIATION_COPY_NONATOMIC); +} + +- (void (^)(SJVideoPlayer * _Nonnull))playDidToEnd { + return objc_getAssociatedObject(self, _cmd); +} + +- (void)jumpedToTime:(NSTimeInterval)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler { + if ( isnan(time) ) { return;} + CMTime seekTime = CMTimeMakeWithSeconds(time, NSEC_PER_SEC); + [self seekToTime:seekTime completionHandler:completionHandler]; +} + +- (void)seekToTime:(CMTime)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler { + [self _startLoading]; + __weak typeof(self) _self = self; + [self.asset seekToTime:time completionHandler:^(BOOL finished) { + __strong typeof(_self) self = _self; + if ( !self ) return; + [self _stopLoading]; + if ( completionHandler ) completionHandler(finished); + }]; +} + +- (void)stopRotation { + self.disableRotation = YES; +} + +- (void)enableRotation { + self.disableRotation = NO; +} + +@end + + +#pragma mark - 配置 + +@implementation SJVideoPlayer (Setting) + +- (void)setClickedBackEvent:(void (^)(SJVideoPlayer *player))clickedBackEvent { + objc_setAssociatedObject(self, @selector(clickedBackEvent), clickedBackEvent, OBJC_ASSOCIATION_COPY_NONATOMIC); +} + +- (void (^)(SJVideoPlayer * _Nonnull))clickedBackEvent { + return objc_getAssociatedObject(self, _cmd); +} + - (void)setMoreSettings:(NSArray *)moreSettings { objc_setAssociatedObject(self, @selector(moreSettings), moreSettings, OBJC_ASSOCIATION_RETAIN_NONATOMIC); NSMutableSet *moreSettingsM = [NSMutableSet new]; @@ -1420,14 +1535,6 @@ - (void)setPlaceholder:(UIImage *)placeholder { }); } -- (void)setAutoplay:(BOOL)autoplay { - objc_setAssociatedObject(self, @selector(isAutoplay), @(autoplay), OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (BOOL)isAutoplay { - return [objc_getAssociatedObject(self, _cmd) boolValue]; -} - - (void)setGeneratePreviewImages:(BOOL)generatePreviewImages { objc_setAssociatedObject(self, @selector(generatePreviewImages), @(generatePreviewImages), OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @@ -1436,49 +1543,13 @@ - (BOOL)generatePreviewImages { return [objc_getAssociatedObject(self, _cmd) boolValue]; } -- (void)setDisableRotation:(BOOL)disableRotation { - objc_setAssociatedObject(self, @selector(disableRotation), @(disableRotation), OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (BOOL)disableRotation { - return [objc_getAssociatedObject(self, _cmd) boolValue]; -} - -- (void)setRotatedScreen:(void (^)(SJVideoPlayer * _Nonnull, BOOL))rotatedScreen { - objc_setAssociatedObject(self, @selector(rotatedScreen), rotatedScreen, OBJC_ASSOCIATION_COPY_NONATOMIC); -} - -- (void (^)(SJVideoPlayer * _Nonnull, BOOL))rotatedScreen { - return objc_getAssociatedObject(self, _cmd); -} - -- (BOOL)isFullScreen { - return self.orentation.isFullScreen; -} - -- (void)setPlayDidToEnd:(void (^)(SJVideoPlayer * _Nonnull))playDidToEnd { - objc_setAssociatedObject(self, @selector(playDidToEnd), playDidToEnd, OBJC_ASSOCIATION_COPY_NONATOMIC); -} +@end -- (void (^)(SJVideoPlayer * _Nonnull))playDidToEnd { - return objc_getAssociatedObject(self, _cmd); -} -- (void)setControlViewDisplayStatus:(void (^)(SJVideoPlayer * _Nonnull, BOOL))controlViewDisplayStatus { - objc_setAssociatedObject(self, @selector(controlViewDisplayStatus), controlViewDisplayStatus, OBJC_ASSOCIATION_COPY_NONATOMIC); -} -- (void (^)(SJVideoPlayer * _Nonnull, BOOL))controlViewDisplayStatus { - return objc_getAssociatedObject(self, _cmd); -} +#pragma mark - 调速 -- (BOOL)controlViewDisplayed { - return !self.isHiddenControl; -} - -- (void)_resetRate { - objc_setAssociatedObject(self, @selector(rate), @(1), OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} +@implementation SJVideoPlayer (Rate) - (void)setRate:(float)rate { if ( self.rate == rate ) return; @@ -1497,6 +1568,10 @@ - (float)rate { return [objc_getAssociatedObject(self, _cmd) floatValue]; } +- (void)resetRate { + objc_setAssociatedObject(self, @selector(rate), @(1), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + - (void)setRateChanged:(void (^)(SJVideoPlayer * _Nonnull))rateChanged { objc_setAssociatedObject(self, @selector(rateChanged), rateChanged, OBJC_ASSOCIATION_COPY_NONATOMIC); } @@ -1516,100 +1591,62 @@ - (void)setInternallyChangedRate:(void (^)(SJVideoPlayer * _Nonnull, float))inte @end +#pragma mark - 屏幕旋转 +@implementation SJVideoPlayer (Rotation) +- (void)setDisableRotation:(BOOL)disableRotation { + objc_setAssociatedObject(self, @selector(disableRotation), @(disableRotation), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} -#pragma mark - - -@implementation SJVideoPlayer (Control) - -- (BOOL)userPaused { - return self.userClickedPause; +- (BOOL)disableRotation { + return [objc_getAssociatedObject(self, _cmd) boolValue]; } -- (BOOL)play { - self.suspend = NO; - self.stopped = NO; - - if ( !self.asset ) return NO; - self.userClickedPause = NO; - _sjAnima(^{ - [self _playState]; - }); - [self _play]; - return YES; +- (void)setWillRotateScreen:(void (^)(SJVideoPlayer * _Nonnull, BOOL))willRotateScreen { + objc_setAssociatedObject(self, @selector(willRotateScreen), willRotateScreen, OBJC_ASSOCIATION_COPY_NONATOMIC); } -- (BOOL)pause { - self.suspend = YES; - - if ( !self.asset ) return NO; - _sjAnima(^{ - [self _pauseState]; - self.hideControl = NO; - }); - [self _pause]; - if ( !self.playOnCell || self.orentation.fullScreen ) [self showTitle:@"已暂停"]; - return YES; +- (void (^)(SJVideoPlayer * _Nonnull, BOOL))willRotateScreen { + return objc_getAssociatedObject(self, _cmd); } -- (void)stop { - self.suspend = NO; - self.stopped = YES; - - if ( !self.asset ) return; - _sjAnima(^{ - [self _unknownState]; - }); - [self _clear]; +- (void)setRotatedScreen:(void (^)(SJVideoPlayer * _Nonnull, BOOL))rotatedScreen { + objc_setAssociatedObject(self, @selector(rotatedScreen), rotatedScreen, OBJC_ASSOCIATION_COPY_NONATOMIC); } -- (void)stopAndFadeOut { - self.suspend = NO; - self.stopped = YES; - // state - _sjAnima(^{ - [self _unknownState]; - }); - // pause - [self _pause]; - // fade out - [UIView animateWithDuration:0.5 animations:^{ - self.view.alpha = 0.001; - } completion:^(BOOL finished) { - [self stop]; - [_view removeFromSuperview]; - }]; +- (void (^)(SJVideoPlayer * _Nonnull, BOOL))rotatedScreen { + return objc_getAssociatedObject(self, _cmd); } -- (void)jumpedToTime:(NSTimeInterval)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler { - if ( isnan(time) ) { return;} - CMTime seekTime = CMTimeMakeWithSeconds(time, NSEC_PER_SEC); - [self seekToTime:seekTime completionHandler:completionHandler]; +- (BOOL)isFullScreen { + return self.orentation.isFullScreen; } -- (void)seekToTime:(CMTime)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler { - [self _startLoading]; - __weak typeof(self) _self = self; - [self.asset seekToTime:time completionHandler:^(BOOL finished) { - __strong typeof(_self) self = _self; - if ( !self ) return; - [self _stopLoading]; - if ( completionHandler ) completionHandler(finished); - }]; +@end + + +#pragma mark - 控制视图 + +@implementation SJVideoPlayer (ControlView) + +- (void)setControlViewDisplayStatus:(void (^)(SJVideoPlayer * _Nonnull, BOOL))controlViewDisplayStatus { + objc_setAssociatedObject(self, @selector(controlViewDisplayStatus), controlViewDisplayStatus, OBJC_ASSOCIATION_COPY_NONATOMIC); } -- (void)stopRotation { - self.disableRotation = YES; +- (void (^)(SJVideoPlayer * _Nonnull, BOOL))controlViewDisplayStatus { + return objc_getAssociatedObject(self, _cmd); } -- (void)enableRotation { - self.disableRotation = NO; +- (BOOL)controlViewDisplayed { + return !self.isHiddenControl; } @end +#pragma mark - 提示 + @implementation SJVideoPlayer (Prompt) - (SJPrompt *)prompt { diff --git a/SJVideoPlayer/SJPlayer.h b/SJVideoPlayer/SJPlayer.h index 3691d00e3..60da04a56 100644 --- a/SJVideoPlayer/SJPlayer.h +++ b/SJVideoPlayer/SJPlayer.h @@ -5,6 +5,9 @@ // Created by BlueDancer on 2017/12/7. // Copyright © 2017年 SanJiang. All rights reserved. // +// https://github.com/changsanjiang/SJVideoPlayer +// changsanjiang@gmail.com +// #ifndef SJPlayer_h #define SJPlayer_h diff --git a/SJVideoPlayerProject/.DS_Store b/SJVideoPlayerProject/.DS_Store index 220f7be58..7d7e218e0 100644 Binary files a/SJVideoPlayerProject/.DS_Store and b/SJVideoPlayerProject/.DS_Store differ diff --git a/SJVideoPlayerProject/Podfile.lock b/SJVideoPlayerProject/Podfile.lock index e3a9e56a7..6db29751a 100644 --- a/SJVideoPlayerProject/Podfile.lock +++ b/SJVideoPlayerProject/Podfile.lock @@ -2,9 +2,9 @@ PODS: - Masonry (1.1.0) - SJAttributesFactory (2.0.2) - SJBorderLineView (0.0.6) - - SJFullscreenPopGesture (1.3.3): - - SJFullscreenPopGesture/View (= 1.3.3) - - SJFullscreenPopGesture/View (1.3.3) + - SJFullscreenPopGesture (1.3.4): + - SJFullscreenPopGesture/View (= 1.3.4) + - SJFullscreenPopGesture/View (1.3.4) - SJLabel (1.2.6): - SJLabel/Category (= 1.2.6) - SJLabel/Services (= 1.2.6) @@ -13,10 +13,10 @@ PODS: - SJLabel/Category - SJLoadingView (1.0.1) - SJObserverHelper (1.0.3) - - SJOrentationObserver (0.0.8): + - SJOrentationObserver (1.0.1): - Masonry - - SJOrentationObserver/Category (= 0.0.8) - - SJOrentationObserver/Category (0.0.8): + - SJOrentationObserver/Category (= 1.0.1) + - SJOrentationObserver/Category (1.0.1): - Masonry - SJPrompt (1.0.1): - Masonry @@ -53,11 +53,11 @@ SPEC CHECKSUMS: Masonry: 678fab65091a9290e40e2832a55e7ab731aad201 SJAttributesFactory: 01f680bab9e318b0bd11ddff58155a2c7475f2c3 SJBorderLineView: 5878e67fb57e812a2d5d029ca666068784b5448a - SJFullscreenPopGesture: edcdff450bf2e2229c6c2c838817125513fbac3c + SJFullscreenPopGesture: 89a5c9afb100511ec0e4ad54d110b943235d59ec SJLabel: e66ad920bd503a69fdcc0318dec62f9e4a5105af SJLoadingView: c3ff03e4b363a5b6a3ba0634d6bb9ce2647faf07 SJObserverHelper: b270d707cd18ab76538596aa4e98cf798c9e9868 - SJOrentationObserver: f7a2a4c27f07e2ad46454bcbb016b5afa270e394 + SJOrentationObserver: 5374e2fb3c05634249cf7595a91806a95147da76 SJPrompt: eaecd94f2055a12d25090967dbad3f21da011626 SJSlider: 9498746518f0002b244d67238a55c02e3a2aafbe SJUIFactory: 3b73bc10a2de3cedd7856480bdde177ed9fc6843 diff --git a/SJVideoPlayerProject/Pods/.DS_Store b/SJVideoPlayerProject/Pods/.DS_Store index 5a2e42d41..ad8d46e85 100644 Binary files a/SJVideoPlayerProject/Pods/.DS_Store and b/SJVideoPlayerProject/Pods/.DS_Store differ diff --git a/SJVideoPlayerProject/Pods/Manifest.lock b/SJVideoPlayerProject/Pods/Manifest.lock index e3a9e56a7..6db29751a 100644 --- a/SJVideoPlayerProject/Pods/Manifest.lock +++ b/SJVideoPlayerProject/Pods/Manifest.lock @@ -2,9 +2,9 @@ PODS: - Masonry (1.1.0) - SJAttributesFactory (2.0.2) - SJBorderLineView (0.0.6) - - SJFullscreenPopGesture (1.3.3): - - SJFullscreenPopGesture/View (= 1.3.3) - - SJFullscreenPopGesture/View (1.3.3) + - SJFullscreenPopGesture (1.3.4): + - SJFullscreenPopGesture/View (= 1.3.4) + - SJFullscreenPopGesture/View (1.3.4) - SJLabel (1.2.6): - SJLabel/Category (= 1.2.6) - SJLabel/Services (= 1.2.6) @@ -13,10 +13,10 @@ PODS: - SJLabel/Category - SJLoadingView (1.0.1) - SJObserverHelper (1.0.3) - - SJOrentationObserver (0.0.8): + - SJOrentationObserver (1.0.1): - Masonry - - SJOrentationObserver/Category (= 0.0.8) - - SJOrentationObserver/Category (0.0.8): + - SJOrentationObserver/Category (= 1.0.1) + - SJOrentationObserver/Category (1.0.1): - Masonry - SJPrompt (1.0.1): - Masonry @@ -53,11 +53,11 @@ SPEC CHECKSUMS: Masonry: 678fab65091a9290e40e2832a55e7ab731aad201 SJAttributesFactory: 01f680bab9e318b0bd11ddff58155a2c7475f2c3 SJBorderLineView: 5878e67fb57e812a2d5d029ca666068784b5448a - SJFullscreenPopGesture: edcdff450bf2e2229c6c2c838817125513fbac3c + SJFullscreenPopGesture: 89a5c9afb100511ec0e4ad54d110b943235d59ec SJLabel: e66ad920bd503a69fdcc0318dec62f9e4a5105af SJLoadingView: c3ff03e4b363a5b6a3ba0634d6bb9ce2647faf07 SJObserverHelper: b270d707cd18ab76538596aa4e98cf798c9e9868 - SJOrentationObserver: f7a2a4c27f07e2ad46454bcbb016b5afa270e394 + SJOrentationObserver: 5374e2fb3c05634249cf7595a91806a95147da76 SJPrompt: eaecd94f2055a12d25090967dbad3f21da011626 SJSlider: 9498746518f0002b244d67238a55c02e3a2aafbe SJUIFactory: 3b73bc10a2de3cedd7856480bdde177ed9fc6843 diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/project.pbxproj b/SJVideoPlayerProject/Pods/Pods.xcodeproj/project.pbxproj index e9cb9e140..4a411b725 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/project.pbxproj +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 48; objects = { /* Begin PBXBuildFile section */ @@ -271,17 +271,17 @@ 02A656694E2DFA51E14E0D07E5B7D01F /* MASConstraintMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraintMaker.h; path = Masonry/MASConstraintMaker.h; sourceTree = ""; }; 0345C886DA25909B925ED10E9B48E6F1 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASShorthandAdditions.h"; path = "Masonry/View+MASShorthandAdditions.h"; sourceTree = ""; }; 03C3E5A6351B8DA33487591AC3CBE472 /* SJAttributesFactory.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SJAttributesFactory.xcconfig; sourceTree = ""; }; - 04EC384B0CE05E4DB1A07009C3554BA4 /* libPods-SJVideoPlayerProject.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SJVideoPlayerProject.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 04EC384B0CE05E4DB1A07009C3554BA4 /* libPods-SJVideoPlayerProject.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-SJVideoPlayerProject.a"; path = "libPods-SJVideoPlayerProject.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 057CBAECBFF366CB409A4B633BF54918 /* SJScreenshotView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJScreenshotView.h; path = SJFullscreenPopGesture/View/SJScreenshotView.h; sourceTree = ""; }; 05967AEEB8FC9229651051C50CDAB3A2 /* SJLoadingView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJLoadingView.h; path = SJLoadingView/SJLoadingView.h; sourceTree = ""; }; - 076B7D66B7F40E2BD006AA59C7939C23 /* libMasonry.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMasonry.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 076B7D66B7F40E2BD006AA59C7939C23 /* libMasonry.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libMasonry.a; path = libMasonry.a; sourceTree = BUILT_PRODUCTS_DIR; }; 07A93CD8A4493C48415A0BD7AB7687A0 /* SJVideoPlayerAssetCarrier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJVideoPlayerAssetCarrier.h; path = SJVideoPlayerAssetCarrier/SJVideoPlayerAssetCarrier.h; sourceTree = ""; }; 0A11C24CBFFF9A24CF41A0B510795210 /* Masonry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Masonry.h; path = Masonry/Masonry.h; sourceTree = ""; }; 0BA80E52B35BAF6170A6FE1616A55DF1 /* SJSlider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJSlider.h; path = SJSlider/SJSlider.h; sourceTree = ""; }; 0DD34F15C2C945B0197345DD405CBBD8 /* NSMutableAttributedString+ActionDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableAttributedString+ActionDelegate.h"; path = "SJLabel/Category/NSMutableAttributedString+ActionDelegate.h"; sourceTree = ""; }; 0F1915EA3CF8CAA0EB38D569919C3225 /* SJLoadingView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SJLoadingView.m; path = SJLoadingView/SJLoadingView.m; sourceTree = ""; }; 1299F56B08270B19A7D3489D43D7EFCF /* UIViewController+SJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIViewController+SJExtension.h"; path = "SJOrentationObserver/Category/UIViewController+SJExtension.h"; sourceTree = ""; }; - 13689D97DD42C8486E52436614F67C0A /* libSJUIFactory.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJUIFactory.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 13689D97DD42C8486E52436614F67C0A /* libSJUIFactory.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJUIFactory.a; path = libSJUIFactory.a; sourceTree = BUILT_PRODUCTS_DIR; }; 14F495AF77DFE2D369F8B6F43D2DC115 /* SJObserverHelper-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SJObserverHelper-dummy.m"; sourceTree = ""; }; 17D4F617E7E6879B564BB783F72D2C26 /* SJVolBrigResource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SJVolBrigResource.m; path = SJVolBrigControl/Resource/SJVolBrigResource.m; sourceTree = ""; }; 187857DE4F5657DF9FA2742167DF3300 /* MASCompositeConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASCompositeConstraint.h; path = Masonry/MASCompositeConstraint.h; sourceTree = ""; }; @@ -308,7 +308,7 @@ 40F4E4A8ECB0F8D961D56DFE4ED147BD /* NSMutableAttributedString+ActionDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableAttributedString+ActionDelegate.m"; path = "SJLabel/Category/NSMutableAttributedString+ActionDelegate.m"; sourceTree = ""; }; 426705848444054FE5662DD11B2B13F7 /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "ViewController+MASAdditions.m"; path = "Masonry/ViewController+MASAdditions.m"; sourceTree = ""; }; 47378DD1622DF4F09A6484FB73E4EA44 /* SJUIFactoryHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJUIFactoryHeader.h; path = Classes/SJUIFactoryHeader.h; sourceTree = ""; }; - 47E8B4B8E113375B44D925C49997B278 /* libSJVolBrigControl.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJVolBrigControl.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 47E8B4B8E113375B44D925C49997B278 /* libSJVolBrigControl.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJVolBrigControl.a; path = libSJVolBrigControl.a; sourceTree = BUILT_PRODUCTS_DIR; }; 4820014178A088C117496E45E30CFBD8 /* SJOrentationObserver-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SJOrentationObserver-prefix.pch"; sourceTree = ""; }; 49DF9AEDAF37E1546544674035200E6F /* SJCTImageData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SJCTImageData.m; path = SJLabel/Services/SJCTImageData.m; sourceTree = ""; }; 4A1525B753CB437FD8AC4DFF7AA4D31D /* SJUIFactory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJUIFactory.h; path = Classes/SJUIFactory.h; sourceTree = ""; }; @@ -316,8 +316,8 @@ 4DBBFCAB9B1011993EFB6AAED96DED93 /* SJAttributesRecorder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SJAttributesRecorder.m; path = SJAttributesFactory/SJAttributesRecorder.m; sourceTree = ""; }; 51FA9FD5C15286380E2079BD1EAE7282 /* SJLoadingView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SJLoadingView.xcconfig; sourceTree = ""; }; 524C0ADFFC339BA715A57564EE647188 /* SJVolBrigControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJVolBrigControl.h; path = SJVolBrigControl/SJVolBrigControl.h; sourceTree = ""; }; - 548D41F1EFD00A68F8E9D035C3C8EA70 /* libSJOrentationObserver.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJOrentationObserver.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 54C985DCF6F29E23BE3A4255CE228D9D /* libSJLoadingView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJLoadingView.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 548D41F1EFD00A68F8E9D035C3C8EA70 /* libSJOrentationObserver.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJOrentationObserver.a; path = libSJOrentationObserver.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 54C985DCF6F29E23BE3A4255CE228D9D /* libSJLoadingView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJLoadingView.a; path = libSJLoadingView.a; sourceTree = BUILT_PRODUCTS_DIR; }; 55AF3BA42554A3B9C5D368AAB4B4AFDB /* SJBorderLineView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SJBorderLineView-dummy.m"; sourceTree = ""; }; 58246EBE158E491EAE42FB31F2B4D942 /* SJLoadingView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SJLoadingView-prefix.pch"; sourceTree = ""; }; 5CE5168CED6ACE3C5A5AE9FF3D3FE486 /* SJScreenshotView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SJScreenshotView.m; path = SJFullscreenPopGesture/View/SJScreenshotView.m; sourceTree = ""; }; @@ -330,8 +330,8 @@ 68553CFA0F04B830E5E39020416FC048 /* SJAttributeWorker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SJAttributeWorker.m; path = SJAttributesFactory/SJAttributeWorker.m; sourceTree = ""; }; 6DC0AC4C0AD5EB8EE09E72A3E1583F61 /* NSLayoutConstraint+MASDebugAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSLayoutConstraint+MASDebugAdditions.h"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.h"; sourceTree = ""; }; 6F2CFCC33F55BF667E07B88EDE4ECCD4 /* SJUIFactory.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SJUIFactory.xcconfig; sourceTree = ""; }; - 717703F8269905D04A587D90EA141A3E /* libSJVideoPlayerAssetCarrier.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJVideoPlayerAssetCarrier.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 72F0B78D9439EAA239C547FEF86F757D /* libSJLabel.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJLabel.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 717703F8269905D04A587D90EA141A3E /* libSJVideoPlayerAssetCarrier.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJVideoPlayerAssetCarrier.a; path = libSJVideoPlayerAssetCarrier.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 72F0B78D9439EAA239C547FEF86F757D /* libSJLabel.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJLabel.a; path = libSJLabel.a; sourceTree = BUILT_PRODUCTS_DIR; }; 7365DEDD616C88EAF59658C859F527F8 /* MASViewConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewConstraint.h; path = Masonry/MASViewConstraint.h; sourceTree = ""; }; 7528B6BD66D28E92B627C542533490ED /* SJUIFactory-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SJUIFactory-dummy.m"; sourceTree = ""; }; 7AC27F0DEF6D7A7AF4690A2374DFD222 /* SJVolBrigControl.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SJVolBrigControl.xcconfig; sourceTree = ""; }; @@ -348,13 +348,13 @@ 907858C90DC49CFF5E606FC56E1212E8 /* UITabBarController+SJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITabBarController+SJExtension.h"; path = "SJOrentationObserver/Category/UITabBarController+SJExtension.h"; sourceTree = ""; }; 915F870192192FF00EDD0D92C54A4AA0 /* SJStringParserConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJStringParserConfig.h; path = SJLabel/Services/SJStringParserConfig.h; sourceTree = ""; }; 921E52F723041DDF782C6D39FF2306B1 /* SJLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJLabel.h; path = SJLabel/SJLabel.h; sourceTree = ""; }; - 92A756793AF31D45C10BADB9FE321431 /* libSJObserverHelper.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJObserverHelper.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 92A756793AF31D45C10BADB9FE321431 /* libSJObserverHelper.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJObserverHelper.a; path = libSJObserverHelper.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 93CA51798B9AE9C68D58916306650989 /* SJCTFrameParserConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJCTFrameParserConfig.h; path = SJLabel/Services/SJCTFrameParserConfig.h; sourceTree = ""; }; 93E65E0AA71E32FFA0F971C144D5DAFF /* SJFullscreenPopGesture.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SJFullscreenPopGesture.xcconfig; sourceTree = ""; }; 977054887CF01FFF49000A66208245F8 /* SJFullscreenPopGesture-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SJFullscreenPopGesture-prefix.pch"; sourceTree = ""; }; 991DF99E99FCDCF718F2182B2C07687A /* SJVolBrigControl-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SJVolBrigControl-prefix.pch"; sourceTree = ""; }; - 9AC5458511E16CA0E5A6AF67E9C3AD21 /* libSJFullscreenPopGesture.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJFullscreenPopGesture.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 9AC5458511E16CA0E5A6AF67E9C3AD21 /* libSJFullscreenPopGesture.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJFullscreenPopGesture.a; path = libSJFullscreenPopGesture.a; sourceTree = BUILT_PRODUCTS_DIR; }; 9AF1E7A81E1C0C09551769677980B3F3 /* SJVideoPlayerAssetCarrier.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SJVideoPlayerAssetCarrier.xcconfig; sourceTree = ""; }; 9CFA9C9AC48472E12D93CBB85C7B57E9 /* SJAttributesFactory-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SJAttributesFactory-prefix.pch"; sourceTree = ""; }; 9E7951C1D6EA84CFF8ED69FC8B6A0E56 /* SJUIFactory-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SJUIFactory-prefix.pch"; sourceTree = ""; }; @@ -362,7 +362,7 @@ 9ECD0326D1BC08D15EB6593C9D24823E /* SJAttributeWorker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJAttributeWorker.h; path = SJAttributesFactory/SJAttributeWorker.h; sourceTree = ""; }; A1F8BA2D15F6EC0AF91ED8E4E1BD4BE4 /* UIImagePickerController+Extension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImagePickerController+Extension.m"; path = "Classes/Category/UIImagePickerController+Extension.m"; sourceTree = ""; }; A4871B93BE9EEA0FA2AA728942BC3645 /* SJBorderlineView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SJBorderlineView.m; path = SJBorderLineView/SJBorderlineView.m; sourceTree = ""; }; - A75F70C2B85686848DCC372CE072878D /* libSJPrompt.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJPrompt.a; sourceTree = BUILT_PRODUCTS_DIR; }; + A75F70C2B85686848DCC372CE072878D /* libSJPrompt.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJPrompt.a; path = libSJPrompt.a; sourceTree = BUILT_PRODUCTS_DIR; }; A7749496ADBACCAC843AC71B62EF8359 /* Pods-SJVideoPlayerProject.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SJVideoPlayerProject.release.xcconfig"; sourceTree = ""; }; A7AF639F48630A369AAB591B5B339CC8 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; B18E36BE65489AFE69F241B4489793D6 /* SJBorderLineView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SJBorderLineView.xcconfig; sourceTree = ""; }; @@ -388,10 +388,10 @@ D9DFE510FD8188585D784C84B3AA47D4 /* MASConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraint.m; path = Masonry/MASConstraint.m; sourceTree = ""; }; DB1EBDFD8727C3EB4860B916FFE19CD8 /* UINavigationController+SJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UINavigationController+SJExtension.m"; path = "SJOrentationObserver/Category/UINavigationController+SJExtension.m"; sourceTree = ""; }; DDFDFA69BFF0A1A03FDEC336ED469CFE /* SJCommonSlider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SJCommonSlider.m; path = SJSlider/SJCommonSlider.m; sourceTree = ""; }; - DE36BD3DD89F507F60A11AF1FBB75CE4 /* libSJBorderLineView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJBorderLineView.a; sourceTree = BUILT_PRODUCTS_DIR; }; + DE36BD3DD89F507F60A11AF1FBB75CE4 /* libSJBorderLineView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJBorderLineView.a; path = libSJBorderLineView.a; sourceTree = BUILT_PRODUCTS_DIR; }; DE7CFAD18EA3476FFF6612CDF15822D9 /* SJOrentationObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJOrentationObserver.h; path = SJOrentationObserver/SJOrentationObserver.h; sourceTree = ""; }; DEE47FA3EDDC6C27C657F180400CF125 /* SJSlider.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SJSlider.xcconfig; sourceTree = ""; }; - E1A096687D0BC889AE4C95462EB55678 /* libSJAttributesFactory.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJAttributesFactory.a; sourceTree = BUILT_PRODUCTS_DIR; }; + E1A096687D0BC889AE4C95462EB55678 /* libSJAttributesFactory.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJAttributesFactory.a; path = libSJAttributesFactory.a; sourceTree = BUILT_PRODUCTS_DIR; }; E37110DC90261325B51505B0D9E12A22 /* MASViewAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewAttribute.m; path = Masonry/MASViewAttribute.m; sourceTree = ""; }; E39B8E7552906AE7E96BB5214216A312 /* SJLabelSlider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SJLabelSlider.m; path = SJSlider/SJLabelSlider.m; sourceTree = ""; }; E53B1593AE73427C36854F3C7C06B09D /* NSArray+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+MASAdditions.m"; path = "Masonry/NSArray+MASAdditions.m"; sourceTree = ""; }; @@ -409,7 +409,7 @@ F1D0BCFAA1E954992243C778D67F48B5 /* SJCTImageData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJCTImageData.h; path = SJLabel/Services/SJCTImageData.h; sourceTree = ""; }; F1E8CDAAA16D7A435629A5F6DE798E52 /* SJVolBrigControl-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SJVolBrigControl-dummy.m"; sourceTree = ""; }; F2265B2D1F05DF892DFCC90551B8B796 /* SJCTFrameParserConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SJCTFrameParserConfig.m; path = SJLabel/Services/SJCTFrameParserConfig.m; sourceTree = ""; }; - F2ACAB5CB6B1BD8BA4B1DE87EDA4F979 /* libSJSlider.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSJSlider.a; sourceTree = BUILT_PRODUCTS_DIR; }; + F2ACAB5CB6B1BD8BA4B1DE87EDA4F979 /* libSJSlider.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSJSlider.a; path = libSJSlider.a; sourceTree = BUILT_PRODUCTS_DIR; }; F2B9993FA1D601630FC1A710F96F9FF6 /* NSArray+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASShorthandAdditions.h"; path = "Masonry/NSArray+MASShorthandAdditions.h"; sourceTree = ""; }; F42FA864323BA3EC42589A59EBE29FEF /* SJPrompt.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SJPrompt.h; path = SJPrompt/SJPrompt.h; sourceTree = ""; }; F7217B69539C7C8A2D36DD28172972C3 /* UIViewController+SJVideoPlayerAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+SJVideoPlayerAdd.m"; path = "SJFullscreenPopGesture/UIViewController+SJVideoPlayerAdd.m"; sourceTree = ""; }; @@ -643,6 +643,7 @@ A4871B93BE9EEA0FA2AA728942BC3645 /* SJBorderlineView.m */, 0B5B53254EEA31362A0DCD172A5B3762 /* Support Files */, ); + name = SJBorderLineView; path = SJBorderLineView; sourceTree = ""; }; @@ -707,6 +708,7 @@ 426705848444054FE5662DD11B2B13F7 /* ViewController+MASAdditions.m */, 70C274266A254A0BCDD8C5A07B3FD431 /* Support Files */, ); + name = Masonry; path = Masonry; sourceTree = ""; }; @@ -717,6 +719,7 @@ 0F1915EA3CF8CAA0EB38D569919C3225 /* SJLoadingView.m */, 43A14FECDD91667DF5FF18CF4D3C5697 /* Support Files */, ); + name = SJLoadingView; path = SJLoadingView; sourceTree = ""; }; @@ -758,6 +761,7 @@ 26DBA986FDD569732D641724080D006F /* Services */, 2D76A3A9BA04AB47393E4B03A26A3A19 /* Support Files */, ); + name = SJLabel; path = SJLabel; sourceTree = ""; }; @@ -774,6 +778,7 @@ 00AE983007A49599B53FEC608A130CE8 /* SJSlider.m */, FE502C1B264D97F7B37DFE123B9040AC /* Support Files */, ); + name = SJSlider; path = SJSlider; sourceTree = ""; }; @@ -795,6 +800,7 @@ EFAA9A3D2D8BD9BEBCF6236762ED29AD /* SJVideoPlayerAssetCarrier.m */, 17A80F008E0B5B6FE2652A276BA73A19 /* Support Files */, ); + name = SJVideoPlayerAssetCarrier; path = SJVideoPlayerAssetCarrier; sourceTree = ""; }; @@ -808,6 +814,7 @@ 884FC38BA65C4C70421DE989F96CEC85 /* Support Files */, 53FAF56FD41AC8D00E475F76B24AB19A /* View */, ); + name = SJFullscreenPopGesture; path = SJFullscreenPopGesture; sourceTree = ""; }; @@ -822,6 +829,7 @@ 4F3E0796188B31923CEC108504EAAB1D /* Resources */, A96AD8037A7BF516372E85D6D76F670F /* Support Files */, ); + name = SJVolBrigControl; path = SJVolBrigControl; sourceTree = ""; }; @@ -845,6 +853,7 @@ 8949BB5CED3F22F8B27BF4F9F00A4CF1 /* SJPromptConfig.m */, 94C37E7A58FBF34E3AF0F3C84219FDEB /* Support Files */, ); + name = SJPrompt; path = SJPrompt; sourceTree = ""; }; @@ -895,6 +904,7 @@ BB5FA106F10D19B9C557CE03C12023C5 /* NSObject+SJObserverHelper.m */, 1977AA9154000F2362DB858BEDAE4830 /* Support Files */, ); + name = SJObserverHelper; path = SJObserverHelper; sourceTree = ""; }; @@ -928,6 +938,7 @@ FEE7D8C258092F7AF35FE8025E0699E8 /* Category */, BBD7B40E485131B348B543B9AF1467E6 /* Support Files */, ); + name = SJOrentationObserver; path = SJOrentationObserver; sourceTree = ""; }; @@ -940,6 +951,7 @@ 68553CFA0F04B830E5E39020416FC048 /* SJAttributeWorker.m */, 9CAC9BDC8A2004A3F919CD7E304B36A4 /* Support Files */, ); + name = SJAttributesFactory; path = SJAttributesFactory; sourceTree = ""; }; @@ -978,6 +990,7 @@ 211BFC99D1DAC29F8B62189809B2981D /* Category */, F341D05413CE45DB2EDBF33834C39A83 /* Support Files */, ); + name = SJUIFactory; path = SJUIFactory; sourceTree = ""; }; @@ -1441,7 +1454,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0920; + LastUpgradeCheck = 0700; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -2318,7 +2331,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -2340,7 +2353,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/Masonry.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/Masonry.xcscheme index 612cee3f8..3dcb3523e 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/Masonry.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/Masonry.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = '9DC8D9E02903E93BD0B2FEC9D846EA20' + BlueprintName = 'Masonry' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libMasonry.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/Pods-SJVideoPlayerProject.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/Pods-SJVideoPlayerProject.xcscheme index 285382033..736cac0f3 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/Pods-SJVideoPlayerProject.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/Pods-SJVideoPlayerProject.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = '681A7E2206CBBE1655E1BE9773DB714A' + BlueprintName = 'Pods-SJVideoPlayerProject' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libPods-SJVideoPlayerProject.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJAttributesFactory.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJAttributesFactory.xcscheme index a7fa9641d..c60ecb63d 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJAttributesFactory.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJAttributesFactory.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = '2C4AB8A47A190E702B5200836890B5A8' + BlueprintName = 'SJAttributesFactory' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJAttributesFactory.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJBorderLineView.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJBorderLineView.xcscheme index 67e81c7c8..8639c2dd1 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJBorderLineView.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJBorderLineView.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = 'B06AE31044DD3A4143828641E45EBB59' + BlueprintName = 'SJBorderLineView' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJBorderLineView.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJFullscreenPopGesture.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJFullscreenPopGesture.xcscheme index a45ec3fc5..5e726eb27 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJFullscreenPopGesture.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJFullscreenPopGesture.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = '51C2E2F62BB398ECB0F961567735BEA9' + BlueprintName = 'SJFullscreenPopGesture' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJFullscreenPopGesture.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJLabel.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJLabel.xcscheme index 95e0b647f..7010c57ca 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJLabel.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJLabel.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = '24C744840C970DD3F6C2130A56E35FB1' + BlueprintName = 'SJLabel' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJLabel.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJLoadingView.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJLoadingView.xcscheme index cb1e32dfd..e7e7f3f3f 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJLoadingView.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJLoadingView.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = '79781C84E36484D5D89724F6D5238FA3' + BlueprintName = 'SJLoadingView' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJLoadingView.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJObserverHelper.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJObserverHelper.xcscheme index 12f511ac8..4c57c216b 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJObserverHelper.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJObserverHelper.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = '6EB27D14F209AFACEE1F8D7BE07D8BE4' + BlueprintName = 'SJObserverHelper' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJObserverHelper.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJOrentationObserver.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJOrentationObserver.xcscheme index 8d23b4e86..923ea76f8 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJOrentationObserver.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJOrentationObserver.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = 'FE44E821A80AA65196E766DA4F03BCA0' + BlueprintName = 'SJOrentationObserver' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJOrentationObserver.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJPrompt.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJPrompt.xcscheme index e64d15eb3..51b7c1a82 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJPrompt.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJPrompt.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = '1C86C323C58865DB6B53F4C376779262' + BlueprintName = 'SJPrompt' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJPrompt.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJSlider.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJSlider.xcscheme index ed89ec4e0..0dffcef62 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJSlider.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJSlider.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = 'CAF94487EFF89066C887A654EC5FFA89' + BlueprintName = 'SJSlider' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJSlider.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJUIFactory.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJUIFactory.xcscheme index 8988c8e78..3c8e44ac2 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJUIFactory.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJUIFactory.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = 'E1A9CD794C0DBD9D8F51C4A1661F9E7B' + BlueprintName = 'SJUIFactory' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJUIFactory.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJVideoPlayerAssetCarrier.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJVideoPlayerAssetCarrier.xcscheme index 98a0678a0..93303a2d6 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJVideoPlayerAssetCarrier.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJVideoPlayerAssetCarrier.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = 'E9FC91AC44289476DE28F1E3E8E85678' + BlueprintName = 'SJVideoPlayerAssetCarrier' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJVideoPlayerAssetCarrier.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJVolBrigControl.xcscheme b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJVolBrigControl.xcscheme index b7d040821..0e4c08bb3 100644 --- a/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJVolBrigControl.xcscheme +++ b/SJVideoPlayerProject/Pods/Pods.xcodeproj/xcuserdata/bluedancer.xcuserdatad/xcschemes/SJVolBrigControl.xcscheme @@ -1,67 +1,54 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = '6700DCBFF15C8033FE67EAF1733FADD3' + BlueprintName = 'SJVolBrigControl' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'libSJVolBrigControl.a'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/SJVideoPlayerProject/Pods/SJFullscreenPopGesture/README.md b/SJVideoPlayerProject/Pods/SJFullscreenPopGesture/README.md index 545cc5dfe..8c553b744 100644 --- a/SJVideoPlayerProject/Pods/SJFullscreenPopGesture/README.md +++ b/SJVideoPlayerProject/Pods/SJFullscreenPopGesture/README.md @@ -6,98 +6,90 @@ Fullscreen pop gesture. It is very suitable for the application of the video pla ```ruby pod 'SJFullscreenPopGesture' ``` +___ ### Features - Fullscreen Pop Gesture. Gestures are perfectly handled in UIScrollView And UIPageViewController. - Fade Area. The specified area does not trigger gestures. It does not affect other ViewControllers. - Disable Gesture. Designate ViewController disable pop gesture. It does not affect other ViewControllers. - WKWebView. +___ ### Example + +- _ + + +- WKWebView: - Please wait for the example load, or download the project directly. +___ + +### Disable Gesture -### Disable ```Objective-C // If you want to disable the gestures, you can do the same as below. It does not affect other ViewControllers. +// 1. `import header` #import "UIViewController+SJVideoPlayerAdd.h" - (void)viewDidLoad { [super viewDidLoad]; - + // 2. `set this property` self.sj_DisableGestures = YES; // 如果想在某个页面禁用全屏手势, 可以这样做. 不影响其他页面. 离开页面时, 也无需恢复. } ``` +___ + +### Consider WKWebView -### WKWebView ```Objective-C +// 1. `import header` #import "UIViewController+SJVideoPlayerAdd.h" - (void)viewDidLoad { [super viewDidLoad]; - // when this property is set, will be enabled system gesture to back last web page, until it can't go back. - self.sj_considerWebView = self.webView; + // 2. `set this property` + self.sj_considerWebView = self.webView; // when this property is set, will be enabled system gesture to back last web page, until it can't go back. 当设置这个属性后, 将会开启右滑返回上一个网页的手势. 最后才会触发全局pop手势. } ``` +___ ### Fade Area + ```Objective-C // If you want an area to not trigger gestures, you can do the same as below. It does not affect other ViewControllers. +// 1. `import header` #import "UIViewController+SJVideoPlayerAdd.h" - (void)viewDidLoad { [super viewDidLoad]; + // 2. `set this property` self.sj_fadeAreaViews = @[_btn, _view2]; // 如果想某个区域不触发手势, 可以这样做. // or self.sj_fadeArea = @[@(_btn.frame), @(_view2.frame)]; // 如果想某个区域不触发手势, 可以这样做. } ``` +___ + ### Common Method ```Objective-C @interface UIViewController (SJVideoPlayerAdd) @property (nonatomic, readonly) UIGestureRecognizerState sj_fullscreenGestureState; -/*! - * Consider `webview`. - * when this property is set, will be enabled system gesture to back last web page, until it can't go back. - * - * 考虑`webview`. 当设置此属性后, 将会`启用手势返回上一个网页`. - **/ @property (nonatomic, weak, readwrite, nullable) WKWebView *sj_considerWebView; -/*! - * The specified area does not trigger gestures. It does not affect other ViewControllers. - * In the array is subview frame. - * @[@(self.label.frame)] - * - * 指定区域不触发手势. see `sj_fadeAreaViews` method - **/ @property (nonatomic, strong, readwrite, nullable) NSArray *sj_fadeArea; -/*! - * The specified area does not trigger gestures. It does not affect other ViewControllers. - * In the array is subview. - * @[@(self.label)] - * - * 指定区域不触发手势. - **/ @property (nonatomic, strong, readwrite, nullable) NSArray *sj_fadeAreaViews; -/*! - * disable pop Gestures. default is NO. It does not affect other ViewControllers. - * - * 禁用全屏手势. 默认是 NO. - **/ @property (nonatomic, assign, readwrite) BOOL sj_DisableGestures; - @property (nonatomic, copy, readwrite, nullable) void(^sj_viewWillBeginDragging)(__kindof UIViewController *vc); + @property (nonatomic, copy, readwrite, nullable) void(^sj_viewDidDrag)(__kindof UIViewController *vc); + @property (nonatomic, copy, readwrite, nullable) void(^sj_viewDidEndDragging)(__kindof UIViewController *vc); @end ``` - -### 天朝 -https://juejin.im/post/5a150c166fb9a04524057832 +___ diff --git a/SJVideoPlayerProject/Pods/SJFullscreenPopGesture/SJFullscreenPopGesture/UINavigationController+SJVideoPlayerAdd.m b/SJVideoPlayerProject/Pods/SJFullscreenPopGesture/SJFullscreenPopGesture/UINavigationController+SJVideoPlayerAdd.m index cce875479..91052fc85 100644 --- a/SJVideoPlayerProject/Pods/SJFullscreenPopGesture/SJFullscreenPopGesture/UINavigationController+SJVideoPlayerAdd.m +++ b/SJVideoPlayerProject/Pods/SJFullscreenPopGesture/SJFullscreenPopGesture/UINavigationController+SJVideoPlayerAdd.m @@ -361,14 +361,7 @@ - (void)SJ_ViewWillBeginDragging { [self.view endEditing:YES]; // Move the `screenshot` to the bottom of the `obj`. - UIWindow *window = self.view.window; - [window.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - if ( [obj isMemberOfClass:NSClassFromString(@"UITransitionView")] || - [obj isMemberOfClass:NSClassFromString(@"UILayoutContainerView")] ) { - *stop = YES; - [window insertSubview:self.SJ_screenshotView belowSubview:obj]; - } - }]; + [self.view.superview insertSubview:self.SJ_screenshotView atIndex:0]; self.SJ_screenshotView.hidden = NO; [self.SJ_screenshotView beginTransitionWithSnapshot:self.SJ_snapshotsM.lastObject]; diff --git a/SJVideoPlayerProject/Pods/SJOrentationObserver/SJOrentationObserver/SJOrentationObserver.h b/SJVideoPlayerProject/Pods/SJOrentationObserver/SJOrentationObserver/SJOrentationObserver.h index a21c7203c..52777a4ac 100644 --- a/SJVideoPlayerProject/Pods/SJOrentationObserver/SJOrentationObserver/SJOrentationObserver.h +++ b/SJVideoPlayerProject/Pods/SJOrentationObserver/SJOrentationObserver/SJOrentationObserver.h @@ -5,6 +5,9 @@ // Created by BlueDancer on 2017/12/5. // Copyright © 2017年 SanJiang. All rights reserved. // +// https://github.com/changsanjiang/SJOrentationObserver +// changsanjiang@gmail.com +// #import diff --git a/SJVideoPlayerProject/Pods/SJOrentationObserver/SJOrentationObserver/SJOrentationObserver.m b/SJVideoPlayerProject/Pods/SJOrentationObserver/SJOrentationObserver/SJOrentationObserver.m index ebf048a55..15caae074 100644 --- a/SJVideoPlayerProject/Pods/SJOrentationObserver/SJOrentationObserver/SJOrentationObserver.m +++ b/SJVideoPlayerProject/Pods/SJOrentationObserver/SJOrentationObserver/SJOrentationObserver.m @@ -5,6 +5,9 @@ // Created by BlueDancer on 2017/12/5. // Copyright © 2017年 SanJiang. All rights reserved. // +// https://github.com/changsanjiang/SJOrentationObserver +// changsanjiang@gmail.com +// #import "SJOrentationObserver.h" #import @@ -68,12 +71,10 @@ - (void)setFullScreen:(BOOL)fullScreen { if ( self.isTransitioning ) return; - UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation; UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; if ( (UIDeviceOrientation)statusBarOrientation == deviceOrientation ) return; - _fullScreen = fullScreen; self.transitioning = YES; CGAffineTransform transform = CGAffineTransformIdentity; @@ -105,31 +106,29 @@ - (void)setFullScreen:(BOOL)fullScreen { self.transitioning = NO; return; } - - CGRect fix = _view.frame; - - if ( UIInterfaceOrientationPortrait != ori ) { + + [UIApplication sharedApplication].statusBarOrientation = ori; + + if ( !_fullScreen && UIInterfaceOrientationPortrait != ori ) { + CGRect fix = _view.frame; fix.origin = [[UIApplication sharedApplication].keyWindow convertPoint:CGPointZero fromView:_targetSuperview]; + [superview addSubview:_view]; + _view.frame = fix; } - else { - CGPoint point = [[UIApplication sharedApplication].keyWindow convertPoint:CGPointZero fromView:_targetSuperview]; - fix.origin = CGPointMake(-point.x, -point.y); - } - - _view.frame = fix; - [superview addSubview:_view]; - _view.translatesAutoresizingMaskIntoConstraints = NO; [_view mas_remakeConstraints:^(MASConstraintMaker *make) { if ( UIInterfaceOrientationPortrait == ori ) { - make.edges.equalTo(self.targetSuperview); + CGRect rect = [[UIApplication sharedApplication].keyWindow convertRect:self.targetSuperview.bounds fromView:self.targetSuperview]; + make.size.mas_equalTo(rect.size); + make.top.offset(rect.origin.y); + make.leading.offset(rect.origin.x); } else { CGFloat width = [UIScreen mainScreen].bounds.size.width; CGFloat height = [UIScreen mainScreen].bounds.size.height; CGFloat max = MAX(width, height); CGFloat min = MIN(width, height); - make.center.offset(0); + make.center.mas_equalTo(CGPointZero); make.size.mas_offset(CGSizeMake(max, min)); } }]; @@ -137,13 +136,19 @@ - (void)setFullScreen:(BOOL)fullScreen { if ( _orientationWillChange ) _orientationWillChange(self); [UIView animateWithDuration:_duration animations:^{ - _view.transform = transform; + [_view setTransform:transform]; [_view.superview layoutIfNeeded]; } completion:^(BOOL finished) { self.transitioning = NO; + _fullScreen = fullScreen; + if ( UIInterfaceOrientationPortrait == ori ) { + [superview addSubview:_view]; + [_view mas_remakeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.targetSuperview); + }]; + } if ( _orientationChanged ) _orientationChanged(self); }]; - [[UIApplication sharedApplication] setStatusBarOrientation:ori animated:YES]; } - (BOOL)_changeOrientation { @@ -162,4 +167,3 @@ - (BOOL)_changeOrientation { } @end - diff --git a/SJVideoPlayerProject/SJVideoPlayerProject.xcodeproj/project.pbxproj b/SJVideoPlayerProject/SJVideoPlayerProject.xcodeproj/project.pbxproj index 66ba7da6b..a6561e50d 100644 --- a/SJVideoPlayerProject/SJVideoPlayerProject.xcodeproj/project.pbxproj +++ b/SJVideoPlayerProject/SJVideoPlayerProject.xcodeproj/project.pbxproj @@ -55,7 +55,6 @@ A6441092200A3FA9006FD832 /* SJVideoListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A6441091200A3FA9006FD832 /* SJVideoListViewController.m */; }; A6441095200A3FBA006FD832 /* SJVideoListTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A6441094200A3FBA006FD832 /* SJVideoListTableViewCell.m */; }; A6441098200A406E006FD832 /* SJVideoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A6441097200A406E006FD832 /* SJVideoModel.m */; }; - A644109D200A74FA006FD832 /* table2.gif in Resources */ = {isa = PBXBuildFile; fileRef = A644109C200A74FA006FD832 /* table2.gif */; }; A6F4E9742007A12400716B9C /* PlayerCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A6F4E9732007A12400716B9C /* PlayerCollectionViewController.m */; }; A6F4E9772007A13C00716B9C /* PlayerCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A6F4E9762007A13C00716B9C /* PlayerCollectionViewCell.m */; }; A6F4E97B2007A78400716B9C /* NestedTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A6F4E97A2007A78400716B9C /* NestedTableViewController.m */; }; @@ -154,7 +153,6 @@ A6441094200A3FBA006FD832 /* SJVideoListTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SJVideoListTableViewCell.m; sourceTree = ""; }; A6441096200A406E006FD832 /* SJVideoModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SJVideoModel.h; sourceTree = ""; }; A6441097200A406E006FD832 /* SJVideoModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SJVideoModel.m; sourceTree = ""; }; - A644109C200A74FA006FD832 /* table2.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = table2.gif; sourceTree = ""; }; A6F4E9722007A12400716B9C /* PlayerCollectionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlayerCollectionViewController.h; sourceTree = ""; }; A6F4E9732007A12400716B9C /* PlayerCollectionViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlayerCollectionViewController.m; sourceTree = ""; }; A6F4E9752007A13C00716B9C /* PlayerCollectionViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlayerCollectionViewCell.h; sourceTree = ""; }; @@ -425,7 +423,6 @@ children = ( 776F3BDE2015967700C23949 /* preview.gif */, 77A47E8B2008DEBE001EBE14 /* nested.gif */, - A644109C200A74FA006FD832 /* table2.gif */, 77B795781FFF6B9F000D8F6C /* test1.png */, 77EDB3581FD2CA550075A014 /* sample.mp4 */, 774B25211FCEBA5D002113CC /* Main.storyboard */, @@ -584,7 +581,6 @@ 774B25281FCEBA5D002113CC /* LaunchScreen.storyboard in Resources */, 777D30D71FD8E8240075E5FD /* SJVideoPlayer.podspec in Resources */, 77B795791FFF6B9F000D8F6C /* test1.png in Resources */, - A644109D200A74FA006FD832 /* table2.gif in Resources */, 777D315A1FD8F0010075E5FD /* SJVideoPlayer.bundle in Resources */, 776F3BDF2015967700C23949 /* preview.gif in Resources */, 774B25251FCEBA5D002113CC /* Assets.xcassets in Resources */, diff --git a/SJVideoPlayerProject/SJVideoPlayerProject.xcworkspace/xcuserdata/bluedancer.xcuserdatad/UserInterfaceState.xcuserstate b/SJVideoPlayerProject/SJVideoPlayerProject.xcworkspace/xcuserdata/bluedancer.xcuserdatad/UserInterfaceState.xcuserstate index 660eb5dc7..88b72c698 100644 Binary files a/SJVideoPlayerProject/SJVideoPlayerProject.xcworkspace/xcuserdata/bluedancer.xcuserdatad/UserInterfaceState.xcuserstate and b/SJVideoPlayerProject/SJVideoPlayerProject.xcworkspace/xcuserdata/bluedancer.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/SJVideoPlayerProject/SJVideoPlayerProject.xcworkspace/xcuserdata/bluedancer.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/SJVideoPlayerProject/SJVideoPlayerProject.xcworkspace/xcuserdata/bluedancer.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index ed9a9b4d4..e2573a594 100644 --- a/SJVideoPlayerProject/SJVideoPlayerProject.xcworkspace/xcuserdata/bluedancer.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/SJVideoPlayerProject/SJVideoPlayerProject.xcworkspace/xcuserdata/bluedancer.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -2,4 +2,16 @@ + + + + + + diff --git a/SJVideoPlayerProject/SJVideoPlayerProject/Nested_Demo/NestedTableViewController.m b/SJVideoPlayerProject/SJVideoPlayerProject/Nested_Demo/NestedTableViewController.m index bcfc72177..a5cd3809f 100644 --- a/SJVideoPlayerProject/SJVideoPlayerProject/Nested_Demo/NestedTableViewController.m +++ b/SJVideoPlayerProject/SJVideoPlayerProject/Nested_Demo/NestedTableViewController.m @@ -97,17 +97,20 @@ - (void)clickedPlayWithNestedTabCell:(NestedTableViewCell *)tabCell // create asset NSURL *playURL = [NSURL URLWithString:@"http://blurdancer-video.oss-cn-shanghai.aliyuncs.com/usertrend/120718-1515947072.mp4"]; + + NSIndexPath *embeddedScrollViewIndexPath = [self.tableView indexPathForCell:tabCell]; + UIView *embeddedScrollView = collectionView; _videoPlayer.asset = [[SJVideoPlayerAssetCarrier alloc] initWithAssetURL:playURL indexPath:indexPath superviewTag:playerParentView.tag - scrollViewIndexPath:[self.tableView indexPathForCell:tabCell] - scrollViewTag:collectionView.tag + scrollViewIndexPath:embeddedScrollViewIndexPath + scrollViewTag:embeddedScrollView.tag rootScrollView:self.tableView]; // setting player __weak typeof(self) _self = self; - _videoPlayer.rotatedScreen = ^(SJVideoPlayer * _Nonnull player, BOOL isFullScreen) { + _videoPlayer.willRotateScreen = ^(SJVideoPlayer * _Nonnull player, BOOL isFullScreen) { __strong typeof(_self) self = _self; if ( !self ) return ; [self setNeedsStatusBarAppearanceUpdate]; diff --git a/SJVideoPlayerProject/SJVideoPlayerProject/TableView_Demo/Controller/SJVideoListViewController.m b/SJVideoPlayerProject/SJVideoPlayerProject/TableView_Demo/Controller/SJVideoListViewController.m index 6cb3c43bf..22072b03c 100644 --- a/SJVideoPlayerProject/SJVideoPlayerProject/TableView_Demo/Controller/SJVideoListViewController.m +++ b/SJVideoPlayerProject/SJVideoPlayerProject/TableView_Demo/Controller/SJVideoListViewController.m @@ -126,10 +126,18 @@ - (void)clickedPlayOnTabCell:(SJVideoListTableViewCell *)cell playerParentView:( make.edges.offset(0); }]; + _videoPlayer.generatePreviewImages = NO; + // setting player __weak typeof(self) _self = self; - // Call when the control view is hidden or displayed. + _videoPlayer.willRotateScreen = ^(SJVideoPlayer * _Nonnull player, BOOL isFullScreen) { + __strong typeof(_self) self = _self; + if ( !self ) return ; + [self setNeedsStatusBarAppearanceUpdate]; + }; + + // Call when the `control view` is `hidden` or `displayed`. _videoPlayer.controlViewDisplayStatus = ^(SJVideoPlayer * _Nonnull player, BOOL displayed) { __strong typeof(_self) self = _self; if ( !self ) return; @@ -149,6 +157,13 @@ - (void)clickedPlayOnTabCell:(SJVideoListTableViewCell *)cell playerParentView:( superviewTag:playerParentView.tag]; } +#pragma mark - + +- (BOOL)prefersStatusBarHidden { + // 全屏播放时, 使状态栏根据控制层显示或隐藏 + if ( _videoPlayer.isFullScreen ) return !_videoPlayer.controlViewDisplayed; + return NO; +} - (UIStatusBarStyle)preferredStatusBarStyle { // 全屏播放时, 使状态栏变成白色 diff --git a/SJVideoPlayerProject/SJVideoPlayerProject/TableView_Demo/View/SJVideoListTableViewCell.m b/SJVideoPlayerProject/SJVideoPlayerProject/TableView_Demo/View/SJVideoListTableViewCell.m index 3eab14d82..441cba90b 100644 --- a/SJVideoPlayerProject/SJVideoPlayerProject/TableView_Demo/View/SJVideoListTableViewCell.m +++ b/SJVideoPlayerProject/SJVideoPlayerProject/TableView_Demo/View/SJVideoListTableViewCell.m @@ -159,7 +159,7 @@ - (void)_setupViews { [_nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.equalTo(_avatarImageView.mas_trailing).offset(8); make.bottom.equalTo(_avatarImageView.mas_centerY); - make.trailing.equalTo(_attentionBtn.mas_leadingMargin); + make.trailing.equalTo(_attentionBtn.mas_leading).offset(-8); }]; [_createTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) { diff --git a/SJVideoPlayerProject/SJVideoPlayerProject/table2.gif b/SJVideoPlayerProject/SJVideoPlayerProject/table2.gif deleted file mode 100644 index 4767c5973..000000000 Binary files a/SJVideoPlayerProject/SJVideoPlayerProject/table2.gif and /dev/null differ diff --git a/SJVideoPlayerProject/SJVideoPlayerProject/test1.png b/SJVideoPlayerProject/SJVideoPlayerProject/test1.png index 3e4abf2f3..a4d992a2a 100644 Binary files a/SJVideoPlayerProject/SJVideoPlayerProject/test1.png and b/SJVideoPlayerProject/SJVideoPlayerProject/test1.png differ