Commit a10978c702c4ed815318e4d5342d50c0f099edfb

Authored by 张旭
2 parents 818e3f0e a806b970

Merge branch 'master' of bj.gitlab.cnlive.com:ios-team/LiveVideoCloud

# Conflicts:
#	LiveVideoCloud.xcodeproj/xcuserdata/cnlive.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
Showing 33 changed files with 1134 additions and 25 deletions
LiveVideoCloud.xcodeproj/project.pbxproj
... ... @@ -76,8 +76,6 @@
76 76 810B65061E779B1F00133E15 /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 810B64FA1E779B1F00133E15 /* View+MASAdditions.m */; };
77 77 810B65071E779B1F00133E15 /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 810B64FD1E779B1F00133E15 /* ViewController+MASAdditions.m */; };
78 78 811BB68E1E8116C8005C6291 /* NSString+StringSize.m in Sources */ = {isa = PBXBuildFile; fileRef = 811BB68D1E8116C8005C6291 /* NSString+StringSize.m */; };
79   - 8178D4171F01FA2900AA78A4 /* CNLivePlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8178D4161F01FA2900AA78A4 /* CNLivePlayerSDK.framework */; };
80   - 8178D4191F01FA3600AA78A4 /* CNLivePlayerSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8178D4161F01FA2900AA78A4 /* CNLivePlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
81 79 8178D4241F02043500AA78A4 /* LVCFullScreenPlayerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8178D41F1F02043500AA78A4 /* LVCFullScreenPlayerController.m */; };
82 80 8178D4251F02043500AA78A4 /* LVCLivePlayerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8178D4211F02043500AA78A4 /* LVCLivePlayerController.m */; };
83 81 8178D4311F02044300AA78A4 /* LVCChatRoomModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8178D42C1F02044300AA78A4 /* LVCChatRoomModel.m */; };
... ... @@ -236,10 +234,6 @@
236 234 D2888D941E6EB8B4003A77C8 /* LVCTabBar.m in Sources */ = {isa = PBXBuildFile; fileRef = D2888D931E6EB8B4003A77C8 /* LVCTabBar.m */; };
237 235 D2888D9E1E6EBF1B003A77C8 /* LVCLiveViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2888D9B1E6EBF1B003A77C8 /* LVCLiveViewController.m */; };
238 236 D2888DB11E6EC05F003A77C8 /* TempViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2888DB01E6EC05F003A77C8 /* TempViewController.m */; };
239   - D2994BA81E8F490400E8D2CC /* CNLiveChatManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2994BA41E8F48DE00E8D2CC /* CNLiveChatManager.framework */; };
240   - D2994BA91E8F490400E8D2CC /* CNLiveChatManager.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D2994BA41E8F48DE00E8D2CC /* CNLiveChatManager.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
241   - D2994BAA1E8F490700E8D2CC /* CNLiveMsgTools.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2994BA51E8F48DE00E8D2CC /* CNLiveMsgTools.framework */; };
242   - D2994BAB1E8F490700E8D2CC /* CNLiveMsgTools.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D2994BA51E8F48DE00E8D2CC /* CNLiveMsgTools.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
243 237 D29D88481E88C53300543A03 /* LVCUGCLivePrepareView.m in Sources */ = {isa = PBXBuildFile; fileRef = D29D88471E88C53300543A03 /* LVCUGCLivePrepareView.m */; };
244 238 D29E81ED1E88DC5B008C9906 /* PriChatCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D29E81EC1E88DC5B008C9906 /* PriChatCell.m */; };
245 239 D2A803081E80BD6F009D6F1C /* TopToolView.m in Sources */ = {isa = PBXBuildFile; fileRef = D2A803071E80BD6F009D6F1C /* TopToolView.m */; };
... ... @@ -262,6 +256,15 @@
262 256 D2EBC8881F0225D900F198FB /* LVCVodPlayerListController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2EBC8871F0225D900F198FB /* LVCVodPlayerListController.m */; };
263 257 D2EBC88B1F02361600F198FB /* LVCUGCLiveListView.m in Sources */ = {isa = PBXBuildFile; fileRef = D2EBC88A1F02361600F198FB /* LVCUGCLiveListView.m */; };
264 258 D2EBC88E1F023AA400F198FB /* LVCVodPlayerController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2EBC88D1F023AA400F198FB /* LVCVodPlayerController.m */; };
  259 + D2EBC8961F0241BC00F198FB /* CNLiveMsgTools.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D2EBC88F1F0241AD00F198FB /* CNLiveMsgTools.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
  260 + D2EBC8991F025D4700F198FB /* LVCVodPlayerFullController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2EBC8981F025D4700F198FB /* LVCVodPlayerFullController.m */; };
  261 + D2EBC89B1F03421C00F198FB /* CNLiveChatManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2EBC89A1F03421C00F198FB /* CNLiveChatManager.framework */; };
  262 + D2EBC89C1F03428700F198FB /* CNLiveChatManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2EBC89A1F03421C00F198FB /* CNLiveChatManager.framework */; };
  263 + D2EBC89D1F03428700F198FB /* CNLiveChatManager.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D2EBC89A1F03421C00F198FB /* CNLiveChatManager.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
  264 + D2EBC8A01F034C5500F198FB /* LVCCommentView.m in Sources */ = {isa = PBXBuildFile; fileRef = D2EBC89F1F034C5500F198FB /* LVCCommentView.m */; };
  265 + D2EBC8A21F034F3C00F198FB /* CNLivePlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2EBC8A11F034F3C00F198FB /* CNLivePlayerSDK.framework */; };
  266 + D2EBC8A31F034F4000F198FB /* CNLivePlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2EBC8A11F034F3C00F198FB /* CNLivePlayerSDK.framework */; };
  267 + D2EBC8A41F034F4000F198FB /* CNLivePlayerSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D2EBC8A11F034F3C00F198FB /* CNLivePlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
265 268 /* End PBXBuildFile section */
266 269  
267 270 /* Begin PBXContainerItemProxy section */
... ... @@ -288,9 +291,9 @@
288 291 dstPath = "";
289 292 dstSubfolderSpec = 10;
290 293 files = (
291   - 8178D4191F01FA3600AA78A4 /* CNLivePlayerSDK.framework in Embed Frameworks */,
292   - D2994BA91E8F490400E8D2CC /* CNLiveChatManager.framework in Embed Frameworks */,
293   - D2994BAB1E8F490700E8D2CC /* CNLiveMsgTools.framework in Embed Frameworks */,
  294 + D2EBC8A41F034F4000F198FB /* CNLivePlayerSDK.framework in Embed Frameworks */,
  295 + D2EBC8961F0241BC00F198FB /* CNLiveMsgTools.framework in Embed Frameworks */,
  296 + D2EBC89D1F03428700F198FB /* CNLiveChatManager.framework in Embed Frameworks */,
294 297 );
295 298 name = "Embed Frameworks";
296 299 runOnlyForDeploymentPostprocessing = 0;
... ... @@ -445,7 +448,6 @@
445 448 810B64FD1E779B1F00133E15 /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ViewController+MASAdditions.m"; sourceTree = "<group>"; };
446 449 811BB68C1E8116C8005C6291 /* NSString+StringSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+StringSize.h"; sourceTree = "<group>"; };
447 450 811BB68D1E8116C8005C6291 /* NSString+StringSize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+StringSize.m"; sourceTree = "<group>"; };
448   - 8178D4161F01FA2900AA78A4 /* CNLivePlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLivePlayerSDK.framework; sourceTree = "<group>"; };
449 451 8178D41E1F02043500AA78A4 /* LVCFullScreenPlayerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCFullScreenPlayerController.h; sourceTree = "<group>"; };
450 452 8178D41F1F02043500AA78A4 /* LVCFullScreenPlayerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCFullScreenPlayerController.m; sourceTree = "<group>"; };
451 453 8178D4201F02043500AA78A4 /* LVCLivePlayerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCLivePlayerController.h; sourceTree = "<group>"; };
... ... @@ -769,8 +771,6 @@
769 771 D2888D9B1E6EBF1B003A77C8 /* LVCLiveViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCLiveViewController.m; sourceTree = "<group>"; };
770 772 D2888DAF1E6EC05F003A77C8 /* TempViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TempViewController.h; sourceTree = "<group>"; };
771 773 D2888DB01E6EC05F003A77C8 /* TempViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TempViewController.m; sourceTree = "<group>"; };
772   - D2994BA41E8F48DE00E8D2CC /* CNLiveChatManager.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveChatManager.framework; sourceTree = "<group>"; };
773   - D2994BA51E8F48DE00E8D2CC /* CNLiveMsgTools.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveMsgTools.framework; sourceTree = "<group>"; };
774 774 D29D88461E88C53300543A03 /* LVCUGCLivePrepareView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCUGCLivePrepareView.h; sourceTree = "<group>"; };
775 775 D29D88471E88C53300543A03 /* LVCUGCLivePrepareView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCUGCLivePrepareView.m; sourceTree = "<group>"; };
776 776 D29E81EB1E88DC5B008C9906 /* PriChatCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PriChatCell.h; sourceTree = "<group>"; };
... ... @@ -814,6 +814,13 @@
814 814 D2EBC88A1F02361600F198FB /* LVCUGCLiveListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCUGCLiveListView.m; sourceTree = "<group>"; };
815 815 D2EBC88C1F023AA400F198FB /* LVCVodPlayerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCVodPlayerController.h; sourceTree = "<group>"; };
816 816 D2EBC88D1F023AA400F198FB /* LVCVodPlayerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCVodPlayerController.m; sourceTree = "<group>"; };
  817 + D2EBC88F1F0241AD00F198FB /* CNLiveMsgTools.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveMsgTools.framework; sourceTree = "<group>"; };
  818 + D2EBC8971F025D4700F198FB /* LVCVodPlayerFullController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCVodPlayerFullController.h; sourceTree = "<group>"; };
  819 + D2EBC8981F025D4700F198FB /* LVCVodPlayerFullController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCVodPlayerFullController.m; sourceTree = "<group>"; };
  820 + D2EBC89A1F03421C00F198FB /* CNLiveChatManager.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveChatManager.framework; sourceTree = "<group>"; };
  821 + D2EBC89E1F034C5500F198FB /* LVCCommentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCCommentView.h; sourceTree = "<group>"; };
  822 + D2EBC89F1F034C5500F198FB /* LVCCommentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCCommentView.m; sourceTree = "<group>"; };
  823 + D2EBC8A11F034F3C00F198FB /* CNLivePlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLivePlayerSDK.framework; sourceTree = "<group>"; };
817 824 /* End PBXFileReference section */
818 825  
819 826 /* Begin PBXFrameworksBuildPhase section */
... ... @@ -827,14 +834,15 @@
827 834 D2393D241F0256E900D3EE17 /* libz.tbd in Frameworks */,
828 835 D2393D221F0256DC00D3EE17 /* libc++.tbd in Frameworks */,
829 836 D2393D201F0256AA00D3EE17 /* libsqlite3.tbd in Frameworks */,
  837 + D2EBC89B1F03421C00F198FB /* CNLiveChatManager.framework in Frameworks */,
