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