Commit a10978c702c4ed815318e4d5342d50c0f099edfb
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 = @"cellId"; |
| 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
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 = @"vodCellId"; |
| 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 = @"https://perapi.svipmovie1.com";//èŠå¤©æ |
| 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