Commit 26d467de4f1614fdc7b4d47dd5b052dace57b80b

Authored by 朱林
1 parent 2ef8d273

修复bug

Showing 22 changed files with 265 additions and 174 deletions
LiveVideoCloud/LiveVideoCloud.xcodeproj/project.pbxproj
@@ -32,7 +32,6 @@ @@ -32,7 +32,6 @@
32 81A1B9A91E8277410079FF5F /* LVCInputView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A1B9A81E8277410079FF5F /* LVCInputView.m */; }; 32 81A1B9A91E8277410079FF5F /* LVCInputView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A1B9A81E8277410079FF5F /* LVCInputView.m */; };
33 81A482F51E88ACC80097A80A /* LVCTelevisionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A482F41E88ACC80097A80A /* LVCTelevisionView.m */; }; 33 81A482F51E88ACC80097A80A /* LVCTelevisionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A482F41E88ACC80097A80A /* LVCTelevisionView.m */; };
34 81A482F81E88AFA20097A80A /* LVCFirstHeaderReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A482F71E88AFA20097A80A /* LVCFirstHeaderReusableView.m */; }; 34 81A482F81E88AFA20097A80A /* LVCFirstHeaderReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A482F71E88AFA20097A80A /* LVCFirstHeaderReusableView.m */; };
35 - 81A483011E88B0130097A80A /* LVCBannerModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A482FE1E88B0130097A80A /* LVCBannerModel.m */; };  
36 81A483021E88B0130097A80A /* LVCChatRoomModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483001E88B0130097A80A /* LVCChatRoomModel.m */; }; 35 81A483021E88B0130097A80A /* LVCChatRoomModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483001E88B0130097A80A /* LVCChatRoomModel.m */; };
37 81A483051E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483041E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m */; }; 36 81A483051E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483041E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m */; };
38 81A483081E88B6140097A80A /* UIView+ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483071E88B6140097A80A /* UIView+ViewController.m */; }; 37 81A483081E88B6140097A80A /* UIView+ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483071E88B6140097A80A /* UIView+ViewController.m */; };
@@ -44,6 +43,7 @@ @@ -44,6 +43,7 @@
44 81A4831A1E88E19C0097A80A /* LVCMoreProgramViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483191E88E19C0097A80A /* LVCMoreProgramViewController.m */; }; 43 81A4831A1E88E19C0097A80A /* LVCMoreProgramViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483191E88E19C0097A80A /* LVCMoreProgramViewController.m */; };
45 81A4831D1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A4831C1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m */; }; 44 81A4831D1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A4831C1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m */; };
46 81A483201E88F4BF0097A80A /* LVCProgramModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A4831F1E88F4BF0097A80A /* LVCProgramModel.m */; }; 45 81A483201E88F4BF0097A80A /* LVCProgramModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A4831F1E88F4BF0097A80A /* LVCProgramModel.m */; };
  46 + 81CE9E1B1E8CF567000F8F6B /* LVCRequestFailedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81CE9E1A1E8CF567000F8F6B /* LVCRequestFailedView.m */; };