830 838 D25BF8A31E80C4FC007FB138 /* Accelerate.framework in Frameworks */,
831   - 8178D4171F01FA2900AA78A4 /* CNLivePlayerSDK.framework in Frameworks */,
  839 + D2EBC89C1F03428700F198FB /* CNLiveChatManager.framework in Frameworks */,
  840 + D2EBC8A31F034F4000F198FB /* CNLivePlayerSDK.framework in Frameworks */,
832 841 D2393D0E1F0250A100D3EE17 /* libWeChatSDK.a in Frameworks */,
833 842 D2393D1D1F0250A700D3EE17 /* libWeiboSDK.a in Frameworks */,
834 843 D2575C7D1E76A4F300E3A8FC /* NHGiftAnimtionSDK.a in Frameworks */,
835   - D2994BAA1E8F490700E8D2CC /* CNLiveMsgTools.framework in Frameworks */,
836 844 D2393D071F02505400D3EE17 /* TencentOpenAPI.framework in Frameworks */,
837   - D2994BA81E8F490400E8D2CC /* CNLiveChatManager.framework in Frameworks */,
  845 + D2EBC8A21F034F3C00F198FB /* CNLivePlayerSDK.framework in Frameworks */,
838 846 );
839 847 runOnlyForDeploymentPostprocessing = 0;
840 848 };
... ... @@ -1094,10 +1102,10 @@
1094 1102 812E504E1E7699B9004F5FCD /* CNLiveSDK */ = {
1095 1103 isa = PBXGroup;
1096 1104 children = (
  1105 + D2EBC8A11F034F3C00F198FB /* CNLivePlayerSDK.framework */,
  1106 + D2EBC89A1F03421C00F198FB /* CNLiveChatManager.framework */,
  1107 + D2EBC88F1F0241AD00F198FB /* CNLiveMsgTools.framework */,
1097 1108 D2393D2B1F02682000D3EE17 /* CNLiveUserSystemSDK.framework */,
1098   - 8178D4161F01FA2900AA78A4 /* CNLivePlayerSDK.framework */,
1099   - D2994BA41E8F48DE00E8D2CC /* CNLiveChatManager.framework */,
1100   - D2994BA51E8F48DE00E8D2CC /* CNLiveMsgTools.framework */,
1101 1109 D25BF87C1E7B8C78007FB138 /* KSYGPUResource.bundle */,
1102 1110 );
1103 1111 path = CNLiveSDK;
... ... @@ -2095,6 +2103,8 @@
2095 2103 D2EBC8871F0225D900F198FB /* LVCVodPlayerListController.m */,
2096 2104 D2EBC88C1F023AA400F198FB /* LVCVodPlayerController.h */,
2097 2105 D2EBC88D1F023AA400F198FB /* LVCVodPlayerController.m */,
  2106 + D2EBC8971F025D4700F198FB /* LVCVodPlayerFullController.h */,
  2107 + D2EBC8981F025D4700F198FB /* LVCVodPlayerFullController.m */,
2098 2108 );
2099 2109 path = Controller;
2100 2110 sourceTree = "<group>";
... ... @@ -2102,6 +2112,8 @@
2102 2112 D2888DAA1E6EC014003A77C8 /* View */ = {
2103 2113 isa = PBXGroup;
2104 2114 children = (
  2115 + D2EBC89E1F034C5500F198FB /* LVCCommentView.h */,
  2116 + D2EBC89F1F034C5500F198FB /* LVCCommentView.m */,
2105 2117 );
2106 2118 path = View;
2107 2119 sourceTree = "<group>";
... ... @@ -2374,6 +2386,7 @@
2374 2386 D29E81ED1E88DC5B008C9906 /* PriChatCell.m in Sources */,
2375 2387 D2029CD01E6EADE10027CD92 /* SearchPresenter.m in Sources */,
2376 2388 D2029CBE1E6EADE10027CD92 /* SDWebImagePrefetcher.m in Sources */,
  2389 + D2EBC8991F025D4700F198FB /* LVCVodPlayerFullController.m in Sources */,
2377 2390 D2A803081E80BD6F009D6F1C /* TopToolView.m in Sources */,
2378 2391 D2B7B2571E8261EF00ED084E /* ChatBarrOperation.m in Sources */,
2379 2392 D209AD6B1EC580F100D82E3B /* LVCWebViewController.m in Sources */,
... ... @@ -2530,6 +2543,7 @@
2530 2543 D2029CCF1E6EADE10027CD92 /* SearchHttp.m in Sources */,
2531 2544 810B65001E779B1F00133E15 /* MASConstraintMaker.m in Sources */,
2532 2545 8178D4711F0239AD00AA78A4 /* LVCPlayerLoadingView.m in Sources */,
  2546 + D2EBC8A01F034C5500F198FB /* LVCCommentView.m in Sources */,
2533 2547 D245715C1E83A62B00AA85D6 /* BounceView.m in Sources */,
2534 2548 D2029D021E6EAE2E0027CD92 /* UIImage+ScaleImageSize.m in Sources */,
2535 2549 D2029BCC1E6EADD70027CD92 /* BaseView.m in Sources */,
... ...
LiveVideoCloud/AppDelegate/AppDelegate.m
... ... @@ -26,7 +26,7 @@
26 26 [[CNLiveWebcastManager manager] initWithAppId:UserAppId appKey:UserAppKey isTestEnvironment:YES];
27 27  
28 28 //初始化聊天SDK并连接服务器
29   - [[CNLiveChatManager sharedCNLiveChatManager] initWithAppKey:UserAppKey appId:UserAppId ];
  29 + [[CNLiveChatManager sharedCNLiveChatManager] initWithAppKey:UserAppKey appId:UserAppId isTestEnvironment:YES];
30 30  
31 31 //初始化用户SDK
32 32 [CNLiveUserSystemCenter setAppId:UserAppId appKey:UserAppKey appSecret:UserAppSceret isTestEnvironment:YES];
... ... @@ -45,7 +45,9 @@
45 45  
46 46 // 20170327 20170328
47 47  
  48 +
48 49 CNLiveChatUserInfo *userInfo = [[CNLiveChatUserInfo alloc] initWithUserId:@"20170328ll" name:@"20170328" portrait:@""];
  50 +
49 51 [[CNLiveChatManager sharedCNLiveChatManager] loginServer:userInfo success:^(NSString *userId) {
50 52 NSLog(@"连接服务器-----success");
51 53  
... ...
LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/CNLiveChatManager
No preview for this file type
LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Headers/CNLiveChatManager.h
... ... @@ -57,6 +57,12 @@
57 57  
58 58 @interface CNLiveChatManager : NSObject
59 59  
  60 +
  61 +/**
  62 + 是否是测试环境
  63 + */
  64 +@property (nonatomic, readonly, assign) BOOL isTestEnvironment;
  65 +
60 66 /**
61 67 聊天SDK代理,设置代理后,实现代理方法。
62 68 */
... ... @@ -75,7 +81,7 @@
75 81  
76 82 @return SDK版本号
77 83 */
78   -+ (NSString *)getVersion;
  84 ++ (NSString *)getCNLiveChatVersion;
79 85  
80 86  
81 87 /**
... ... @@ -101,6 +107,19 @@
101 107  
102 108  
103 109 /**
  110 + 初始化SDK方法
  111 +
  112 + @param appKey 从视讯云平台获取到的appKey
  113 + @param appId 从视讯云平台获取到的appId
  114 + @param isTestEnvironment 是否是测试环境
  115 + @warning 必传参数
  116 + @discussion 您在使用聊天SDK所有功能之前,您必须先调用此方法初始化SDK。
  117 + 在App整个生命周期中,您只需要执行一次初始化。
  118 + */
  119 +- (void)initWithAppKey:(NSString *)appKey appId:(NSString *)appId isTestEnvironment:(BOOL)isTestEnvironment;
  120 +
  121 +
  122 +/**
104 123 连接到视讯云服务器
105 124  
106 125 @param successBlock 连接建立成功的回调。
... ... @@ -219,5 +238,15 @@
219 238 targetId:(NSString *)targetId
220 239 count:(int)count;
221 240  
  241 +/**
  242 +获取聊天室成员人数
  243 +
  244 +@param targetId 聊天室ID
  245 +@param successBlock 成功回调,返回聊天室成员数量
  246 +@param errorBlock 失败回调,返回错误代码
  247 +*/
  248 +- (void)getChatRoomInfo:(NSString *)targetId
  249 + success:(void (^)(int totalMemberCount))successBlock
  250 + error:(void (^)(CNLiveChatErrorCode status))errorBlock;
222 251  
223 252 @end
... ...
LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Headers/CNLiveCommentCountResult.h 0 → 100644
  1 +//
  2 +// CNLiveCommentCountResult.h
  3 +// CNLiveChatManager
  4 +//
  5 +// Created by cnliveJunBo on 17/6/7.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +@interface CNLiveCommentCountResult : NSObject
  12 +
  13 +@property (nonatomic, copy) NSString *count;
  14 +
  15 +@property (nonatomic, copy) NSString *programId;
  16 +
  17 +@end
... ...
LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Headers/CNLiveCommentDetailInfoResult.h 0 → 100644
  1 +//
  2 +// CNLiveCommentDetailInfoResult.h
  3 +// CNLiveChatManagerSDKDemo
  4 +//
  5 +// Created by cnliveJunBo on 17/6/6.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +@interface CNLiveCommentDetailInfoResult : NSObject
  12 +
  13 +// 评论ID
  14 +@property (nonatomic, copy) NSString *commentId;
  15 +// 节目ID
  16 +@property (nonatomic, copy) NSString *pid;
  17 +// 用户ID
  18 +@property (nonatomic, copy) NSString *uid;
  19 +// 昵称
  20 +@property (nonatomic, copy) NSString *nick;
  21 +// 评论者头像
  22 +@property (nonatomic, copy) NSString *facepath;
  23 +// 评论内容
  24 +@property (nonatomic, copy) NSString *content;
  25 +// 评论时间
  26 +@property (nonatomic, copy) NSString *created_at;
  27 +// 点赞数
  28 +@property (nonatomic, copy) NSString *praise;
  29 +
  30 +@end
... ...
LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Headers/CNLiveCommentListResult.h 0 → 100644
  1 +//
  2 +// CNLiveCommentListResult.h
  3 +// CNLiveChatManagerSDKDemo
  4 +//
  5 +// Created by cnliveJunBo on 17/6/6.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#import "CNLiveCommentDetailInfoResult.h"
  11 +
  12 +@interface CNLiveCommentListResult : NSObject
  13 +
  14 +// 下一页
  15 +@property (nonatomic, copy) NSString *next_cursor;
  16 +// 上一页
  17 +@property (nonatomic, copy) NSString *previous_cursor;
  18 +// 总页数
  19 +@property (nonatomic, copy) NSString *total_number;
  20 +// 总条数
  21 +@property (nonatomic, copy) NSString *total_columns;
  22 +// 评论详情数组
  23 +@property (nonatomic, strong) NSArray <CNLiveCommentDetailInfoResult *> *comments;
  24 +
  25 +@end
... ...
LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Headers/CNLiveCommentManager.h 0 → 100644
  1 +//
  2 +// CNLiveCommentManager.h
  3 +// CNLiveChatManager
  4 +//
  5 +// Created by cnliveJunBo on 17/6/6.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#import "CNLiveCommentListResult.h"
  11 +#import "CNLiveCommentCountResult.h"
  12 +
  13 +@interface CNLiveCommentManager : NSObject
  14 +
  15 +/**
  16 + 是否是测试环境
  17 + */
  18 +@property (nonatomic, readonly, assign) BOOL isTestEnvironment;
  19 +
  20 +/**
  21 + 获取SDK版本号
  22 +
  23 + @return SDK版本号
  24 + */
  25 ++ (NSString *)getCNLiveCommentVersion;
  26 +
  27 +
  28 +/**
  29 + 获取视讯评论核心类单例
  30 +
  31 + @return 视讯评论核心类单例
  32 +
  33 + @discussion 您可以通过此方法,获取视讯评论的单例,访问对象中的属性和方法。
  34 + */
  35 ++ (instancetype)sharedCNLiveCommentManager;
  36 +
  37 +
  38 +/**
  39 + 注册视讯评论
  40 +
  41 + @param appId 从视讯云平台获取到的appId
  42 + @param appKey 从视讯云平台获取到的appKey
  43 + */
  44 +- (void)registerWithAppId:(NSString *)appId appKey:(NSString *)appKey;
  45 +
  46 +
  47 +/**
  48 + 注册视讯评论
  49 +
  50 + @param appId 从视讯云平台获取到的appId
  51 + @param appKey 从视讯云平台获取到的appKey
  52 + @param isTestEnvironment 是否是测试环境,YES是测试环境,NO是上线环境
  53 + */
  54 +- (void)registerWithAppId:(NSString *)appId appKey:(NSString *)appKey isTestEnvironment:(BOOL)isTestEnvironment;
  55 +
  56 +/**
  57 + 获取评论列表
  58 +
  59 + @param programId 节目ID
  60 + @param page 页号
  61 + @param pageSize 每页显示的条数
  62 + @param successBlock 获取列表成功回调
  63 + @param errorBlock 获取列表失败回调
  64 + */
  65 +- (void)getCommentListWithProgramId:(NSString *)programId
  66 + page:(NSString *)page
  67 + pageSize:(NSString *)pageSize
  68 + success:(void (^)(CNLiveCommentListResult *result))successBlock
  69 + error:(void (^)(NSString *error))errorBlock;
  70 +
  71 +
  72 +/**
  73 + 评论一条节目
  74 +
  75 + @param programId 节目ID
  76 + @param sid 用户ID
  77 + @param comment 评论内容
  78 + @param completionBlock 评论结果回调,{errorCode:"0",errorMsg:"成功"},
  79 + {errorCode:"xxx",//错误代码(非0)errorMsg:"失败" //错误信息}
  80 + */
  81 +- (void)commentOnProgramWithProgramId:(NSString *)programId
  82 + sid:(NSString *)sid
  83 + comment:(NSString *)comment
  84 + completion:(void (^)(NSString *errorCode, NSString *errorMsg))completionBlock;
  85 +
  86 +
  87 +/**
  88 + 给评论点赞
  89 +
  90 + @param programId 节目ID
  91 + @param sid 用户ID
  92 + @param commentId 评论ID
  93 + @param completionBlock 点赞结果回调,{errorCode:"0",errorMsg:"成功"},
  94 + {errorCode:"xxx",//错误代码(非0)errorMsg:"失败" //错误信息}
  95 + */
  96 +- (void)commentaryLikeWithProgramId:(NSString *)programId
  97 + sid:(NSString *)sid
  98 + commentId:(NSString *)commentId
  99 + completion:(void (^)(NSString *errorCode, NSString *errorMsg))completionBlock;
  100 +
  101 +
  102 +/**
  103 + 获取节目评论数
  104 +
  105 + @param programIds 节目ID数组(数组内可以是字符串类型,可以是NSNumber类型,其他不支持)
  106 + @param completionBlock 获取节目评论数回调结果,{errorCode:"0",errorMsg:"成功"},
  107 + {errorCode:"xxx",//错误代码(非0)errorMsg:"失败" //错误信息}
  108 + commentArray:CNLiveCommentCountResult类型数组,CNLiveCommentCountResult包含节目ID及对应的评论数;
  109 + */
  110 +- (void)getCommentCountWithProgramIds:(NSArray *)programIds
  111 + completion:(void (^)(NSString *errorCode, NSString *errorMsg, NSArray <CNLiveCommentCountResult *>*commentArray))completionBlock;
  112 +
  113 +@end
... ...
LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Info.plist
No preview for this file type
LiveVideoCloud/Classes/CNLiveSDK/CNLiveMsgTools.framework/CNLiveMsgTools
No preview for this file type
LiveVideoCloud/Classes/CNLiveSDK/CNLiveMsgTools.framework/Headers/CNLiveMsgManager.h
... ... @@ -10,8 +10,9 @@
10 10  
11 11 @interface CNLiveMsgManager : NSObject
12 12  
  13 +@property (nonatomic, readonly, assign) BOOL isTestEnvironment;
13 14  
14   -+ (NSString *)getVersion;
  15 ++ (NSString *)getCNLiveMsgVersion;
15 16  
16 17  
17 18 + (instancetype)sharedCNLiveMsgManager;
... ... @@ -27,6 +28,9 @@
27 28 - (void)initCNLiveMsgToolsWithAppKey:(NSString *)appKey appId:(NSString *)appId;
28 29  
29 30  
  31 +- (void)initCNLiveMsgToolsWithAppKey:(NSString *)appKey appId:(NSString *)appId isTestEnvironment:(BOOL)isTestEnvironment;
  32 +
  33 +
30 34 - (void)onLineWithMsgToolsInfoId:(NSString *)infoId
31 35 infoName:(NSString *)infoName
32 36 infoUrl:(NSString *)infoUrl
... ... @@ -83,6 +87,8 @@
83 87  
84 88 - (NSArray *)getLatestCarriers:(NSInteger)type targetId:(NSString *)targetId count:(int)count;
85 89  
86   -
  90 +- (void)getMeetingPointContent:(NSString *)pointId
  91 + success:(void (^)(int totalMemberCount))successBlock
  92 + error:(void (^)(NSInteger errors))errorBlock;
87 93  
88 94 @end
... ...
LiveVideoCloud/Classes/CNLiveSDK/CNLiveMsgTools.framework/Info.plist
No preview for this file type
LiveVideoCloud/Classes/CNLiveSDK/CNLivePlayerSDK.framework/CNLivePlayerSDK
No preview for this file type
LiveVideoCloud/Classes/CNLiveSDK/CNLivePlayerSDK.framework/Info.plist
No preview for this file type
LiveVideoCloud/Classes/Sections/UGCSections/View/LVCUGCLiveListView.m
... ... @@ -68,6 +68,12 @@ static NSString *cellId = @&quot;cellId&quot;;
68 68 LVCUGCLiveListModel *model = [LVCUGCLiveListModel modelWithDic:data];
69 69 _arrayM = model.activityList.mutableCopy;
70 70  
  71 + if (_arrayM.count == 0) {
  72 + _failedView.hidden = NO;
  73 + [self.collectionView.header endRefreshing];
  74 + return ;
  75 + }
  76 +
71 77 _timestamp = [[self timestamp] longLongValue];
72 78  
73 79 [self.collectionView.header endRefreshing];
... ...
LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCVodPlayerController.h
... ... @@ -10,4 +10,6 @@
10 10  
11 11 @interface LVCVodPlayerController : BaseViewController
12 12  
  13 +@property (nonatomic, strong) ProgramModel *model;
  14 +
13 15 @end
... ...
LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCVodPlayerController.m
... ... @@ -7,17 +7,632 @@
7 7 //
8 8  
9 9 #import "LVCVodPlayerController.h"
  10 +#import <CNLivePlayerSDK/CNLiveMoviePlayerController.h>
  11 +#import "LVCVodPlayerFullController.h"
  12 +#import "LVCCommentView.h"
10 13  
11   -@interface LVCVodPlayerController ()
  14 +typedef enum {
  15 + SwipeDirectionNone,
  16 + SwipeDirectionVertical,
  17 + SwipeDirectionHorizontal
  18 +} SwipeDirection;
  19 +
  20 +@interface LVCVodPlayerController (){
  21 +
  22 + UIButton *_backButton;
  23 + CNLiveMoviePlayerController *_player;//播放器
  24 + BOOL _isPlaying; // 判断当前播放状态
  25 + NSTimer *_autoHideTimer; // 自动隐藏时间
  26 + NSTimer *_currentTimer;// 更新当前播放时间
  27 + CGPoint _prePoint;
  28 + BOOL _status; // 状态栏是否显示
  29 + NSInteger _direction; // 屏幕方向 0正 1左 2右
  30 + BOOL _isFullScreen; //判断是否全屏
  31 + BOOL _isAppResignActive; //App状态 是否后台 YES后台 NO前台
  32 +}
  33 +
  34 +@property (nonatomic, strong) UIView *playerSuperView; //播放器背景
  35 +@property (nonatomic, strong) UIView *topView; //上方功能视图
  36 +@property (nonatomic, strong) UIView *bottomView; //下方
  37 +@property (nonatomic, strong) UILabel *videoTitle; //视频标题
  38 +@property (nonatomic, strong) UIButton *playPauseBtn; //播放暂停按钮
  39 +@property (nonatomic, strong) UILabel *currentTimeLabel; //当前时间显示
  40 +@property (nonatomic, strong) UILabel *durationLabel; //总时间
  41 +@property (nonatomic, strong) UISlider *timeSlide; //滑动
  42 +@property (nonatomic, strong) UIProgressView *bufferProgress; //缓冲
  43 +@property (nonatomic, assign) SwipeDirection swipeDirection;// 滑动方向
  44 +@property (nonatomic, strong) UISlider *volumeSlide; //声音控制
  45 +@property (nonatomic, strong) UIButton *toFullBtn;
  46 +@property (nonatomic, strong) LVCVodPlayerFullController *fullVC;
  47 +@property (nonatomic, strong) LVCCommentView *commentView;
12 48  
13 49 @end
14 50  
15 51 @implementation LVCVodPlayerController
16 52  
  53 +- (void)viewWillAppear:(BOOL)animated
  54 +{
  55 + [super viewWillAppear:animated];
  56 + [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
  57 + [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
  58 + self.navigationController.navigationBar.hidden = YES;
  59 +}
  60 +
  61 +- (void)viewWillDisappear:(BOOL)animated
  62 +{
  63 + [super viewWillDisappear:animated];
  64 + [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
  65 + [[UIApplication sharedApplication] setStatusBarHidden: NO withAnimation:UIStatusBarAnimationNone];
  66 + self.navigationController.navigationBar.hidden = NO;
  67 +}
  68 +
17 69 - (void)viewDidLoad {
18 70 [super viewDidLoad];
  71 + [self addNotifications];
19 72  
20 73 self.view.backgroundColor = [UIColor whiteColor];
  74 + [self.view addSubview:self.playerSuperView];
  75 + [self.view addSubview:self.commentView];
  76 +}
  77 +
  78 +- (void)setModel:(ProgramModel *)model {
  79 + _model = model;
  80 +
  81 + //用来更新视频当前播放时间
  82 + _currentTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
  83 +
  84 + [self playerInitialize];
  85 +}
  86 +
  87 +#pragma mark - 初始化播放器
  88 +- (void)playerInitialize {
  89 +
  90 + _player = [[CNLiveMoviePlayerController alloc] initVodPlayWithVId:self.model.mediaId
  91 + authSuccess:^{
  92 +
  93 + _isPlaying = YES;
  94 +
  95 + _player.view.frame = CGRectMake(0, 20, KScreenWidth, KVideoHeight);
  96 + _player.shouldAutoplay = YES;
  97 + [_player prepareToPlay];
  98 + [_playerSuperView insertSubview:_player.view atIndex:0];
  99 +
  100 + UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
  101 + [_player.view addGestureRecognizer:singleTap];// 点击手势
  102 +
  103 + UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRecognizerAction:)];
  104 + [_player.view addGestureRecognizer:panRecognizer];// 声音,亮度手势
  105 +
  106 + _autoHideTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(autoHideCtrlView) userInfo:nil repeats:NO];//隐藏时间
  107 +
  108 + _playPauseBtn.userInteractionEnabled = YES;
  109 + } authFailed:^(NSDictionary *errorInfo) {
  110 + NSLog(@"初始化点播播放器失败%@", errorInfo);
  111 + }];
  112 +}
  113 +
  114 +
  115 +#pragma mark - GetMethod !!!!!!!!!!!!!!!!!!!!!!!!!!!
  116 +- (UIView *)playerSuperView
  117 +{
  118 + if (!_playerSuperView) {
  119 + _playerSuperView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, KVideoHeight+20)];
  120 + _playerSuperView.backgroundColor = [UIColor blackColor];
  121 + _backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 15, 35, 35)];
  122 + [_backButton setImage:[UIImage imageNamed:@"play_fanhui"] forState:UIControlStateNormal];
  123 + [_backButton setImage:[UIImage imageNamed:@"fanhui_focused"] forState:UIControlStateHighlighted];
  124 + [_backButton addTarget:self action:@selector(clickToBack) forControlEvents:UIControlEventTouchUpInside];
  125 +
  126 + [_playerSuperView addSubview:self.topView];
  127 + [_playerSuperView addSubview:self.bottomView];
  128 + [_playerSuperView addSubview:_backButton];
  129 + }
  130 + return _playerSuperView;
  131 +}
  132 +
  133 +- (UILabel *)videoTitle { // 视频标题
  134 + if (!_videoTitle) {
  135 + _videoTitle = [[UILabel alloc] initWithFrame:CGRectMake(44, 15, KScreenWidth - 100, 35)];
  136 + _videoTitle.font = [UIFont systemFontOfSize:16];
  137 + _videoTitle.textColor = [UIColor whiteColor];
  138 + if ([self.model.subTitle isEqualToString:@""]) {
  139 + _videoTitle.text = self.model.title;
  140 + } else {
  141 + _videoTitle.text = self.model.subTitle;
  142 + }
  143 + }
  144 + return _videoTitle;
  145 +}
  146 +
  147 +- (UIView *)topView { // 播放器顶部功能条
  148 +
  149 + if (!_topView) {
  150 + _topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenHeight, 55)];
  151 + _topView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.7];
  152 + [_topView addSubview:self.videoTitle];
  153 + _topView.hidden = YES;
  154 + }
  155 + return _topView;
  156 +}
  157 +
  158 +- (UIView *)bottomView { // 播放器底部功能条
  159 +
  160 + if (!_bottomView) {
  161 + _bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, KVideoHeight - 20, KScreenWidth, 40)];
  162 + _bottomView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.7];
  163 + [_bottomView addSubview:self.playPauseBtn];
  164 + [_bottomView addSubview:self.currentTimeLabel];
  165 + [_bottomView addSubview:self.durationLabel];
  166 + [_bottomView addSubview:self.bufferProgress];
  167 + [_bottomView addSubview:self.timeSlide];
  168 + [_bottomView addSubview:self.toFullBtn];
  169 + }
  170 + return _bottomView;
  171 +}
  172 +
  173 +- (UIButton *)playPauseBtn { //播放暂停按钮
  174 + if (!_playPauseBtn) {
  175 + _playPauseBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  176 + _playPauseBtn.frame = CGRectMake(0, 0, 40, 40);
  177 + [_playPauseBtn addTarget:self action:@selector(playPause) forControlEvents:UIControlEventTouchUpInside];
  178 + [_playPauseBtn setImage:[UIImage imageNamed:@"play_bofang"] forState:UIControlStateNormal];
  179 + _playPauseBtn.userInteractionEnabled = NO;
  180 + }
  181 + return _playPauseBtn;
  182 +}
  183 +
  184 +- (UILabel *)currentTimeLabel { //当前播放时间
  185 + if (!_currentTimeLabel) {
  186 + _currentTimeLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 0, 55, 40)];
  187 + _currentTimeLabel.textColor = [UIColor whiteColor];
  188 + _currentTimeLabel.font = [UIFont systemFontOfSize:12];
  189 + [_currentTimeLabel setText:[NSString stringWithFormat:@"00:00:00"]];
  190 + }
  191 + return _currentTimeLabel;
  192 +}
  193 +
  194 +- (UILabel *)durationLabel { //总时长
  195 + if (!_durationLabel) {
  196 + _durationLabel = [[UILabel alloc] initWithFrame:CGRectMake(KScreenWidth - 95, 0, 55, 40)];
  197 + _durationLabel.textColor = [UIColor whiteColor];
  198 + _durationLabel.font = [UIFont systemFontOfSize:12];
  199 + [_durationLabel setText:[NSString stringWithFormat:@"00:00:00"]];
  200 + }
  201 + return _durationLabel;
  202 +}
  203 +
  204 +- (UISlider *)timeSlide { // 滑动
  205 + if (!_timeSlide) {
  206 + _timeSlide = [[UISlider alloc] initWithFrame:CGRectMake(95, 0, KScreenWidth - 190, 40)];
  207 + [_timeSlide setMinimumTrackTintColor:[UIColor redColorCNLive]];
  208 + [_timeSlide setMaximumTrackTintColor:[UIColor clearColor]];
  209 + [_timeSlide addTarget:self action:@selector(beginScrubbing) forControlEvents:UIControlEventTouchDown];
  210 + [_timeSlide addTarget:self action:@selector(endScrubbing) forControlEvents:UIControlEventTouchUpInside];
  211 + [_timeSlide addTarget:self action:@selector(endScrubbing) forControlEvents:UIControlEventTouchUpOutside];
  212 + }
  213 + return _timeSlide;
  214 +}
  215 +
  216 +- (UIProgressView *)bufferProgress { // 缓冲
  217 + if (!_bufferProgress) {
  218 + _bufferProgress = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
  219 + _bufferProgress.frame = CGRectMake(111, 19, KScreenWidth - 111- 55-40, 1);
  220 + _bufferProgress.trackTintColor = [UIColor whiteColor];
  221 + _bufferProgress.progressTintColor = [UIColor grayColor];
  222 + _bufferProgress.progress = 0;
  223 + }
  224 + return _bufferProgress;
  225 +}
  226 +
  227 +- (UISlider *)volumeSlide //音量改变 不直接展示MPVolumeView,而是获取它的子视图slide来改变系统音量
  228 +{
  229 + if (!_volumeSlide) {
  230 + MPVolumeView *slide = [[MPVolumeView alloc] init];
  231 + for (UIView *view in [slide subviews]) {
  232 + if ([view isKindOfClass:[UISlider class]]) {
  233 + _volumeSlide = (UISlider *)view;
  234 + }
  235 + }
  236 + }
  237 + return _volumeSlide;
  238 +}
  239 +
  240 +- (UIButton *)toFullBtn //全屏按钮
  241 +{
  242 + if (!_toFullBtn) {
  243 + _toFullBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  244 + [_toFullBtn setImage:[UIImage imageNamed:@"play_fangda_default"] forState:UIControlStateNormal];
  245 + [_toFullBtn setImage:[UIImage imageNamed:@"play_fangda_focused"] forState:UIControlStateHighlighted];
  246 + _toFullBtn.frame = CGRectMake(KScreenWidth - 40, 2.5, 35, 35);
  247 + [_toFullBtn addTarget:self action:@selector(clickButtonToFull) forControlEvents:UIControlEventTouchUpInside];
  248 + }
  249 + return _toFullBtn;
  250 +}
  251 +
  252 +- (LVCVodPlayerFullController *)fullVC { //全屏播放器
  253 + if (!_fullVC) {
  254 + _fullVC = [[LVCVodPlayerFullController alloc] init];
  255 + }
  256 + return _fullVC;
  257 +}
  258 +
  259 +- (LVCCommentView *)commentView {
  260 +
  261 + if (!_commentView) {
  262 + _commentView = [[LVCCommentView alloc] initWithFrame:CGRectMake(0, KVideoHeight + 20, KScreenWidth, KScreenHeight - KVideoHeight - 20)];
  263 + }
  264 + return _commentView;
  265 +}
  266 +
  267 +#pragma mark - Action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  268 +- (void)addNotifications {
  269 +
  270 + // 设备方向监听通知
  271 + [[NSNotificationCenter defaultCenter] addObserver:self
  272 + selector:@selector(deviceOrientationChanged:)
  273 + name:UIDeviceOrientationDidChangeNotification
  274 + object:nil];
  275 +
  276 + //视频播放状态改变
  277 + [[NSNotificationCenter defaultCenter] addObserver:self
  278 + selector:@selector(moviePlayBackStateDidChange:)
  279 + name:MPMoviePlayerPlaybackStateDidChangeNotification
  280 + object:nil];
  281 +
  282 + [[NSNotificationCenter defaultCenter] addObserver:self
  283 + selector:@selector(appResignActive)
  284 + name:UIApplicationWillResignActiveNotification
  285 + object:nil];
  286 +
  287 + [[NSNotificationCenter defaultCenter] addObserver:self
  288 + selector:@selector(appBecomeActive)
  289 + name:UIApplicationDidBecomeActiveNotification
  290 + object:nil];
  291 +}
  292 +
  293 +#pragma mark - 屏幕旋转通知监听
  294 +- (void)deviceOrientationChanged:(id)sender {
  295 +
  296 + if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait)
  297 + {
  298 + if (_direction == 0 || _isAppResignActive) {
  299 + return;
  300 + }
  301 +
  302 + [self clickToBack];
  303 +
  304 + }else if([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft)
  305 + {
  306 + // 1 左
  307 + if (_direction == 1 || _direction == 2 || _isAppResignActive) {
  308 + return;
  309 + } else {
  310 + _direction = 1;
  311 + [self scrollToFull];
  312 + }
  313 +
  314 + }else if([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)
  315 + {
  316 + // 2 右
  317 + if (_direction == 2 || _direction == 1 || _isAppResignActive) {
  318 + return;
  319 + } else {
  320 + _direction = 2;
  321 + [self scrollToFull];
  322 + }
  323 + }
  324 +}
  325 +
  326 +#pragma mark - App 状态通知
  327 +- (void)appResignActive {
  328 +
  329 + _isAppResignActive = YES;
  330 + [_player pause];
  331 +}
  332 +
  333 +- (void)appBecomeActive {
  334 +
  335 + _isAppResignActive = NO;
  336 + [_player play];
  337 +}
  338 +
  339 +- (void)clickButtonToFull {
  340 +
  341 + _direction = 1;
  342 + [self scrollToFull];
  343 +}
  344 +
  345 +- (void)scrollToFull {
  346 +
  347 + CGFloat angle = _direction == 2 ? M_PI_2 : -M_PI_2;
  348 +
  349 + [self presentViewController:self.fullVC animated:NO completion:^{
  350 +
  351 + [self.playerSuperView removeFromSuperview];
  352 + [self.fullVC.view addSubview:self.playerSuperView];
  353 +
  354 + [self toFullFrameChange];
  355 +
  356 + self.playerSuperView.transform = CGAffineTransformMakeRotation(angle);
  357 + [UIView animateWithDuration:0.3 animations:^{
  358 + self.playerSuperView.transform = CGAffineTransformMakeRotation(0);
  359 + }];
  360 + }];
  361 +}
  362 +
  363 +- (void)toFullFrameChange {
  364 +
  365 + _isFullScreen = YES;
  366 + _toFullBtn.hidden = YES;
  367 + _topView.hidden = NO;
  368 + [_playerSuperView setFrame:CGRectMake(0.0f, 0.0f, KScreenHeight, KScreenWidth)];
  369 + _player.view.frame = _playerSuperView.bounds;
  370 + _bottomView.frame = CGRectMake(0, KScreenWidth - 55, KScreenHeight, 55);
  371 + _durationLabel.x = KScreenHeight - 55;
  372 + _timeSlide.width = KScreenHeight - 150;
  373 + _bufferProgress.width = KScreenHeight - 111 - 55;
  374 +}
  375 +
  376 +- (void)clickToBack { //退出
  377 +
  378 + if (_isFullScreen) {
  379 +
  380 + CGFloat angle = _direction == 2 ? -M_PI_2 : M_PI_2;
  381 + [self.fullVC dismissViewControllerAnimated:NO completion:^{
  382 +
  383 + [self.playerSuperView removeFromSuperview];
  384 + [self.view insertSubview:self.playerSuperView atIndex:0];
  385 + [self fromFullToNormal];
  386 + self.playerSuperView.transform = CGAffineTransformMakeRotation(angle);
  387 + [UIView animateWithDuration:0.3 animations:^{
  388 + self.playerSuperView.transform = CGAffineTransformMakeRotation(0);
  389 + }];
  390 + }];
  391 + } else {
  392 +
  393 + [_player stop];
  394 + [_autoHideTimer invalidate];
  395 + _autoHideTimer = nil;
  396 + [_currentTimer invalidate];
  397 + _currentTimer = nil;
  398 + [[NSNotificationCenter defaultCenter]removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];
  399 + [_playerSuperView removeFromSuperview];
  400 + [self.navigationController popViewControllerAnimated:YES];
  401 + }
  402 +}
  403 +
  404 +- (void)fromFullToNormal {
  405 +
  406 + _isFullScreen = NO;
  407 + _toFullBtn.hidden = NO;
  408 + _topView.hidden = YES;
  409 +
  410 + _playerSuperView.bounds = CGRectMake(0, 0, KScreenWidth, KVideoHeight + 20);
  411 + CGPoint backPoint = CGPointMake(KScreenWidth * 0.5, KVideoHeight * 0.5 + 10);
  412 + _playerSuperView.center = backPoint;
  413 + _player.view.frame = CGRectMake(0, 20, KScreenWidth, KVideoHeight);
  414 + _bottomView.frame = CGRectMake(0, KVideoHeight - 20, KScreenWidth, 40);
  415 + _durationLabel.x = KScreenWidth - 95;
  416 + _timeSlide.width = KScreenWidth - 190;
  417 + _bufferProgress.width = KScreenWidth - 111- 55-40;
  418 + _direction = 0;
  419 +}
  420 +
  421 +- (void)playPause { //播放暂停
  422 +
  423 + _isPlaying = _isPlaying == YES ? NO : YES;
  424 +
  425 + if (_player.isPlaying) {
  426 + [_player pause];
  427 + [_autoHideTimer invalidate];
  428 + } else {
  429 + [_player play];
  430 + _autoHideTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(autoHideCtrlView) userInfo:nil repeats:NO];
  431 + }
  432 +}
  433 +
  434 +- (void)autoHideCtrlView { //自动隐藏上下功能视图
  435 + [UIView animateWithDuration:0.3 animations:^{
  436 + self.topView.alpha = 0;
  437 + self.bottomView.alpha = 0;
  438 + _status = YES;
  439 + if (_isFullScreen) {
  440 + [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
  441 + }
  442 + }];
  443 +}
  444 +
  445 +- (void)singleTap:(UIGestureRecognizer *)tap { //单击手势
  446 +
  447 + if (_isPlaying) {
  448 + [_autoHideTimer invalidate];
  449 + _autoHideTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(autoHideCtrlView) userInfo:nil repeats:NO];
  450 + }
  451 + [UIView animateWithDuration:0.5 animations:^{
  452 + self.topView.alpha = self.topView.alpha == 0 ? 1 : 0;
  453 + self.bottomView.alpha = self.bottomView.alpha == 0 ? 1 : 0;
  454 + _status = self.topView.alpha == 0 ? YES : NO;
  455 +
  456 + if (_isFullScreen) {
  457 + [[UIApplication sharedApplication] setStatusBarHidden:_status withAnimation:UIStatusBarAnimationFade];
  458 + }
  459 + }];
  460 +}
  461 +
  462 +- (void)timeChange { // 更新当前播放时间
  463 +
  464 + _bufferProgress.progress = _player.playableDuration/_player.duration;
  465 + if (!_player.isPreparedToPlay) {
  466 + return;
  467 + }
  468 + _timeSlide.value = _player.currentPlaybackTime;
  469 + _timeSlide.maximumValue = _player.duration;
  470 +
  471 + // 当前播放时间
  472 + NSInteger currentSeconds = (NSInteger)_player.currentPlaybackTime;
  473 + NSInteger seconds = currentSeconds % 60;
  474 + NSInteger minutes = currentSeconds / 60;
  475 + NSInteger hours = minutes / 60;
  476 +
  477 + // 总时长
  478 + NSInteger durationall = (NSInteger)_player.duration;
  479 + NSInteger durationSeconds = durationall % 60;
  480 + NSInteger durationMinutes = durationall / 60;
  481 + NSInteger durationHours = durationMinutes / 60;
  482 +
  483 + // 当前时间
  484 + _currentTimeLabel.text = [NSString stringWithFormat:@"%02ld:%02ld:%02ld", (long)hours, (long)minutes%60, (long)seconds];
  485 + // 总时长
  486 + _durationLabel.text = [NSString stringWithFormat:@"%02ld:%02ld:%02ld", (long)durationHours, (long)durationMinutes%60, (long)durationSeconds];
  487 +}
  488 +
  489 +// 滑动监听方法
  490 +- (void)beginScrubbing {
  491 + [_player pause];
  492 + [_currentTimer invalidate];
  493 + [_autoHideTimer invalidate];
  494 +}
  495 +
  496 +- (void)endScrubbing {
  497 + [_player setCurrentPlaybackTime:_timeSlide.value];
  498 + [_player play];
  499 + _currentTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
  500 + _autoHideTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(autoHideCtrlView) userInfo:nil repeats:NO];
  501 +}
  502 +
  503 +- (void)panRecognizerAction:(UIPanGestureRecognizer *)panRecognizer { // 声音拖拽方法
  504 +
  505 + switch (panRecognizer.state) {
  506 + case UIGestureRecognizerStateBegan:
  507 + {
  508 + self.swipeDirection = SwipeDirectionNone;
  509 + _prePoint = [panRecognizer locationInView:_playerSuperView];
  510 + }
  511 + break;
  512 + case UIGestureRecognizerStateChanged:
  513 + {
  514 + CGPoint currp = [panRecognizer locationInView:_playerSuperView];
  515 + CGPoint distance = [panRecognizer translationInView:_playerSuperView];
  516 + CGFloat xLength = currp.x-_prePoint.x;
  517 + CGFloat yLength = _prePoint.y-currp.y;
  518 +
  519 + NSLog(@"x:%f y:%f d:%f",xLength,yLength,distance.x);
  520 + _prePoint = currp;
  521 +
  522 + switch (self.swipeDirection) {
  523 + case SwipeDirectionNone:
  524 + if (fabs(xLength)>fabs(yLength)) {
  525 + // 水平
  526 + self.swipeDirection = SwipeDirectionHorizontal;
  527 + }else{
  528 + // 垂直
  529 + self.swipeDirection = SwipeDirectionVertical;
  530 + }
  531 + break;
  532 + case SwipeDirectionVertical:
  533 + {
  534 + CGFloat middle = 0;
  535 + if (_isFullScreen) {
  536 + middle = KScreenHeight*0.5;
  537 + } else {
  538 + middle = KScreenWidth*0.5;
  539 + }
  540 + if (_prePoint.x < middle) {
  541 + [self swipeVerticalVolume:yLength];
  542 + } else {
  543 + [self swipeVerticalBrightness:yLength];
  544 + }
  545 + }
  546 + break;
  547 + case SwipeDirectionHorizontal:
  548 + {
  549 + [_player pause];
  550 + [_currentTimer invalidate];
  551 + [_autoHideTimer invalidate];
  552 + _timeSlide.value += xLength/KScreenHeight*_player.duration;
  553 + }
  554 + break;
  555 + default:
  556 + break;
  557 + }
  558 + }
  559 + break;
  560 + case UIGestureRecognizerStateEnded:
  561 + case UIGestureRecognizerStateCancelled:
  562 + case UIGestureRecognizerStateFailed:
  563 + {
  564 + if (self.swipeDirection == SwipeDirectionHorizontal) {
  565 + [_player setCurrentPlaybackTime:_timeSlide.value];
  566 + [_player play];
  567 + _currentTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
  568 + _autoHideTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(autoHideCtrlView) userInfo:nil repeats:NO];
  569 + }
  570 + }
  571 + break;
  572 +
  573 + default:
  574 + break;
  575 + }
  576 +}
  577 +
  578 +- (void)swipeVerticalVolume:(CGFloat)length { //纵向滑动手势声音
  579 +
  580 + self.volumeSlide.value += length/KScreenWidth;
  581 +}
  582 +
  583 +- (void)swipeVerticalBrightness:(CGFloat)length { //纵向滑动手势亮度
  584 +
  585 + [UIScreen mainScreen].brightness += length/KScreenWidth;
  586 +}
  587 +
  588 +- (void)moviePlayBackStateDidChange:(NSNotification *)notification { //播放状态通知
  589 + if (_player) {
  590 +
  591 + switch (_player.playbackState) {
  592 + case MPMoviePlaybackStateStopped: {
  593 + [self changePlayBtnStatus:NO];
  594 + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateStopped");
  595 + break;
  596 + }
  597 + case MPMoviePlaybackStatePlaying: {
  598 + [self changePlayBtnStatus:YES];
  599 + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStatePlaying");
  600 + break;
  601 + }
  602 + case MPMoviePlaybackStatePaused:
  603 + [self changePlayBtnStatus:NO];
  604 + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStatePaused");
  605 + break;
  606 + case MPMoviePlaybackStateInterrupted:
  607 + [self changePlayBtnStatus:NO];
  608 + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateInterrupted");
  609 + break;
  610 + case MPMoviePlaybackStateSeekingForward:
  611 + [self changePlayBtnStatus:NO];
  612 + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateSeekingForward");
  613 + break;
  614 + case MPMoviePlaybackStateSeekingBackward:
  615 + [self changePlayBtnStatus:NO];
  616 + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateSeekingBackward");
  617 + break;
  618 + default:
  619 + [self changePlayBtnStatus:NO];
  620 + NSLog(@"moviePlayBackStateDidChange : %ld", _player.playbackState);
  621 + break;
  622 + }
  623 + }
  624 +}
  625 +
  626 +- (void)changePlayBtnStatus:(BOOL)playing { //改变播放暂停按钮图片
  627 + if (playing) {
  628 + [_playPauseBtn setImage:[UIImage imageNamed:@"play_bofang"] forState:UIControlStateNormal];
  629 + } else {
  630 + [_playPauseBtn setImage:[UIImage imageNamed:@"play_zanting"] forState:UIControlStateNormal];
  631 + }
  632 +}
  633 +
  634 +- (void)dealloc {
  635 + NSLog(@"dealloc");
21 636 }
22 637  
23 638 - (void)didReceiveMemoryWarning {
... ...
LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCVodPlayerFullController.h 0 → 100644
  1 +//
  2 +// LVCVodPlayerFullController.h
  3 +// LiveVideoCloud
  4 +//
  5 +// Created by cnliveJunBo on 17/6/27.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <UIKit/UIKit.h>
  10 +
  11 +@interface LVCVodPlayerFullController : UIViewController
  12 +
  13 +@property (nonatomic, strong) ProgramModel *model;
  14 +
  15 +@end
... ...
LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCVodPlayerFullController.m 0 → 100644
  1 +//
  2 +// LVCVodPlayerFullController.m
  3 +// LiveVideoCloud
  4 +//
  5 +// Created by cnliveJunBo on 17/6/27.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import "LVCVodPlayerFullController.h"
  10 +
  11 +@interface LVCVodPlayerFullController ()
  12 +
  13 +@end
  14 +
  15 +@implementation LVCVodPlayerFullController
  16 +
  17 +- (void)viewWillAppear:(BOOL)animated {
  18 + [super viewWillAppear:animated];
  19 +
  20 + [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
  21 +
  22 + [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
  23 +}
  24 +
  25 +- (void)viewDidLoad {
  26 + [super viewDidLoad];
  27 +
  28 + self.view.backgroundColor = [UIColor whiteColor];
  29 +}
  30 +
  31 +- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
  32 + return UIInterfaceOrientationMaskLandscape;
  33 +}
  34 +
  35 +- (BOOL)shouldAutorotate {
  36 + return YES;
  37 +}
  38 +
  39 +- (void)dealloc {
  40 + NSLog(@">>>>>>>>>>>>>>>>>> fullView dealloc");
  41 +}
  42 +
  43 +- (void)didReceiveMemoryWarning {
  44 + [super didReceiveMemoryWarning];
  45 + // Dispose of any resources that can be recreated.
  46 +}
  47 +
  48 +@end
... ...
LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCVodPlayerListController.m
... ... @@ -98,6 +98,7 @@ static NSString *vodCellId = @&quot;vodCellId&quot;;
98 98 [tableView deselectRowAtIndexPath:indexPath animated:NO];
99 99  
100 100 LVCVodPlayerController *vc = [[LVCVodPlayerController alloc] init];
  101 + vc.model = _programArrayM[indexPath.row];
101 102 [self.navigationController pushViewController:vc animated:YES];
102 103 }
103 104  
... ...
LiveVideoCloud/Classes/Sections/homeSections/View/LVCCommentView.h 0 → 100644
  1 +//
  2 +// LVCCommentView.h
  3 +// LiveVideoCloud
  4 +//
  5 +// Created by cnliveJunBo on 17/6/28.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <UIKit/UIKit.h>
  10 +
  11 +@interface LVCCommentView : UIView
  12 +
  13 +@property (nonatomic, strong) ProgramModel *model;
  14 +
  15 +@end
... ...
LiveVideoCloud/Classes/Sections/homeSections/View/LVCCommentView.m 0 → 100644
  1 +//
  2 +// LVCCommentView.m
  3 +// LiveVideoCloud
  4 +//
  5 +// Created by cnliveJunBo on 17/6/28.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import "LVCCommentView.h"
  10 +
  11 +@interface LVCCommentView() {
  12 +
  13 + CGSize _contentSize;
  14 +}
  15 +
  16 +@property (nonatomic, strong) UILabel *titleLabel;
  17 +
  18 +@property (nonatomic, strong) UILabel *contentLabel;
  19 +
  20 +@end
  21 +
  22 +@implementation LVCCommentView
  23 +
  24 +- (instancetype)initWithFrame:(CGRect)frame
  25 +{
  26 + self = [super initWithFrame:frame];
  27 + if (self) {
  28 + [self addSubview:self.titleLabel];
  29 + [self addSubview:self.contentLabel];
  30 + }
  31 + return self;
  32 +}
  33 +
  34 +- (void)setModel:(ProgramModel *)model {
  35 +
  36 + _titleLabel.text = model.title;
  37 +}
  38 +
  39 +#pragma mark - GetMethod !!!!!!!!!!!!!!!!!!!!!!
  40 +- (UILabel *)titleLabel {
  41 +
  42 + if (!_titleLabel) {
  43 + _titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, KScreenWidth-20, 40)];
  44 + [_contentLabel setFont:[UIFont systemFontOfSize:22]];
  45 + _titleLabel.text = @"将就开始疯狂涉及到法定分";
  46 + }
  47 + return _titleLabel;
  48 +}
  49 +
  50 +- (UILabel *)contentLabel {
  51 +
  52 + if (!_contentLabel) {
  53 + _contentLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 60, KScreenWidth-20, 100)];
  54 + [_contentLabel setFont:[UIFont systemFontOfSize:14]];
  55 + _contentLabel.textColor = [UIColor grayColor];
  56 + _contentLabel.text = @"就当是妇女节阿斯顿和播放控件安徽的播放控件和巴萨的海景房吧圣诞节还发什么你打副本氨基酸等回复看见爱上对方阿斯顿发布密集恐惧恨不得能否";
  57 + _contentLabel.numberOfLines = 0;
  58 + [_contentLabel sizeToFit];
  59 + _contentSize = _contentLabel.bounds.size;
  60 + }
  61 + return _contentLabel;
  62 +}
  63 +
  64 +
  65 +
  66 +@end