47 81F1C8381E8BBDDA0085C2B8 /* MHPagingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81F1C8371E8BBDDA0085C2B8 /* MHPagingScrollView.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 47 81F1C8381E8BBDDA0085C2B8 /* MHPagingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81F1C8371E8BBDDA0085C2B8 /* MHPagingScrollView.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
48 81F1C83D1E8BBDE40085C2B8 /* V8HorizontalPickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81F1C83B1E8BBDE40085C2B8 /* V8HorizontalPickerView.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 48 81F1C83D1E8BBDE40085C2B8 /* V8HorizontalPickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81F1C83B1E8BBDE40085C2B8 /* V8HorizontalPickerView.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
49 81F1C8401E8BC5CC0085C2B8 /* NSArray+Safety.m in Sources */ = {isa = PBXBuildFile; fileRef = 81F1C83F1E8BC5CC0085C2B8 /* NSArray+Safety.m */; }; 49 81F1C8401E8BC5CC0085C2B8 /* NSArray+Safety.m in Sources */ = {isa = PBXBuildFile; fileRef = 81F1C83F1E8BC5CC0085C2B8 /* NSArray+Safety.m */; };
@@ -298,8 +298,6 @@ @@ -298,8 +298,6 @@
298 81A482F41E88ACC80097A80A /* LVCTelevisionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LVCTelevisionView.m; path = LiveVideoCloud/Classes/Sections/homeSections/View/LVCTelevisionView.m; sourceTree = SOURCE_ROOT; }; 298 81A482F41E88ACC80097A80A /* LVCTelevisionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LVCTelevisionView.m; path = LiveVideoCloud/Classes/Sections/homeSections/View/LVCTelevisionView.m; sourceTree = SOURCE_ROOT; };
299 81A482F61E88AFA20097A80A /* LVCFirstHeaderReusableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCFirstHeaderReusableView.h; sourceTree = "<group>"; }; 299 81A482F61E88AFA20097A80A /* LVCFirstHeaderReusableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCFirstHeaderReusableView.h; sourceTree = "<group>"; };
300 81A482F71E88AFA20097A80A /* LVCFirstHeaderReusableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCFirstHeaderReusableView.m; sourceTree = "<group>"; }; 300 81A482F71E88AFA20097A80A /* LVCFirstHeaderReusableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCFirstHeaderReusableView.m; sourceTree = "<group>"; };
301 - 81A482FD1E88B0130097A80A /* LVCBannerModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCBannerModel.h; sourceTree = "<group>"; };  
302 - 81A482FE1E88B0130097A80A /* LVCBannerModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCBannerModel.m; sourceTree = "<group>"; };  
303 81A482FF1E88B0130097A80A /* LVCChatRoomModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCChatRoomModel.h; sourceTree = "<group>"; }; 301 81A482FF1E88B0130097A80A /* LVCChatRoomModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCChatRoomModel.h; sourceTree = "<group>"; };
304 81A483001E88B0130097A80A /* LVCChatRoomModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCChatRoomModel.m; sourceTree = "<group>"; }; 302 81A483001E88B0130097A80A /* LVCChatRoomModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCChatRoomModel.m; sourceTree = "<group>"; };
305 81A483031E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCHeaderRollCollectionViewCell.h; sourceTree = "<group>"; }; 303 81A483031E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCHeaderRollCollectionViewCell.h; sourceTree = "<group>"; };
@@ -322,6 +320,8 @@ @@ -322,6 +320,8 @@
322 81A4831C1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCMoreSortTableViewCell.m; sourceTree = "<group>"; }; 320 81A4831C1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCMoreSortTableViewCell.m; sourceTree = "<group>"; };
323 81A4831E1E88F4BF0097A80A /* LVCProgramModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCProgramModel.h; sourceTree = "<group>"; }; 321 81A4831E1E88F4BF0097A80A /* LVCProgramModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCProgramModel.h; sourceTree = "<group>"; };
324 81A4831F1E88F4BF0097A80A /* LVCProgramModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCProgramModel.m; sourceTree = "<group>"; }; 322 81A4831F1E88F4BF0097A80A /* LVCProgramModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCProgramModel.m; sourceTree = "<group>"; };
  323 + 81CE9E191E8CF567000F8F6B /* LVCRequestFailedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCRequestFailedView.h; sourceTree = "<group>"; };
  324 + 81CE9E1A1E8CF567000F8F6B /* LVCRequestFailedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCRequestFailedView.m; sourceTree = "<group>"; };
325 81F1C8361E8BBDDA0085C2B8 /* MHPagingScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MHPagingScrollView.h; sourceTree = "<group>"; }; 325 81F1C8361E8BBDDA0085C2B8 /* MHPagingScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MHPagingScrollView.h; sourceTree = "<group>"; };
326 81F1C8371E8BBDDA0085C2B8 /* MHPagingScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MHPagingScrollView.m; sourceTree = "<group>"; }; 326 81F1C8371E8BBDDA0085C2B8 /* MHPagingScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MHPagingScrollView.m; sourceTree = "<group>"; };
327 81F1C83A1E8BBDE40085C2B8 /* V8HorizontalPickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = V8HorizontalPickerView.h; sourceTree = "<group>"; }; 327 81F1C83A1E8BBDE40085C2B8 /* V8HorizontalPickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = V8HorizontalPickerView.h; sourceTree = "<group>"; };
@@ -762,8 +762,6 @@ @@ -762,8 +762,6 @@
762 81A482FC1E88B0130097A80A /* Model */ = { 762 81A482FC1E88B0130097A80A /* Model */ = {
763 isa = PBXGroup; 763 isa = PBXGroup;
764 children = ( 764 children = (
765 - 81A482FD1E88B0130097A80A /* LVCBannerModel.h */,  
766 - 81A482FE1E88B0130097A80A /* LVCBannerModel.m */,  
767 81A4830C1E88B8300097A80A /* LVCChannelsModel.h */, 765 81A4830C1E88B8300097A80A /* LVCChannelsModel.h */,
768 81A4830D1E88B8300097A80A /* LVCChannelsModel.m */, 766 81A4830D1E88B8300097A80A /* LVCChannelsModel.m */,
769 81A4830F1E88B8630097A80A /* LVCChannelDetailsModel.h */, 767 81A4830F1E88B8630097A80A /* LVCChannelDetailsModel.h */,
@@ -1719,6 +1717,8 @@ @@ -1719,6 +1717,8 @@
1719 81A483041E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m */, 1717 81A483041E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m */,
1720 8112D42F1E7927A5002E00F6 /* LVCPlayerLoadingView.h */, 1718 8112D42F1E7927A5002E00F6 /* LVCPlayerLoadingView.h */,
1721 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */, 1719 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */,
  1720 + 81CE9E191E8CF567000F8F6B /* LVCRequestFailedView.h */,
  1721 + 81CE9E1A1E8CF567000F8F6B /* LVCRequestFailedView.m */,
1722 D2A089E61E89FA720071412C /* LVCUGCLivePlayerCell.h */, 1722 D2A089E61E89FA720071412C /* LVCUGCLivePlayerCell.h */,
1723 D2A089E71E89FA720071412C /* LVCUGCLivePlayerCell.m */, 1723 D2A089E71E89FA720071412C /* LVCUGCLivePlayerCell.m */,
1724 D25BF8811E7F775F007FB138 /* LVCUGCPlayerLoadingView.h */, 1724 D25BF8811E7F775F007FB138 /* LVCUGCPlayerLoadingView.h */,
@@ -2037,7 +2037,6 @@ @@ -2037,7 +2037,6 @@
2037 D2029C9F1E6EADE10027CD92 /* NSObject+MJKeyValue.m in Sources */, 2037 D2029C9F1E6EADE10027CD92 /* NSObject+MJKeyValue.m in Sources */,
2038 D25BF8A01E80C4BD007FB138 /* UIImage+LVCVagueImage.m in Sources */, 2038 D25BF8A01E80C4BD007FB138 /* UIImage+LVCVagueImage.m in Sources */,
2039 D2888DB11E6EC05F003A77C8 /* TempViewController.m in Sources */, 2039 D2888DB11E6EC05F003A77C8 /* TempViewController.m in Sources */,
2040 - 81A483011E88B0130097A80A /* LVCBannerModel.m in Sources */,  
2041 810B65021E779B1F00133E15 /* MASViewAttribute.m in Sources */, 2040 810B65021E779B1F00133E15 /* MASViewAttribute.m in Sources */,
2042 D2B7B2511E8247D400ED084E /* ChatBarrageManager.m in Sources */, 2041 D2B7B2511E8247D400ED084E /* ChatBarrageManager.m in Sources */,
2043 D2029CAC1E6EADE10027CD92 /* MJRefreshBackStateFooter.m in Sources */, 2042 D2029CAC1E6EADE10027CD92 /* MJRefreshBackStateFooter.m in Sources */,
@@ -2077,6 +2076,7 @@ @@ -2077,6 +2076,7 @@
2077 D25BF87A1E7B8A82007FB138 /* FilterFunctionView.m in Sources */, 2076 D25BF87A1E7B8A82007FB138 /* FilterFunctionView.m in Sources */,
2078 D207BEA11E84C1EC006A0CE8 /* AnimationBaseView.m in Sources */, 2077 D207BEA11E84C1EC006A0CE8 /* AnimationBaseView.m in Sources */,
2079 D2029D001E6EAE2E0027CD92 /* NSNumber+ScaleHeight.m in Sources */, 2078 D2029D001E6EAE2E0027CD92 /* NSNumber+ScaleHeight.m in Sources */,
  2079 + 81CE9E1B1E8CF567000F8F6B /* LVCRequestFailedView.m in Sources */,
2080 D2888D9E1E6EBF1B003A77C8 /* LVCLiveViewController.m in Sources */, 2080 D2888D9E1E6EBF1B003A77C8 /* LVCLiveViewController.m in Sources */,
2081 D2029C951E6EADE10027CD92 /* UIWebView+AFNetworking.m in Sources */, 2081 D2029C951E6EADE10027CD92 /* UIWebView+AFNetworking.m in Sources */,
2082 810B650A1E77B39D00133E15 /* LVCFullScreenPlayerController.m in Sources */, 2082 810B650A1E77B39D00133E15 /* LVCFullScreenPlayerController.m in Sources */,
LiveVideoCloud/LiveVideoCloud/AppDelegate/AppDelegate.m
@@ -38,10 +38,13 @@ @@ -38,10 +38,13 @@
38 NSLog(@"连接服务器失败-----%ld", errors); 38 NSLog(@"连接服务器失败-----%ld", errors);
39 }]; 39 }];
40 */ 40 */
41 - // 20170327 20170328 41 +
42 /* 42 /*
  43 + CNLiveChatUserInfo *userInfo = [[CNLiveChatUserInfo alloc] initWithUserId:@"20170311" name:@"zzllzzzll" portrait:@"https://y3.cnliveimg.com/mobile/images/mobilehead/2017/03/30/1490844962259_small.jpg"];
43 */ 44 */
44 - CNLiveChatUserInfo *userInfo = [[CNLiveChatUserInfo alloc] initWithUserId:@"20170328" name:@"20170328" portrait:@""]; 45 +
  46 + // 20170327 20170328
  47 + CNLiveChatUserInfo *userInfo = [[CNLiveChatUserInfo alloc] initWithUserId:@"20170311" name:@"zzllzzzll" portrait:@"https://y3.cnliveimg.com/mobile/images/mobilehead/2017/03/30/1490844962259_small.jpg"];
45 [[CNLiveChatManager sharedCNLiveChatManager] loginServer:userInfo success:^(NSString *userId) { 48 [[CNLiveChatManager sharedCNLiveChatManager] loginServer:userInfo success:^(NSString *userId) {
46 NSLog(@"连接服务器-----success"); 49 NSLog(@"连接服务器-----success");
47 50
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatView.h
@@ -24,5 +24,4 @@ @@ -24,5 +24,4 @@
24 24
25 - (void)sendMsgWithMessage:(NSString *)message; 25 - (void)sendMsgWithMessage:(NSString *)message;
26 26
27 -  
28 @end 27 @end
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatView.m
@@ -75,23 +75,23 @@ @@ -75,23 +75,23 @@
75 75
76 LVCMessage *msg = [LVCMessage messageWihtContent:message isRight:YES]; 76 LVCMessage *msg = [LVCMessage messageWihtContent:message isRight:YES];
77 dispatch_sync(dispatch_get_main_queue(), ^{ 77 dispatch_sync(dispatch_get_main_queue(), ^{
78 - [self addData:msg];  
79 if (self.delegate && [self.delegate respondsToSelector:@selector(lvcChatView:sendBarrageWithModel:)]) { 78 if (self.delegate && [self.delegate respondsToSelector:@selector(lvcChatView:sendBarrageWithModel:)]) {
80 [self.delegate lvcChatView:self sendBarrageWithModel:model]; 79 [self.delegate lvcChatView:self sendBarrageWithModel:model];
81 } 80 }
  81 + [self addData:msg];
82 }); 82 });
83 83
84 - NSLog(@"电视台--发送消息---success-(%@)",msg.content);  
85 -  
86 } error:^(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId) { 84 } error:^(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId) {
87 NSLog(@"电视台--发送消息---failed-(%ld)",(long)errors); 85 NSLog(@"电视台--发送消息---failed-(%ld)",(long)errors);
88 - 86 + [SVProgressHUD showInfoWithStatus:@"抱歉,消息发送失败~"];
89 }]; 87 }];
90 } 88 }
91 89
92 //退出聊天室 90 //退出聊天室
93 - (void)quit 91 - (void)quit
94 { 92 {
  93 + if (!_roomId) return; //如果聊天室不存在,不作处理
  94 +
95 [[CNLiveChatManager sharedCNLiveChatManager] quitChatRoom:_roomId success:^(NSString *targetId) { 95 [[CNLiveChatManager sharedCNLiveChatManager] quitChatRoom:_roomId success:^(NSString *targetId) {
96 NSLog(@"电视台--退出聊天室---success-%@",targetId); 96 NSLog(@"电视台--退出聊天室---success-%@",targetId);
97 } error:^(CNLiveChatErrorCode errors, NSString *targetId) { 97 } error:^(CNLiveChatErrorCode errors, NSString *targetId) {
@@ -106,12 +106,19 @@ @@ -106,12 +106,19 @@
106 //接收消息 106 //接收消息
107 dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 107 dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
108 dispatch_async(globalQueue, ^{ 108 dispatch_async(globalQueue, ^{
109 - LVCMessage *msg = [LVCMessage messageWihtContent:message isRight:NO]; 109 + NSString *myUserId = [CNLiveChatManager sharedCNLiveChatManager].currentUserInfo.userId;
  110 +
  111 + LVCMessage *msg;
  112 + if ([message.userInfo.userId isEqualToString:myUserId]) {
  113 + msg = [LVCMessage messageWihtContent:message isRight:YES];
  114 + } else {
  115 + msg = [LVCMessage messageWihtContent:message isRight:NO];
  116 + }
110 117
111 chatMsgModel *model = [[chatMsgModel alloc] init]; 118 chatMsgModel *model = [[chatMsgModel alloc] init];
112 model.content = message.messageContent; 119 model.content = message.messageContent;
113 model.isMine = NO; 120 model.isMine = NO;
114 - 121 +
115 dispatch_sync(dispatch_get_main_queue(), ^{ 122 dispatch_sync(dispatch_get_main_queue(), ^{
116 [self addData:msg]; 123 [self addData:msg];
117 if (self.delegate && [self.delegate respondsToSelector:@selector(lvcChatView:sendBarrageWithModel:)]) { 124 if (self.delegate && [self.delegate respondsToSelector:@selector(lvcChatView:sendBarrageWithModel:)]) {
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatViewTableViewCell.m
@@ -51,13 +51,15 @@ @@ -51,13 +51,15 @@
51 _bgImageView.frame = message.popFrame; 51 _bgImageView.frame = message.popFrame;
52 _messageLab.text = message.content; 52 _messageLab.text = message.content;
53 _messageLab.frame = message.contentFrame; 53 _messageLab.frame = message.contentFrame;
54 - _nickNameLab.frame = message.nikenameFrame;  
55 _iconImageView.frame = message.portraitsFrame; 54 _iconImageView.frame = message.portraitsFrame;
56 [_iconImageView sd_setImageWithURL:[NSURL URLWithString:message.portraits] placeholderImage:[UIImage imageNamed:@"touxiang"]]; 55 [_iconImageView sd_setImageWithURL:[NSURL URLWithString:message.portraits] placeholderImage:[UIImage imageNamed:@"touxiang"]];
57 _lineLab.hidden = YES; 56 _lineLab.hidden = YES;
  57 + _nickNameLab.hidden = YES;
58 58
59 } else { //收到的消息 59 } else { //收到的消息
60 60
  61 + _lineLab.hidden = NO;
  62 + _nickNameLab.hidden = NO;
61 UIImage *bgImage = [UIImage imageNamed:@"Gift box"]; 63 UIImage *bgImage = [UIImage imageNamed:@"Gift box"];
62 bgImage = [bgImage stretchableImageWithLeftCapWidth:10 topCapHeight:27]; 64 bgImage = [bgImage stretchableImageWithLeftCapWidth:10 topCapHeight:27];
63 _bgImageView.image = bgImage; 65 _bgImageView.image = bgImage;
@@ -65,7 +67,6 @@ @@ -65,7 +67,6 @@
65 _nickNameLab.text = message.nikename; 67 _nickNameLab.text = message.nikename;
66 _nickNameLab.frame = message.nikenameFrame; 68 _nickNameLab.frame = message.nikenameFrame;
67 _lineLab.frame = message.lineFrame; 69 _lineLab.frame = message.lineFrame;
68 - _lineLab.hidden = NO;  
69 [_iconImageView sd_setImageWithURL:[NSURL URLWithString:message.portraits] placeholderImage:[UIImage imageNamed:@"touxiang"]]; 70 [_iconImageView sd_setImageWithURL:[NSURL URLWithString:message.portraits] placeholderImage:[UIImage imageNamed:@"touxiang"]];
70 _iconImageView.frame = message.portraitsFrame; 71 _iconImageView.frame = message.portraitsFrame;
71 _messageLab.text = message.content; 72 _messageLab.text = message.content;
@@ -80,6 +81,8 @@ @@ -80,6 +81,8 @@
80 { 81 {
81 if (!_iconImageView) { 82 if (!_iconImageView) {
82 _iconImageView = [[UIImageView alloc] init]; 83 _iconImageView = [[UIImageView alloc] init];
  84 + _iconImageView.layer.masksToBounds = YES;
  85 + _iconImageView.layer.cornerRadius = HEAD_SIZE/2;
83 } 86 }
84 return _iconImageView; 87 return _iconImageView;
85 } 88 }
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCMessage.h
@@ -23,7 +23,6 @@ @@ -23,7 +23,6 @@
23 23
24 @property (nonatomic, assign, readonly) BOOL isRight; //是否是接收者 24 @property (nonatomic, assign, readonly) BOOL isRight; //是否是接收者
25 25
26 -  
27 //构造消息对象 -- 消息文本 26 //构造消息对象 -- 消息文本
28 + (instancetype)messageWihtContent:(CNLiveChatMessage *)content isRight:(BOOL)isRight; 27 + (instancetype)messageWihtContent:(CNLiveChatMessage *)content isRight:(BOOL)isRight;
29 28
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCMessage.m
@@ -12,6 +12,8 @@ @@ -12,6 +12,8 @@
12 #define ICON_TOP_SPACE 8.0 //头像与cell间距 12 #define ICON_TOP_SPACE 8.0 //头像与cell间距
13 #define POP_TOP_SPACE 10 //pop与cell间距 13 #define POP_TOP_SPACE 10 //pop与cell间距
14 14
  15 +#define KScreenWidth ([UIScreen mainScreen].bounds.size.width > [UIScreen mainScreen].bounds.size.height ? [UIScreen mainScreen].bounds.size.height : [UIScreen mainScreen].bounds.size.width)
  16 +
15 @interface LVCMessage () 17 @interface LVCMessage ()
16 18
17 @property (nonatomic, strong) NSString *nikename; //昵称 19 @property (nonatomic, strong) NSString *nikename; //昵称
@@ -39,34 +41,38 @@ @@ -39,34 +41,38 @@
39 msg.nikename = content.userInfo.name; 41 msg.nikename = content.userInfo.name;
40 msg.portraits = content.userInfo.portraitUri; 42 msg.portraits = content.userInfo.portraitUri;
41 43
42 - CGFloat width = SCREEN_WIDTH > SCREEN_HEIGHT ? SCREEN_HEIGHT : SCREEN_WIDTH; 44 + CGRect contentRect = [msg.content boundingRectWithSize:CGSizeMake((KScreenWidth-60)*0.8, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14]} context:nil];
  45 +
  46 + CGRect nameRect = [msg.nikename boundingRectWithSize:CGSizeMake((KScreenWidth-60)*0.8, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:10]} context:nil];
43 47
44 - CGRect rect = [msg.content boundingRectWithSize:CGSizeMake((width-60)*0.8, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14]} context:nil];  
45 CGRect frameOfLabel = CGRectZero; 48 CGRect frameOfLabel = CGRectZero;
46 49
47 - frameOfLabel.size = rect.size; 50 + frameOfLabel.size = contentRect.size;
48 51
49 if (isRight) { //我的消息 52 if (isRight) { //我的消息
50 53
51 - msg.portraitsFrame = CGRectMake(SCREEN_WIDTH-45, ICON_TOP_SPACE, ICON_WIDTH, ICON_WIDTH); 54 + msg.portraitsFrame = CGRectMake(KScreenWidth-45, ICON_TOP_SPACE, ICON_WIDTH, ICON_WIDTH);
52 55
53 - msg.popFrame = CGRectMake(SCREEN_WIDTH-60-CGRectGetWidth(rect)-POP_TOP_SPACE, POP_TOP_SPACE, CGRectGetWidth(rect)+2*POP_TOP_SPACE, CGRectGetHeight(rect)+2*POP_TOP_SPACE); 56 + msg.popFrame = CGRectMake(KScreenWidth-60-CGRectGetWidth(contentRect)-POP_TOP_SPACE, POP_TOP_SPACE, CGRectGetWidth(contentRect)+2*POP_TOP_SPACE, CGRectGetHeight(contentRect)+2*POP_TOP_SPACE);
54 57
55 - msg.contentFrame = CGRectMake(POP_TOP_SPACE, POP_TOP_SPACE, CGRectGetWidth(rect), CGRectGetHeight(rect)); 58 + msg.contentFrame = CGRectMake(POP_TOP_SPACE, POP_TOP_SPACE, CGRectGetWidth(contentRect), CGRectGetHeight(contentRect));
56 59
57 msg.cellHeight = CGRectGetHeight(msg.popFrame)+20; 60 msg.cellHeight = CGRectGetHeight(msg.popFrame)+20;
58 61
59 } else { //收到的消息 62 } else { //收到的消息
60 63
61 - msg.nikenameFrame = CGRectMake(POP_TOP_SPACE, ICON_TOP_SPACE, CGRectGetWidth(rect), 12); 64 + CGFloat maxWith = CGRectGetWidth(nameRect) > CGRectGetWidth(contentRect) ? CGRectGetWidth(nameRect) : CGRectGetWidth(contentRect);
  65 + CGFloat popWidth = maxWith + 2*POP_TOP_SPACE;
  66 +
  67 + msg.nikenameFrame = CGRectMake(POP_TOP_SPACE, ICON_TOP_SPACE, popWidth, 12);
62 68
63 - msg.lineFrame = CGRectMake(POP_TOP_SPACE, 25, CGRectGetWidth(rect), 0.5); 69 + msg.lineFrame = CGRectMake(POP_TOP_SPACE, 25, maxWith, 0.5);
64 70
65 msg.portraitsFrame = CGRectMake(10, ICON_TOP_SPACE , ICON_WIDTH, ICON_WIDTH); 71 msg.portraitsFrame = CGRectMake(10, ICON_TOP_SPACE , ICON_WIDTH, ICON_WIDTH);
66 72
67 - msg.popFrame = CGRectMake(50, POP_TOP_SPACE , CGRectGetWidth(rect)+2*POP_TOP_SPACE, CGRectGetHeight(rect)+2*POP_TOP_SPACE+20); 73 + msg.popFrame = CGRectMake(50, POP_TOP_SPACE , popWidth, CGRectGetHeight(contentRect)+2*POP_TOP_SPACE+20);
68 74
69 - msg.contentFrame = CGRectMake(POP_TOP_SPACE, 30, CGRectGetWidth(rect), CGRectGetHeight(rect)); 75 + msg.contentFrame = CGRectMake(POP_TOP_SPACE, 30, CGRectGetWidth(contentRect), CGRectGetHeight(contentRect));
70 76
71 msg.cellHeight = CGRectGetHeight(msg.popFrame)+20; 77 msg.cellHeight = CGRectGetHeight(msg.popFrame)+20;
72 78
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCLivePlayerController.m
@@ -59,7 +59,7 @@ @@ -59,7 +59,7 @@
59 [super viewDidLoad]; 59 [super viewDidLoad];
60 self.view.backgroundColor = [UIColor blackColor]; 60 self.view.backgroundColor = [UIColor blackColor];
61 61
62 - _roomId = @"778899"; 62 + _roomId = [NSString stringWithFormat:@"syn%@",self.model.docID];
63 playerFrame = CGRectMake(0, 20, SCREEN_WIDTH, SCREEN_WIDTH*9/16); 63 playerFrame = CGRectMake(0, 20, SCREEN_WIDTH, SCREEN_WIDTH*9/16);
64 _originalDirection = 0; 64 _originalDirection = 0;
65 65
@@ -213,7 +213,7 @@ @@ -213,7 +213,7 @@
213 213
214 //旋转至半屏 214 //旋转至半屏
215 - (void)toHalfScreenWithrotationAngle:(CGFloat)angle 215 - (void)toHalfScreenWithrotationAngle:(CGFloat)angle
216 -{ 216 +{
217 _player.isFullScreen = NO; 217 _player.isFullScreen = NO;
218 _inputView.hidden = NO; 218 _inputView.hidden = NO;
219 219
@@ -260,8 +260,9 @@ @@ -260,8 +260,9 @@
260 //退出聊天室 260 //退出聊天室
261 [[CNLiveChatManager sharedCNLiveChatManager] quitChatRoom:_roomId success:NULL error:NULL]; 261 [[CNLiveChatManager sharedCNLiveChatManager] quitChatRoom:_roomId success:NULL error:NULL];
262 262
  263 + [self removeViews];
  264 +
263 self.navigationController.navigationBar.hidden = NO; 265 self.navigationController.navigationBar.hidden = NO;
264 - self.tabBarController.tabBar.hidden = NO;  
265 [self.navigationController popViewControllerAnimated:YES]; 266 [self.navigationController popViewControllerAnimated:YES];
266 } 267 }
267 } 268 }
@@ -311,6 +312,17 @@ @@ -311,6 +312,17 @@
311 [self.view endEditing:YES]; 312 [self.view endEditing:YES];
312 } 313 }
313 314
  315 +- (void)removeViews
  316 +{
  317 + [_player removeFromSuperview];
  318 + [_chatView removeFromSuperview];
  319 + [_inputView removeFromSuperview];
  320 + _player = nil;
  321 + _chatView = nil;
  322 + _inputView = nil;
  323 + _player.delegate = nil;
  324 + [[NSNotificationCenter defaultCenter] removeObserver:self];
  325 +}
314 326
315 #pragma mark - 327 #pragma mark -
316 #pragma mark - makeConstraints 328 #pragma mark - makeConstraints
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCMoreProgramViewController.m
@@ -9,6 +9,8 @@ @@ -9,6 +9,8 @@
9 #import "LVCMoreProgramViewController.h" 9 #import "LVCMoreProgramViewController.h"
10 #import "LVCMoreSortTableViewCell.h" 10 #import "LVCMoreSortTableViewCell.h"
11 #import "LVCProgramModel.h" 11 #import "LVCProgramModel.h"
  12 +#import "LVCChannelsModel.h"
  13 +#import "LVCLivePlayerController.h"
12 14
13 @interface LVCMoreProgramViewController ()<UITableViewDelegate,UITableViewDataSource> 15 @interface LVCMoreProgramViewController ()<UITableViewDelegate,UITableViewDataSource>
14 { 16 {
@@ -132,6 +134,12 @@ @@ -132,6 +134,12 @@
132 { 134 {
133 [tableView deselectRowAtIndexPath:indexPath animated:YES]; 135 [tableView deselectRowAtIndexPath:indexPath animated:YES];
134 136
  137 + LVCChannelDetailsModel *details = _data[indexPath.row];
  138 + LVCLivePlayerController *playVC = [[LVCLivePlayerController alloc] init];
  139 + playVC.model = details;
  140 + self.navigationController.navigationBar.hidden = YES;
  141 + self.hidesBottomBarWhenPushed = YES;
  142 + [self.navigationController pushViewController:playVC animated:YES];
135 } 143 }
136 144
137 #pragma mark - 145 #pragma mark -
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Model/LVCBannerModel.h deleted 100644 → 0
1 -//  
2 -// LVCBannerModel.h  
3 -// LiveVideoCloud  
4 -//  
5 -// Created by iOS on 17/3/27.  
6 -// Copyright © 2017年 cnlive. All rights reserved.  
7 -//  
8 -  
9 -#import <Foundation/Foundation.h>  
10 -  
11 -@interface LVCBannerModel : NSObject  
12 -  
13 -  
14 -@property (nonatomic, copy) NSString *img; // 滚动图片 url  
15 -@property (nonatomic, copy) NSString *title; // 滚动小标题  
16 -@property (nonatomic, copy) NSString *type;  
17 -@property (nonatomic, copy) NSString *mediaId;  
18 -@property (nonatomic, copy) NSString *docID;  
19 -@property (nonatomic, copy) NSString *activityId;  
20 -@property (nonatomic, copy) NSString *url;  
21 -@property (nonatomic, copy) NSString *subTitle;  
22 -@property (nonatomic, copy) NSString *currentPlay; // 正在直播  
23 -@property (nonatomic, copy) NSString *nextPlay; // 即将直播  
24 -  
25 -@end  
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Model/LVCBannerModel.m deleted 100644 → 0
1 -//  
2 -// LVCBannerModel.m  
3 -// LiveVideoCloud  
4 -//  
5 -// Created by iOS on 17/3/27.  
6 -// Copyright © 2017年 cnlive. All rights reserved.  
7 -//  
8 -  
9 -#import "LVCBannerModel.h"  
10 -  
11 -@implementation LVCBannerModel  
12 -  
13 -- (void)setValue:(id)value forUndefinedKey:(NSString *)key{}  
14 -  
15 -@end  
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCFirstHeaderReusableView.h
@@ -7,11 +7,11 @@ @@ -7,11 +7,11 @@
7 // 7 //
8 8
9 #import <UIKit/UIKit.h> 9 #import <UIKit/UIKit.h>
10 -#import "LVCBannerModel.h" 10 +#import "LVCChannelDetailsModel.h"
11 11
12 @interface LVCFirstHeaderReusableView : UICollectionReusableView 12 @interface LVCFirstHeaderReusableView : UICollectionReusableView
13 13
14 @property (nonatomic, strong) NSArray <NSURL *> *imageUrls; 14 @property (nonatomic, strong) NSArray <NSURL *> *imageUrls;
15 -@property (nonatomic, strong) NSArray <LVCBannerModel *> *modelArray; 15 +@property (nonatomic, strong) NSArray <LVCChannelDetailsModel *> *modelArray;
16 16
17 @end 17 @end
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCFirstHeaderReusableView.m
@@ -77,7 +77,7 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -77,7 +77,7 @@ static NSString *cellId = @&quot;cellId&quot;;
77 [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes]; 77 [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
78 } 78 }
79 79
80 -- (void)setModelArray:(NSArray<LVCBannerModel *> *)modelArray { 80 +- (void)setModelArray:(NSArray<LVCChannelDetailsModel *> *)modelArray {
81 _modelArray = modelArray; 81 _modelArray = modelArray;
82 self.cycleViewTitle.text = [NSString stringWithFormat:@" %@",_modelArray[0].title]; 82 self.cycleViewTitle.text = [NSString stringWithFormat:@" %@",_modelArray[0].title];
83 } 83 }
@@ -195,11 +195,15 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -195,11 +195,15 @@ static NSString *cellId = @&quot;cellId&quot;;
195 // 选择 195 // 选择
196 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 196 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
197 { 197 {
198 - /*  
199 - LVCBannerModel *model = self.modelArray[indexPath.row % 5];  
200 - LVCLivePlayerController *player = [[LVCLivePlayerController alloc]init];  
201 - [self.viewController.navigationController pushViewController:player animated:YES];  
202 - */ 198 +
  199 + LVCChannelDetailsModel *details = [_modelArray safetyObjectAtIndex:indexPath.row % 5];
  200 + self.viewController.tabBarController.tabBar.hidden = YES;
  201 + LVCLivePlayerController *playVC = [[LVCLivePlayerController alloc] init];
  202 + playVC.model = details;
  203 + self.viewController.navigationController.navigationBar.hidden = YES;
  204 + self.viewController.hidesBottomBarWhenPushed = YES;
  205 + [self.viewController.navigationController pushViewController:playVC animated:YES];
  206 + self.viewController.hidesBottomBarWhenPushed = NO;
203 } 207 }
204 208
205 #pragma mark - 第一个组头设置界面 209 #pragma mark - 第一个组头设置界面
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCPlayer.m
@@ -10,22 +10,22 @@ @@ -10,22 +10,22 @@
10 #import "LVCPlayerLoadingView.h" 10 #import "LVCPlayerLoadingView.h"
11 #import "SevenSwitch.h" 11 #import "SevenSwitch.h"
12 12
13 -@interface LVCPlayer ()<UIGestureRecognizerDelegate> 13 +@interface LVCPlayer ()<UIGestureRecognizerDelegate,LVCPlayerLoadingViewDelegate>
14 { 14 {
15 LVCChannelDetailsModel *_model; 15 LVCChannelDetailsModel *_model;
16 } 16 }
17 17
  18 +@property (nonatomic, strong) CNLiveMoviePlayerController *player;
18 @property (nonatomic, strong) UIButton *backBtn; //返回 19 @property (nonatomic, strong) UIButton *backBtn; //返回
19 @property (nonatomic, strong) UIButton *playOrPauseBtn; //播放/暂停 20 @property (nonatomic, strong) UIButton *playOrPauseBtn; //播放/暂停
20 @property (nonatomic, strong) UILabel *titleLab; //标题 21 @property (nonatomic, strong) UILabel *titleLab; //标题
21 @property (nonatomic, strong) UIButton *fullScreenBtn; //控制全屏按钮 22 @property (nonatomic, strong) UIButton *fullScreenBtn; //控制全屏按钮
22 @property (nonatomic, strong) UITapGestureRecognizer *singleTap; //单击手势 23 @property (nonatomic, strong) UITapGestureRecognizer *singleTap; //单击手势
23 @property (nonatomic, strong) LVCPlayerLoadingView *loadingView; //加载图 24 @property (nonatomic, strong) LVCPlayerLoadingView *loadingView; //加载图
24 -@property (nonatomic, strong) CNLiveMoviePlayerController *player;  
25 @property (nonatomic, strong) SevenSwitch *barrageSwitch; //弹幕开关 25 @property (nonatomic, strong) SevenSwitch *barrageSwitch; //弹幕开关
26 @property (nonatomic, strong) UIButton *editBtn; //全屏编辑按钮 26 @property (nonatomic, strong) UIButton *editBtn; //全屏编辑按钮
27 -  
28 @property (nonatomic, strong) NSTimer *timer; //控制上下工具条定时器 27 @property (nonatomic, strong) NSTimer *timer; //控制上下工具条定时器
  28 +
29 @end 29 @end
30 30
31 @implementation LVCPlayer 31 @implementation LVCPlayer
@@ -61,7 +61,8 @@ @@ -61,7 +61,8 @@
61 { 61 {
62 /* 62 /*
63 */ 63 */
64 - _player = [[CNLiveMoviePlayerController alloc] initLivePlayWithChannelId:[NSString stringWithFormat:@"82_%@",model.mediaId] authSuccess:^{ 64 + NSString *channelId = [NSString stringWithFormat:@"82_%@",model.mediaId];
  65 + _player = [[CNLiveMoviePlayerController alloc] initLivePlayWithChannelId:channelId authSuccess:^{
65 [self addObservers]; 66 [self addObservers];
66 _player.videoDecoderMode = CNLiveMovieVideoDecoderMode_AUTO; 67 _player.videoDecoderMode = CNLiveMovieVideoDecoderMode_AUTO;
67 _player.shouldAutoplay = YES; 68 _player.shouldAutoplay = YES;
@@ -73,6 +74,9 @@ @@ -73,6 +74,9 @@
73 74
74 } authFailed:^(NSDictionary *errorInfo) { 75 } authFailed:^(NSDictionary *errorInfo) {
75 NSLog(@"初始化点播播放器失败%@", errorInfo); 76 NSLog(@"初始化点播播放器失败%@", errorInfo);
  77 + [SVProgressHUD showInfoWithStatus:@"抱歉,加载失败~"];
  78 + [_loadingView stopLoading];
  79 +
76 } getAnchorStatusResult:NULL]; 80 } getAnchorStatusResult:NULL];
77 81
78 /* 82 /*
@@ -199,6 +203,14 @@ @@ -199,6 +203,14 @@
199 } 203 }
200 } 204 }
201 205
  206 +#pragma mark -
  207 +#pragma mark - LVCPlayerLoadingViewDelegate
  208 +- (void)retryBtnClick
  209 +{
  210 + [_loadingView startLoading];
  211 + [_player reload:nil];
  212 +}
  213 +
202 #pragma mark - UIGestureRecognizerDelegate 手势冲突 214 #pragma mark - UIGestureRecognizerDelegate 手势冲突
203 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 215 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
204 if ([NSStringFromClass([touch.view class]) isEqualToString:@"SevenSwitch"]) { 216 if ([NSStringFromClass([touch.view class]) isEqualToString:@"SevenSwitch"]) {
@@ -267,8 +279,9 @@ @@ -267,8 +279,9 @@
267 if (_player) { 279 if (_player) {
268 int reason = [[[notification userInfo] valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue]; 280 int reason = [[[notification userInfo] valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue];
269 if (MPMovieFinishReasonPlaybackError == reason) { 281 if (MPMovieFinishReasonPlaybackError == reason) {
  282 + _loadingView.hidden = NO;
270 } else { 283 } else {
271 -// _loadingView.retryBtn.hidden = YES; 284 + _loadingView.hidden = YES;
272 } 285 }
273 286
274 switch (reason) 287 switch (reason)
@@ -305,7 +318,7 @@ @@ -305,7 +318,7 @@
305 318
306 if (_player.playbackState == MPMoviePlaybackStatePlaying) { 319 if (_player.playbackState == MPMoviePlaybackStatePlaying) {
307 _playOrPauseBtn.selected = YES; 320 _playOrPauseBtn.selected = YES;
308 - [self.loadingView retry]; 321 + _loadingView.hidden = YES;
309 } else { 322 } else {
310 _playOrPauseBtn.selected = NO; 323 _playOrPauseBtn.selected = NO;
311 } 324 }
@@ -511,8 +524,7 @@ @@ -511,8 +524,7 @@
511 { 524 {
512 if (!_contentView) { 525 if (!_contentView) {
513 _contentView = [[UIImageView alloc] init]; 526 _contentView = [[UIImageView alloc] init];
514 - _contentView.image = [UIImage imageNamed:@""];  
515 - _contentView.backgroundColor = [UIColor lightGrayColor]; 527 + _contentView.backgroundColor = [UIColor blackColor];
516 _contentView.userInteractionEnabled = YES; 528 _contentView.userInteractionEnabled = YES;
517 } 529 }
518 return _contentView; 530 return _contentView;
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCPlayerLoadingView.m
@@ -119,11 +119,11 @@ @@ -119,11 +119,11 @@
119 if (!_retryBtn) { 119 if (!_retryBtn) {
120 _retryBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 120 _retryBtn = [UIButton buttonWithType:UIButtonTypeCustom];
121 [_retryBtn setTitle:@"重试" forState:UIControlStateNormal]; 121 [_retryBtn setTitle:@"重试" forState:UIControlStateNormal];
122 - [_retryBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 122 + [_retryBtn setTitleColor:[UIColor yellowColor] forState:UIControlStateNormal];
123 _retryBtn.hidden = YES; 123 _retryBtn.hidden = YES;
124 _retryBtn.layer.cornerRadius = 10; 124 _retryBtn.layer.cornerRadius = 10;
125 _retryBtn.layer.masksToBounds = YES; 125 _retryBtn.layer.masksToBounds = YES;
126 - _retryBtn.layer.borderColor = [UIColor blackColor].CGColor; 126 + _retryBtn.layer.borderColor = [UIColor yellowColor].CGColor;
127 _retryBtn.layer.borderWidth = 1; 127 _retryBtn.layer.borderWidth = 1;
128 [_retryBtn addTarget:self action:@selector(retryBtnAction) forControlEvents:UIControlEventTouchUpInside]; 128 [_retryBtn addTarget:self action:@selector(retryBtnAction) forControlEvents:UIControlEventTouchUpInside];
129 } 129 }
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCRequestFailedView.h 0 → 100644
  1 +//
  2 +// LVCRequestFailedView.h
  3 +// LiveVideoCloud
  4 +//
  5 +// Created by iOS on 17/3/30.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <UIKit/UIKit.h>
  10 +
  11 +@class LVCRequestFailedView;
  12 +@protocol LVCRequestFailedViewDelegate <NSObject>
  13 +
  14 +- (void)reloadDataWithView:(LVCRequestFailedView *)view;
  15 +
  16 +@end
  17 +
  18 +@interface LVCRequestFailedView : UIView
  19 +
  20 +@property (nonatomic, assign) id<LVCRequestFailedViewDelegate> delegate;
  21 +
  22 +- (instancetype)initWithFrame:(CGRect)frame words:(NSString *)text;
  23 +
  24 +@end
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCRequestFailedView.m 0 → 100644
  1 +//
  2 +// LVCRequestFailedView.m
  3 +// LiveVideoCloud
  4 +//
  5 +// Created by iOS on 17/3/30.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import "LVCRequestFailedView.h"
  10 +
  11 +@interface LVCRequestFailedView ()<UIGestureRecognizerDelegate>
  12 +{
  13 + NSString *_text;
  14 +}
  15 +
  16 +@property (nonatomic, strong) UIImageView *imageView;
  17 +@property (nonatomic, strong) UILabel *textLab;
  18 +@property (nonatomic, strong) UITapGestureRecognizer *singleTap; //单击手势
  19 +
  20 +@end
  21 +
  22 +@implementation LVCRequestFailedView
  23 +
  24 +- (instancetype)initWithFrame:(CGRect)frame words:(NSString *)text
  25 +{
  26 + self = [super initWithFrame:frame];
  27 + if (self) {
  28 + _text = text;
  29 + [self addSubview:self.imageView];
  30 + [self addSubview:self.textLab];
  31 + [self addGestureRecognizer:self.singleTap];
  32 + }
  33 + return self;
  34 +}
  35 +
  36 +- (void)singleTapView
  37 +{
  38 + self.hidden = YES;
  39 + if (self.delegate && [self.delegate respondsToSelector:@selector(reloadDataWithView:)]) {
  40 + [self.delegate reloadDataWithView:self];
  41 + }
  42 +}
  43 +
  44 +#pragma mark -
  45 +#pragma mark - getter
  46 +- (UIImageView *)imageView
  47 +{
  48 + if (!_imageView) {
  49 + _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.width-(self.width*0.25)/2, self.height*0.2, self.width*0.25, self.width*0.25)];
  50 + _imageView.image = [UIImage imageNamed:@"warn"];
  51 + _imageView.center = self.center;
  52 + }
  53 + return _imageView;
  54 +}
  55 +
  56 +- (UILabel *)textLab
  57 +{
  58 + if (!_textLab) {
  59 + _textLab = [[UILabel alloc] initWithFrame:CGRectMake(0, _imageView.bottom+20, self.width, 20)];
  60 + _textLab.text = _text;
  61 + _textLab.textAlignment = NSTextAlignmentCenter;
  62 + _textLab.textColor = [UIColor lightGrayColor];
  63 + _textLab.font = [UIFont systemFontOfSize:15];
  64 + }
  65 + return _textLab;
  66 +}
  67 +
  68 +- (UITapGestureRecognizer *)singleTap
  69 +{
  70 + if (!_singleTap) {
  71 + _singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapView)];
  72 + _singleTap.delegate = self;
  73 + }
  74 + return _singleTap;
  75 +}
  76 +@end
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCTelevisionView.m
@@ -12,17 +12,16 @@ @@ -12,17 +12,16 @@
12 #import "LVCOtherHeaderReusableView.h" 12 #import "LVCOtherHeaderReusableView.h"
13 #import "LVCChannelDetailsModel.h" 13 #import "LVCChannelDetailsModel.h"
14 #import "LVCChannelsModel.h" 14 #import "LVCChannelsModel.h"
15 -#import "LVCBannerModel.h"  
16 #import "LVCLivePlayerController.h" 15 #import "LVCLivePlayerController.h"
  16 +#import "LVCRequestFailedView.h"
17 17
18 static NSString *cellId = @"LVCLiveListCollectionViewCell"; 18 static NSString *cellId = @"LVCLiveListCollectionViewCell";
19 static NSString *firstHeaderId = @"LVCFirstHeaderReusableView"; 19 static NSString *firstHeaderId = @"LVCFirstHeaderReusableView";
20 static NSString *otherHeaderId = @"LVCOtherHeaderReusableView"; 20 static NSString *otherHeaderId = @"LVCOtherHeaderReusableView";
21 21
22 -@interface LVCTelevisionView ()<UICollectionViewDelegate,UICollectionViewDataSource> 22 +@interface LVCTelevisionView ()<UICollectionViewDelegate,UICollectionViewDataSource,LVCRequestFailedViewDelegate>
23 { 23 {
24 long long _timestamp; 24 long long _timestamp;
25 - NSTimer *_autoRefreshTimer;  
26 CGFloat _refreshTime; 25 CGFloat _refreshTime;
27 NSNotification *_liveNotification; 26 NSNotification *_liveNotification;
28 BOOL _adImageHidden; //开机广告或引导页是否显示完毕 27 BOOL _adImageHidden; //开机广告或引导页是否显示完毕
@@ -32,9 +31,7 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;; @@ -32,9 +31,7 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;;
32 @property (nonatomic, strong) NSArray *bannerModelArray; //banner数据源 31 @property (nonatomic, strong) NSArray *bannerModelArray; //banner数据源
33 @property (nonatomic, strong) NSArray *marqueeModelArray; // 32 @property (nonatomic, strong) NSArray *marqueeModelArray; //
34 @property (nonatomic, strong) NSArray *channelsModelArray; // 33 @property (nonatomic, strong) NSArray *channelsModelArray; //
35 -@property (nonatomic, strong) UIButton *reloadBtn; // 刷新按钮  
36 -@property (nonatomic, strong) UILabel *reloadLab; // 刷新提示文字  
37 -@property (nonatomic, strong) UIImageView *reloadImg; //刷新图片 34 +@property (nonatomic, strong) LVCRequestFailedView *failedView; //请求失败提示view
38 35
39 @end 36 @end
40 37
@@ -48,60 +45,29 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;; @@ -48,60 +45,29 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;;
48 self.backgroundColor = [UIColor lightGrayColor]; 45 self.backgroundColor = [UIColor lightGrayColor];
49 46
50 [self loadData]; 47 [self loadData];
51 -  
52 -// _timestamp = [[self timestamp] longLongValue];  
53 -// if (_refreshTime != 0) {  
54 -// _autoRefreshTimer = [NSTimer scheduledTimerWithTimeInterval:_refreshTime target:self selector:@selector(autoRefresh) userInfo:nil repeats:YES];  
55 -// }  
56 - 48 + [self.collectionView addSubview:self.failedView];
57 [self addSubview:self.collectionView]; 49 [self addSubview:self.collectionView];
58 [self.collectionView.header beginRefreshing]; 50 [self.collectionView.header beginRefreshing];
59 51
60 -  
61 } 52 }
62 return self; 53 return self;
63 } 54 }
64 55
65 #pragma mark - 56 #pragma mark -
66 #pragma mark - action 57 #pragma mark - action
67 -- (void)reloadBtnAction  
68 -{  
69 - // [self.reloadBtn removeFromSuperview];  
70 - // [self.collectionView.header beginRefreshing];  
71 - [self refresh];  
72 -}  
73 -  
74 - (void)refresh 58 - (void)refresh
75 { 59 {
76 - [self.reloadBtn removeFromSuperview];  
77 [self loadData]; 60 [self loadData];
78 } 61 }
79 62
80 -- (void)isNeedToRefresh  
81 -{  
82 - if (_refreshTime != 0) {  
83 - [_autoRefreshTimer invalidate];  
84 - _autoRefreshTimer = nil;  
85 - _autoRefreshTimer = [NSTimer scheduledTimerWithTimeInterval:_refreshTime target:self selector:@selector(autoRefresh) userInfo:nil repeats:YES];  
86 - }  
87 - long long timestamp = [[self timestamp] longLongValue];  
88 - if (timestamp-_timestamp > 180000) {  
89 - [self.collectionView.header beginRefreshing];  
90 - }  
91 -}  
92 -  
93 -- (void)autoRefresh 63 +#pragma mark -
  64 +#pragma mark - LVCRequestFailedViewDelegate
  65 +- (void)reloadDataWithView:(LVCRequestFailedView *)view
94 { 66 {
95 [self.collectionView.header beginRefreshing]; 67 [self.collectionView.header beginRefreshing];
96 [self loadData]; 68 [self loadData];
97 } 69 }
98 70
99 -- (void)stopAutoRefresh  
100 -{  
101 - [_autoRefreshTimer invalidate];  
102 - _autoRefreshTimer = nil;  
103 -}  
104 -  
105 #pragma mark - 71 #pragma mark -
106 #pragma mark - UICollectionViewDataSource 72 #pragma mark - UICollectionViewDataSource
107 - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { 73 - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
@@ -167,7 +133,7 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;; @@ -167,7 +133,7 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;;
167 - (NSArray <NSURL *>*)bannerImage { 133 - (NSArray <NSURL *>*)bannerImage {
168 134
169 NSMutableArray *arrayM = [NSMutableArray array]; 135 NSMutableArray *arrayM = [NSMutableArray array];
170 - for (LVCBannerModel *model in _bannerModelArray) { 136 + for (LVCChannelDetailsModel *model in _bannerModelArray) {
171 NSString *imgStr = model.img; 137 NSString *imgStr = model.img;
172 NSURL *url = [NSURL URLWithString:imgStr]; 138 NSURL *url = [NSURL URLWithString:imgStr];
173 [arrayM addObject:url]; 139 [arrayM addObject:url];
@@ -190,18 +156,20 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;; @@ -190,18 +156,20 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;;
190 156
191 LVCChannelsModel *model = _channelsModelArray[indexPath.section - 1]; 157 LVCChannelsModel *model = _channelsModelArray[indexPath.section - 1];
192 LVCChannelDetailsModel *details = model.programs[indexPath.item]; 158 LVCChannelDetailsModel *details = model.programs[indexPath.item];
193 - self.viewController.tabBarController.tabBar.hidden = YES;  
194 - 159 + self.viewController.hidesBottomBarWhenPushed = YES;
195 LVCLivePlayerController *playVC = [[LVCLivePlayerController alloc] init]; 160 LVCLivePlayerController *playVC = [[LVCLivePlayerController alloc] init];
196 playVC.model = details; 161 playVC.model = details;
197 self.viewController.navigationController.navigationBar.hidden = YES; 162 self.viewController.navigationController.navigationBar.hidden = YES;
198 [self.viewController.navigationController pushViewController:playVC animated:YES]; 163 [self.viewController.navigationController pushViewController:playVC animated:YES];
  164 + self.viewController.hidesBottomBarWhenPushed = NO;
199 } 165 }
200 166
201 #pragma mark - 167 #pragma mark -
202 #pragma mark - 加载数据 168 #pragma mark - 加载数据
203 - (void)loadData { 169 - (void)loadData {
204 170
  171 + _failedView.hidden = YES;
  172 +
205 NSDictionary *parameter = @{@"cid": @"zb/", 173 NSDictionary *parameter = @{@"cid": @"zb/",
206 @"plat":@"i", 174 @"plat":@"i",
207 @"appid":@"spzg", 175 @"appid":@"spzg",
@@ -209,11 +177,6 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;; @@ -209,11 +177,6 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;;
209 177
210 [[AFHTTPSessionManager manager] GET:@"http://app.jczb.cnlive.com/api/appindex?appid=spzg&cid=zb%2F&plat=i&version=1" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 178 [[AFHTTPSessionManager manager] GET:@"http://app.jczb.cnlive.com/api/appindex?appid=spzg&cid=zb%2F&plat=i&version=1" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
211 _timestamp = [[self timestamp] longLongValue]; 179 _timestamp = [[self timestamp] longLongValue];
212 -// if (_refreshTime != 0) {  
213 -// [_autoRefreshTimer invalidate];  
214 -// _autoRefreshTimer = nil;  
215 -// _autoRefreshTimer = [NSTimer scheduledTimerWithTimeInterval:_refreshTime target:self selector:@selector(autoRefresh) userInfo:nil repeats:YES];  
216 -// }  
217 180
218 [self.collectionView.header endRefreshing]; 181 [self.collectionView.header endRefreshing];
219 182
@@ -230,7 +193,7 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;; @@ -230,7 +193,7 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;;
230 193
231 NSMutableArray *arrayM = [NSMutableArray array]; 194 NSMutableArray *arrayM = [NSMutableArray array];
232 for (NSDictionary *dict in responseObject[@"banner"]) { 195 for (NSDictionary *dict in responseObject[@"banner"]) {
233 - LVCBannerModel *rollModel = [LVCBannerModel mj_objectWithKeyValues:dict]; 196 + LVCChannelDetailsModel *rollModel = [LVCChannelDetailsModel mj_objectWithKeyValues:dict];
234 [arrayM addObject:rollModel]; 197 [arrayM addObject:rollModel];
235 } 198 }
236 self.bannerModelArray = arrayM; 199 self.bannerModelArray = arrayM;
@@ -241,12 +204,12 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;; @@ -241,12 +204,12 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;;
241 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 204 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
242 205
243 [self.collectionView.header endRefreshing]; 206 [self.collectionView.header endRefreshing];
244 -  
245 - NSLog(@"获取电视台数据失败"); 207 + if (self.channelsModelArray.count == 0 && self.bannerModelArray.count == 0) {
  208 + _failedView.hidden = NO;
  209 + }
246 210
247 }]; 211 }];
248 212
249 -  
250 } 213 }
251 214
252 - (NSString *)timestamp { 215 - (NSString *)timestamp {
@@ -287,38 +250,16 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;; @@ -287,38 +250,16 @@ static NSString *otherHeaderId = @&quot;LVCOtherHeaderReusableView&quot;;
287 return _collectionView; 250 return _collectionView;
288 } 251 }
289 252
290 -//- (UIButton *)reloadBtn  
291 -//{  
292 -// if (!_reloadBtn) {  
293 -// _reloadBtn = [Tools getReloadBtn];  
294 -// // _reloadBtn.backgroundColor = [UIColor brownColor];  
295 -// _reloadBtn.x = (self.width-220)/2;  
296 -// _reloadBtn.y = (self.height-[Tools adapterReloadBtnHeight])/2-50;  
297 -// [_reloadBtn addTarget:self action:@selector(reloadBtnAction) forControlEvents:UIControlEventTouchUpInside];  
298 -// [_reloadBtn addSubview:self.reloadImg];  
299 -// [_reloadBtn addSubview:self.reloadLab];  
300 -// }  
301 -// return _reloadBtn;  
302 -//}  
303 -  
304 -//- (UILabel *)reloadLab  
305 -//{  
306 -// if (!_reloadLab) {  
307 -// _reloadLab = [Tools getReloadLab];  
308 -// }  
309 -// return _reloadLab;  
310 -//}  
311 -//- (UIImageView *)reloadImg  
312 -//{  
313 -// if (!_reloadImg) {  
314 -// _reloadImg = [[UIImageView alloc] init];  
315 -// // _reloadImg.backgroundColor = [UIColor redColor];  
316 -// _reloadImg.frame = CGRectMake(_reloadBtn.width/2-[Tools adapterImgWidth]/2+10, 0, [Tools adapterImgWidth], [Tools adapterImgWidth]);  
317 -// }  
318 -// return _reloadImg;  
319 -//}  
320 -  
321 - 253 +- (LVCRequestFailedView *)failedView
  254 +{
  255 + if (!_failedView) {
  256 + _failedView = [[LVCRequestFailedView alloc] initWithFrame:CGRectMake(0, 0, 150, 100) words:@"您的网络不太顺畅哦~"];
  257 + _failedView.center = self.collectionView.center;
  258 + _failedView.delegate = self;
  259 + _failedView.hidden = YES;
  260 + }
  261 + return _failedView;
  262 +}
322 263
323 /* 264 /*
324 // Only override drawRect: if you perform custom drawing. 265 // Only override drawRect: if you perform custom drawing.
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/22.imageset/Contents.json
@@ -4,6 +4,14 @@ @@ -4,6 +4,14 @@
4 "idiom" : "universal", 4 "idiom" : "universal",
5 "filename" : "22.png", 5 "filename" : "22.png",
6 "scale" : "1x" 6 "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
7 } 15 }
8 ], 16 ],
9 "info" : { 17 "info" : {
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/privateChat11.imageset/Contents.json
@@ -4,6 +4,14 @@ @@ -4,6 +4,14 @@
4 "idiom" : "universal", 4 "idiom" : "universal",
5 "filename" : "privateChat11.png", 5 "filename" : "privateChat11.png",
6 "scale" : "1x" 6 "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
7 } 15 }
8 ], 16 ],
9 "info" : { 17 "info" : {
LiveVideoCloud/LiveVideoCloud/animation.xcassets/player/warn.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "warn.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 \ No newline at end of file 22 \ No newline at end of file
LiveVideoCloud/LiveVideoCloud/animation.xcassets/player/warn.imageset/warn.png 0 → 100644

11.3 KB