... ...
LiveVideoCloud/UtilKits/ServerUrl/ZXServerUrl.m
... ... @@ -9,7 +9,7 @@
9 9 #import "ZXServerUrl.h"
10 10  
11 11 #ifdef DEBUG
12   -static NSString *serverBaseURL = @"http://api.cnlive.com";//通用测试æœåŠ¡å™¨åŸŸå
  12 +static NSString *serverBaseURL = @"http://test.open.cnlive.com/openapi/api2/";//@"http://api.cnlive.com";//通用测试æœåŠ¡å™¨åŸŸå
13 13 static NSString *serverChatBaseURL = @"http://120.92.4.46:8081";//èŠå¤©æµ‹è¯•æœåŠ¡å™¨åŸŸå
14 14 #else
15 15 static NSString *serverBaseURL = @"https://perapi.svipmovie.com";//é€šç”¨æ­£å¼æœåŠ¡å™¨åŸŸå
... ... @@ -24,7 +24,7 @@ static NSString *serverChatBaseURL = @&quot;https://perapi.svipmovie1.com&quot;;//èŠå¤©æ­
24 24 static NSString *g_SearchContentURL = @"/from/huntKeyWordApi/huntKeyWords.do";//@"api/findMessage";//å‘现消æ¯
25 25  
26 26 /** 直播列表 */
27   -static NSString *g_LiveListURL = @"/open/api2/live_epg/sp/activityList4App";
  27 +static NSString *g_LiveListURL = @"live_epg/sp/activityList4App";///open/api2/
28 28  
29 29 /** 直播活动详情 */
30 30 static NSString *g_LiveActivityInfoURL = @"/open/api2/live_epg/getLiveActivityPlayInfo4App";
... ...
LiveVideoCloud/animation.xcassets/play_bofang.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "play_bofang.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 22 \ No newline at end of file
... ...
LiveVideoCloud/animation.xcassets/play_bofang.imageset/play_bofang.png 0 → 100644

2.01 KB

LiveVideoCloud/animation.xcassets/play_fangda_default.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "play_fangda_default.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 22 \ No newline at end of file
... ...
LiveVideoCloud/animation.xcassets/play_fangda_default.imageset/play_fangda_default.png 0 → 100644

1.27 KB

LiveVideoCloud/animation.xcassets/play_fangda_focused.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "play_fangda_focused.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 22 \ No newline at end of file
... ...
LiveVideoCloud/animation.xcassets/play_fangda_focused.imageset/play_fangda_focused.png 0 → 100644

1.28 KB

LiveVideoCloud/animation.xcassets/play_fanhui.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "play_fanhui.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 22 \ No newline at end of file
... ...
LiveVideoCloud/animation.xcassets/play_fanhui.imageset/play_fanhui.png 0 → 100644

1.47 KB

LiveVideoCloud/animation.xcassets/play_zanting.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "play_zanting.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 22 \ No newline at end of file
... ...
LiveVideoCloud/animation.xcassets/play_zanting.imageset/play_zanting.png 0 → 100644

2.24 KB