Commit ebb6074094673413ef2b54297e6b90496f4ebaf4
Merge branch 'master' of bj.gitlab.cnlive.com:ios-team/LiveVideoCloud
Showing
47 changed files
with
1988 additions
and
178 deletions
LiveVideoCloud/LiveVideoCloud.xcodeproj/project.pbxproj
| @@ -25,9 +25,23 @@ | @@ -25,9 +25,23 @@ | ||
| 25 | 811BB6831E8106A2005C6291 /* CNLivePlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 811BB6821E8106A2005C6291 /* CNLivePlayerSDK.framework */; }; | 25 | 811BB6831E8106A2005C6291 /* CNLivePlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 811BB6821E8106A2005C6291 /* CNLivePlayerSDK.framework */; }; |
| 26 | 811BB6851E8106AF005C6291 /* CNLivePlayerSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 811BB6821E8106A2005C6291 /* CNLivePlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; | 26 | 811BB6851E8106AF005C6291 /* CNLivePlayerSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 811BB6821E8106A2005C6291 /* CNLivePlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; |
| 27 | 811BB6881E8107B4005C6291 /* LVCChatViewTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 811BB6871E8107B4005C6291 /* LVCChatViewTableViewCell.m */; }; | 27 | 811BB6881E8107B4005C6291 /* LVCChatViewTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 811BB6871E8107B4005C6291 /* LVCChatViewTableViewCell.m */; }; |
| 28 | - 811BB68B1E8108DB005C6291 /* LVCChatRoomModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 811BB68A1E8108DB005C6291 /* LVCChatRoomModel.m */; }; | ||
| 29 | 811BB68E1E8116C8005C6291 /* NSString+StringSize.m in Sources */ = {isa = PBXBuildFile; fileRef = 811BB68D1E8116C8005C6291 /* NSString+StringSize.m */; }; | 28 | 811BB68E1E8116C8005C6291 /* NSString+StringSize.m in Sources */ = {isa = PBXBuildFile; fileRef = 811BB68D1E8116C8005C6291 /* NSString+StringSize.m */; }; |
| 29 | + 8130911E1E84C0F0005F0BFF /* LVCMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 8130911D1E84C0F0005F0BFF /* LVCMessage.m */; }; | ||
| 30 | 81A1B9A91E8277410079FF5F /* LVCInputView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A1B9A81E8277410079FF5F /* LVCInputView.m */; }; | 30 | 81A1B9A91E8277410079FF5F /* LVCInputView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A1B9A81E8277410079FF5F /* LVCInputView.m */; }; |
| 31 | + 81A482F51E88ACC80097A80A /* LVCTelevisionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A482F41E88ACC80097A80A /* LVCTelevisionView.m */; }; | ||
| 32 | + 81A482F81E88AFA20097A80A /* LVCFirstHeaderReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A482F71E88AFA20097A80A /* LVCFirstHeaderReusableView.m */; }; | ||
| 33 | + 81A483011E88B0130097A80A /* LVCBannerModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A482FE1E88B0130097A80A /* LVCBannerModel.m */; }; | ||
| 34 | + 81A483021E88B0130097A80A /* LVCChatRoomModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483001E88B0130097A80A /* LVCChatRoomModel.m */; }; | ||
| 35 | + 81A483051E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483041E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m */; }; | ||
| 36 | + 81A483081E88B6140097A80A /* UIView+ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483071E88B6140097A80A /* UIView+ViewController.m */; }; | ||
| 37 | + 81A4830B1E88B7EE0097A80A /* LVCOtherHeaderReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A4830A1E88B7EE0097A80A /* LVCOtherHeaderReusableView.m */; }; | ||
| 38 | + 81A4830E1E88B8300097A80A /* LVCChannelsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A4830D1E88B8300097A80A /* LVCChannelsModel.m */; }; | ||
| 39 | + 81A483111E88B8630097A80A /* LVCChannelDetailsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483101E88B8630097A80A /* LVCChannelDetailsModel.m */; }; | ||
| 40 | + 81A483141E88BA420097A80A /* LVCLiveListCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483131E88BA420097A80A /* LVCLiveListCollectionViewCell.m */; }; | ||
| 41 | + 81A483171E88BED00097A80A /* LVCTVLiveViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483161E88BED00097A80A /* LVCTVLiveViewController.m */; }; | ||
| 42 | + 81A4831A1E88E19C0097A80A /* LVCMoreProgramViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A483191E88E19C0097A80A /* LVCMoreProgramViewController.m */; }; | ||
| 43 | + 81A4831D1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A4831C1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m */; }; | ||
| 44 | + 81A483201E88F4BF0097A80A /* LVCProgramModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A4831F1E88F4BF0097A80A /* LVCProgramModel.m */; }; | ||
| 31 | 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */; }; | 45 | 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */; }; |
| 32 | D2029B861E6EAAA50027CD92 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B851E6EAAA50027CD92 /* main.m */; }; | 46 | D2029B861E6EAAA50027CD92 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B851E6EAAA50027CD92 /* main.m */; }; |
| 33 | D2029B911E6EAAA50027CD92 /* animation.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2029B901E6EAAA50027CD92 /* animation.xcassets */; }; | 47 | D2029B911E6EAAA50027CD92 /* animation.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2029B901E6EAAA50027CD92 /* animation.xcassets */; }; |
| @@ -258,12 +272,40 @@ | @@ -258,12 +272,40 @@ | ||
| 258 | 811BB6821E8106A2005C6291 /* CNLivePlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLivePlayerSDK.framework; sourceTree = "<group>"; }; | 272 | 811BB6821E8106A2005C6291 /* CNLivePlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLivePlayerSDK.framework; sourceTree = "<group>"; }; |
| 259 | 811BB6861E8107B4005C6291 /* LVCChatViewTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCChatViewTableViewCell.h; sourceTree = "<group>"; }; | 273 | 811BB6861E8107B4005C6291 /* LVCChatViewTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCChatViewTableViewCell.h; sourceTree = "<group>"; }; |
| 260 | 811BB6871E8107B4005C6291 /* LVCChatViewTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCChatViewTableViewCell.m; sourceTree = "<group>"; }; | 274 | 811BB6871E8107B4005C6291 /* LVCChatViewTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCChatViewTableViewCell.m; sourceTree = "<group>"; }; |
| 261 | - 811BB6891E8108DB005C6291 /* LVCChatRoomModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LVCChatRoomModel.h; path = LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatRoomModel.h; sourceTree = SOURCE_ROOT; }; | ||
| 262 | - 811BB68A1E8108DB005C6291 /* LVCChatRoomModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LVCChatRoomModel.m; path = LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatRoomModel.m; sourceTree = SOURCE_ROOT; }; | ||
| 263 | 811BB68C1E8116C8005C6291 /* NSString+StringSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+StringSize.h"; sourceTree = "<group>"; }; | 275 | 811BB68C1E8116C8005C6291 /* NSString+StringSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+StringSize.h"; sourceTree = "<group>"; }; |
| 264 | 811BB68D1E8116C8005C6291 /* NSString+StringSize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+StringSize.m"; sourceTree = "<group>"; }; | 276 | 811BB68D1E8116C8005C6291 /* NSString+StringSize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+StringSize.m"; sourceTree = "<group>"; }; |
| 277 | + 8130911C1E84C0F0005F0BFF /* LVCMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCMessage.h; sourceTree = "<group>"; }; | ||
| 278 | + 8130911D1E84C0F0005F0BFF /* LVCMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCMessage.m; sourceTree = "<group>"; }; | ||
| 265 | 81A1B9A71E8277410079FF5F /* LVCInputView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCInputView.h; sourceTree = "<group>"; }; | 279 | 81A1B9A71E8277410079FF5F /* LVCInputView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCInputView.h; sourceTree = "<group>"; }; |
| 266 | 81A1B9A81E8277410079FF5F /* LVCInputView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCInputView.m; sourceTree = "<group>"; }; | 280 | 81A1B9A81E8277410079FF5F /* LVCInputView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCInputView.m; sourceTree = "<group>"; }; |
| 281 | + 81A482F31E88ACC80097A80A /* LVCTelevisionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LVCTelevisionView.h; path = LiveVideoCloud/Classes/Sections/homeSections/View/LVCTelevisionView.h; sourceTree = SOURCE_ROOT; }; | ||
| 282 | + 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; }; | ||
| 283 | + 81A482F61E88AFA20097A80A /* LVCFirstHeaderReusableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCFirstHeaderReusableView.h; sourceTree = "<group>"; }; | ||
| 284 | + 81A482F71E88AFA20097A80A /* LVCFirstHeaderReusableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCFirstHeaderReusableView.m; sourceTree = "<group>"; }; | ||
| 285 | + 81A482FD1E88B0130097A80A /* LVCBannerModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCBannerModel.h; sourceTree = "<group>"; }; | ||
| 286 | + 81A482FE1E88B0130097A80A /* LVCBannerModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCBannerModel.m; sourceTree = "<group>"; }; | ||
| 287 | + 81A482FF1E88B0130097A80A /* LVCChatRoomModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCChatRoomModel.h; sourceTree = "<group>"; }; | ||
| 288 | + 81A483001E88B0130097A80A /* LVCChatRoomModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCChatRoomModel.m; sourceTree = "<group>"; }; | ||
| 289 | + 81A483031E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCHeaderRollCollectionViewCell.h; sourceTree = "<group>"; }; | ||
| 290 | + 81A483041E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCHeaderRollCollectionViewCell.m; sourceTree = "<group>"; }; | ||
| 291 | + 81A483061E88B6140097A80A /* UIView+ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+ViewController.h"; sourceTree = "<group>"; }; | ||
| 292 | + 81A483071E88B6140097A80A /* UIView+ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+ViewController.m"; sourceTree = "<group>"; }; | ||
| 293 | + 81A483091E88B7EE0097A80A /* LVCOtherHeaderReusableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCOtherHeaderReusableView.h; sourceTree = "<group>"; }; | ||
| 294 | + 81A4830A1E88B7EE0097A80A /* LVCOtherHeaderReusableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCOtherHeaderReusableView.m; sourceTree = "<group>"; }; | ||
| 295 | + 81A4830C1E88B8300097A80A /* LVCChannelsModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCChannelsModel.h; sourceTree = "<group>"; }; | ||
| 296 | + 81A4830D1E88B8300097A80A /* LVCChannelsModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCChannelsModel.m; sourceTree = "<group>"; }; | ||
| 297 | + 81A4830F1E88B8630097A80A /* LVCChannelDetailsModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCChannelDetailsModel.h; sourceTree = "<group>"; }; | ||
| 298 | + 81A483101E88B8630097A80A /* LVCChannelDetailsModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCChannelDetailsModel.m; sourceTree = "<group>"; }; | ||
| 299 | + 81A483121E88BA420097A80A /* LVCLiveListCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCLiveListCollectionViewCell.h; sourceTree = "<group>"; }; | ||
| 300 | + 81A483131E88BA420097A80A /* LVCLiveListCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCLiveListCollectionViewCell.m; sourceTree = "<group>"; }; | ||
| 301 | + 81A483151E88BED00097A80A /* LVCTVLiveViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCTVLiveViewController.h; sourceTree = "<group>"; }; | ||
| 302 | + 81A483161E88BED00097A80A /* LVCTVLiveViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCTVLiveViewController.m; sourceTree = "<group>"; }; | ||
| 303 | + 81A483181E88E19C0097A80A /* LVCMoreProgramViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCMoreProgramViewController.h; sourceTree = "<group>"; }; | ||
| 304 | + 81A483191E88E19C0097A80A /* LVCMoreProgramViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCMoreProgramViewController.m; sourceTree = "<group>"; }; | ||
| 305 | + 81A4831B1E88E1EB0097A80A /* LVCMoreSortTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCMoreSortTableViewCell.h; sourceTree = "<group>"; }; | ||
| 306 | + 81A4831C1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCMoreSortTableViewCell.m; sourceTree = "<group>"; }; | ||
| 307 | + 81A4831E1E88F4BF0097A80A /* LVCProgramModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCProgramModel.h; sourceTree = "<group>"; }; | ||
| 308 | + 81A4831F1E88F4BF0097A80A /* LVCProgramModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCProgramModel.m; sourceTree = "<group>"; }; | ||
| 267 | 81FB5B3A1E7A6FFC00F98E1D /* SevenSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SevenSwitch.h; sourceTree = "<group>"; }; | 309 | 81FB5B3A1E7A6FFC00F98E1D /* SevenSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SevenSwitch.h; sourceTree = "<group>"; }; |
| 268 | 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SevenSwitch.m; sourceTree = "<group>"; }; | 310 | 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SevenSwitch.m; sourceTree = "<group>"; }; |
| 269 | D2029B811E6EAAA50027CD92 /* LiveVideoCloud.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LiveVideoCloud.app; sourceTree = BUILT_PRODUCTS_DIR; }; | 311 | D2029B811E6EAAA50027CD92 /* LiveVideoCloud.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LiveVideoCloud.app; sourceTree = BUILT_PRODUCTS_DIR; }; |
| @@ -652,6 +694,8 @@ | @@ -652,6 +694,8 @@ | ||
| 652 | 81A1B9A81E8277410079FF5F /* LVCInputView.m */, | 694 | 81A1B9A81E8277410079FF5F /* LVCInputView.m */, |
| 653 | 811BB6861E8107B4005C6291 /* LVCChatViewTableViewCell.h */, | 695 | 811BB6861E8107B4005C6291 /* LVCChatViewTableViewCell.h */, |
| 654 | 811BB6871E8107B4005C6291 /* LVCChatViewTableViewCell.m */, | 696 | 811BB6871E8107B4005C6291 /* LVCChatViewTableViewCell.m */, |
| 697 | + 8130911C1E84C0F0005F0BFF /* LVCMessage.h */, | ||
| 698 | + 8130911D1E84C0F0005F0BFF /* LVCMessage.m */, | ||
| 655 | ); | 699 | ); |
| 656 | name = ChatView; | 700 | name = ChatView; |
| 657 | path = ../ChatView; | 701 | path = ../ChatView; |
| @@ -668,6 +712,23 @@ | @@ -668,6 +712,23 @@ | ||
| 668 | path = CNLiveSDK; | 712 | path = CNLiveSDK; |
| 669 | sourceTree = "<group>"; | 713 | sourceTree = "<group>"; |
| 670 | }; | 714 | }; |
| 715 | + 81A482FC1E88B0130097A80A /* Model */ = { | ||
| 716 | + isa = PBXGroup; | ||
| 717 | + children = ( | ||
| 718 | + 81A482FD1E88B0130097A80A /* LVCBannerModel.h */, | ||
| 719 | + 81A482FE1E88B0130097A80A /* LVCBannerModel.m */, | ||
| 720 | + 81A4830C1E88B8300097A80A /* LVCChannelsModel.h */, | ||
| 721 | + 81A4830D1E88B8300097A80A /* LVCChannelsModel.m */, | ||
| 722 | + 81A4830F1E88B8630097A80A /* LVCChannelDetailsModel.h */, | ||
| 723 | + 81A483101E88B8630097A80A /* LVCChannelDetailsModel.m */, | ||
| 724 | + 81A4831E1E88F4BF0097A80A /* LVCProgramModel.h */, | ||
| 725 | + 81A4831F1E88F4BF0097A80A /* LVCProgramModel.m */, | ||
| 726 | + 81A482FF1E88B0130097A80A /* LVCChatRoomModel.h */, | ||
| 727 | + 81A483001E88B0130097A80A /* LVCChatRoomModel.m */, | ||
| 728 | + ); | ||
| 729 | + path = Model; | ||
| 730 | + sourceTree = "<group>"; | ||
| 731 | + }; | ||
| 671 | 81FB5B391E7A6FFC00F98E1D /* SevenSwitch */ = { | 732 | 81FB5B391E7A6FFC00F98E1D /* SevenSwitch */ = { |
| 672 | isa = PBXGroup; | 733 | isa = PBXGroup; |
| 673 | children = ( | 734 | children = ( |
| @@ -1176,6 +1237,8 @@ | @@ -1176,6 +1237,8 @@ | ||
| 1176 | D2029CDD1E6EAE2E0027CD92 /* Category */ = { | 1237 | D2029CDD1E6EAE2E0027CD92 /* Category */ = { |
| 1177 | isa = PBXGroup; | 1238 | isa = PBXGroup; |
| 1178 | children = ( | 1239 | children = ( |
| 1240 | + 81A483061E88B6140097A80A /* UIView+ViewController.h */, | ||
| 1241 | + 81A483071E88B6140097A80A /* UIView+ViewController.m */, | ||
| 1179 | D24571561E8393EB00AA85D6 /* UIImageView+ZXExtension.h */, | 1242 | D24571561E8393EB00AA85D6 /* UIImageView+ZXExtension.h */, |
| 1180 | D24571571E8393EB00AA85D6 /* UIImageView+ZXExtension.m */, | 1243 | D24571571E8393EB00AA85D6 /* UIImageView+ZXExtension.m */, |
| 1181 | 811BB68C1E8116C8005C6291 /* NSString+StringSize.h */, | 1244 | 811BB68C1E8116C8005C6291 /* NSString+StringSize.h */, |
| @@ -1531,7 +1594,7 @@ | @@ -1531,7 +1594,7 @@ | ||
| 1531 | isa = PBXGroup; | 1594 | isa = PBXGroup; |
| 1532 | children = ( | 1595 | children = ( |
| 1533 | D2888DA81E6EC014003A77C8 /* Controller */, | 1596 | D2888DA81E6EC014003A77C8 /* Controller */, |
| 1534 | - D2888DA91E6EC014003A77C8 /* Model */, | 1597 | + 81A482FC1E88B0130097A80A /* Model */, |
| 1535 | D2888DAA1E6EC014003A77C8 /* View */, | 1598 | D2888DAA1E6EC014003A77C8 /* View */, |
| 1536 | ); | 1599 | ); |
| 1537 | path = homeSections; | 1600 | path = homeSections; |
| @@ -1548,31 +1611,38 @@ | @@ -1548,31 +1611,38 @@ | ||
| 1548 | 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */, | 1611 | 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */, |
| 1549 | D25BF87E1E7BD266007FB138 /* LVCUGCLivePlayerController.h */, | 1612 | D25BF87E1E7BD266007FB138 /* LVCUGCLivePlayerController.h */, |
| 1550 | D25BF87F1E7BD266007FB138 /* LVCUGCLivePlayerController.m */, | 1613 | D25BF87F1E7BD266007FB138 /* LVCUGCLivePlayerController.m */, |
| 1614 | + 81A483151E88BED00097A80A /* LVCTVLiveViewController.h */, | ||
| 1615 | + 81A483161E88BED00097A80A /* LVCTVLiveViewController.m */, | ||
| 1616 | + 81A483181E88E19C0097A80A /* LVCMoreProgramViewController.h */, | ||
| 1617 | + 81A483191E88E19C0097A80A /* LVCMoreProgramViewController.m */, | ||
| 1551 | ); | 1618 | ); |
| 1552 | path = Controller; | 1619 | path = Controller; |
| 1553 | sourceTree = "<group>"; | 1620 | sourceTree = "<group>"; |
| 1554 | }; | 1621 | }; |
| 1555 | - D2888DA91E6EC014003A77C8 /* Model */ = { | ||
| 1556 | - isa = PBXGroup; | ||
| 1557 | - children = ( | ||
| 1558 | - 811BB6891E8108DB005C6291 /* LVCChatRoomModel.h */, | ||
| 1559 | - 811BB68A1E8108DB005C6291 /* LVCChatRoomModel.m */, | ||
| 1560 | - ); | ||
| 1561 | - path = Model; | ||
| 1562 | - sourceTree = "<group>"; | ||
| 1563 | - }; | ||
| 1564 | D2888DAA1E6EC014003A77C8 /* View */ = { | 1622 | D2888DAA1E6EC014003A77C8 /* View */ = { |
| 1565 | isa = PBXGroup; | 1623 | isa = PBXGroup; |
| 1566 | children = ( | 1624 | children = ( |
| 1567 | 811BB67B1E80F858005C6291 /* ChatView */, | 1625 | 811BB67B1E80F858005C6291 /* ChatView */, |
| 1568 | 810B64DE1E779AE900133E15 /* LVCPlayer.h */, | 1626 | 810B64DE1E779AE900133E15 /* LVCPlayer.h */, |
| 1569 | 810B64DF1E779AE900133E15 /* LVCPlayer.m */, | 1627 | 810B64DF1E779AE900133E15 /* LVCPlayer.m */, |
| 1628 | + 81A482F31E88ACC80097A80A /* LVCTelevisionView.h */, | ||
| 1629 | + 81A482F41E88ACC80097A80A /* LVCTelevisionView.m */, | ||
| 1630 | + 81A482F61E88AFA20097A80A /* LVCFirstHeaderReusableView.h */, | ||
| 1631 | + 81A482F71E88AFA20097A80A /* LVCFirstHeaderReusableView.m */, | ||
| 1632 | + 81A483091E88B7EE0097A80A /* LVCOtherHeaderReusableView.h */, | ||
| 1633 | + 81A4830A1E88B7EE0097A80A /* LVCOtherHeaderReusableView.m */, | ||
| 1634 | + 81A483121E88BA420097A80A /* LVCLiveListCollectionViewCell.h */, | ||
| 1635 | + 81A483131E88BA420097A80A /* LVCLiveListCollectionViewCell.m */, | ||
| 1636 | + 81A483031E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.h */, | ||
| 1637 | + 81A483041E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m */, | ||
| 1570 | 8112D42F1E7927A5002E00F6 /* LVCPlayerLoadingView.h */, | 1638 | 8112D42F1E7927A5002E00F6 /* LVCPlayerLoadingView.h */, |
| 1571 | 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */, | 1639 | 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */, |
| 1572 | D25BF8811E7F775F007FB138 /* LVCUGCPlayerLoadingView.h */, | 1640 | D25BF8811E7F775F007FB138 /* LVCUGCPlayerLoadingView.h */, |
| 1573 | D25BF8821E7F775F007FB138 /* LVCUGCPlayerLoadingView.m */, | 1641 | D25BF8821E7F775F007FB138 /* LVCUGCPlayerLoadingView.m */, |
| 1574 | D25BF8911E7FBAEA007FB138 /* LVCUGCBackgroundView.h */, | 1642 | D25BF8911E7FBAEA007FB138 /* LVCUGCBackgroundView.h */, |
| 1575 | D25BF8921E7FBAEA007FB138 /* LVCUGCBackgroundView.m */, | 1643 | D25BF8921E7FBAEA007FB138 /* LVCUGCBackgroundView.m */, |
| 1644 | + 81A4831B1E88E1EB0097A80A /* LVCMoreSortTableViewCell.h */, | ||
| 1645 | + 81A4831C1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m */, | ||
| 1576 | ); | 1646 | ); |
| 1577 | path = View; | 1647 | path = View; |
| 1578 | sourceTree = "<group>"; | 1648 | sourceTree = "<group>"; |
| @@ -1774,6 +1844,7 @@ | @@ -1774,6 +1844,7 @@ | ||
| 1774 | D22830FF1E77C69E00627701 /* GiftListView.m in Sources */, | 1844 | D22830FF1E77C69E00627701 /* GiftListView.m in Sources */, |
| 1775 | D2029CC01E6EADE10027CD92 /* UIImage+GIF.m in Sources */, | 1845 | D2029CC01E6EADE10027CD92 /* UIImage+GIF.m in Sources */, |
| 1776 | D25BF8831E7F775F007FB138 /* LVCUGCPlayerLoadingView.m in Sources */, | 1846 | D25BF8831E7F775F007FB138 /* LVCUGCPlayerLoadingView.m in Sources */, |
| 1847 | + 81A4831A1E88E19C0097A80A /* LVCMoreProgramViewController.m in Sources */, | ||
| 1777 | D2029BCF1E6EADD70027CD92 /* ZXTabBarController.m in Sources */, | 1848 | D2029BCF1E6EADD70027CD92 /* ZXTabBarController.m in Sources */, |
| 1778 | D2029D071E6EAE2E0027CD92 /* ZXConst.m in Sources */, | 1849 | D2029D071E6EAE2E0027CD92 /* ZXConst.m in Sources */, |
| 1779 | D2029CB81E6EADE10027CD92 /* SDImageCache.m in Sources */, | 1850 | D2029CB81E6EADE10027CD92 /* SDImageCache.m in Sources */, |
| @@ -1786,16 +1857,19 @@ | @@ -1786,16 +1857,19 @@ | ||
| 1786 | D2029CA01E6EADE10027CD92 /* NSObject+MJProperty.m in Sources */, | 1857 | D2029CA01E6EADE10027CD92 /* NSObject+MJProperty.m in Sources */, |
| 1787 | D2029CB51E6EADE10027CD92 /* SDiOSVersion.m in Sources */, | 1858 | D2029CB51E6EADE10027CD92 /* SDiOSVersion.m in Sources */, |
| 1788 | D2029C9C1E6EADE10027CD92 /* MJPropertyType.m in Sources */, | 1859 | D2029C9C1E6EADE10027CD92 /* MJPropertyType.m in Sources */, |
| 1860 | + 81A4830E1E88B8300097A80A /* LVCChannelsModel.m in Sources */, | ||
| 1789 | D22831091E77D8D500627701 /* GiftModel.m in Sources */, | 1861 | D22831091E77D8D500627701 /* GiftModel.m in Sources */, |
| 1790 | D2029CCD1E6EADE10027CD92 /* SearchModel.m in Sources */, | 1862 | D2029CCD1E6EADE10027CD92 /* SearchModel.m in Sources */, |
| 1791 | 810B65051E779B1F00133E15 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, | 1863 | 810B65051E779B1F00133E15 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, |
| 1792 | D2029CCB1E6EADE10027CD92 /* SVRadialGradientLayer.m in Sources */, | 1864 | D2029CCB1E6EADE10027CD92 /* SVRadialGradientLayer.m in Sources */, |
| 1865 | + 8130911E1E84C0F0005F0BFF /* LVCMessage.m in Sources */, | ||
| 1793 | D23696841E7FC6A900E4BF71 /* chatListCell.m in Sources */, | 1866 | D23696841E7FC6A900E4BF71 /* chatListCell.m in Sources */, |
| 1794 | D2029CAF1E6EADE10027CD92 /* MJRefreshStateHeader.m in Sources */, | 1867 | D2029CAF1E6EADE10027CD92 /* MJRefreshStateHeader.m in Sources */, |
| 1795 | D2029C941E6EADE10027CD92 /* UIRefreshControl+AFNetworking.m in Sources */, | 1868 | D2029C941E6EADE10027CD92 /* UIRefreshControl+AFNetworking.m in Sources */, |
| 1796 | D2029C911E6EADE10027CD92 /* UIButton+AFNetworking.m in Sources */, | 1869 | D2029C911E6EADE10027CD92 /* UIButton+AFNetworking.m in Sources */, |
| 1797 | D2029C931E6EADE10027CD92 /* UIProgressView+AFNetworking.m in Sources */, | 1870 | D2029C931E6EADE10027CD92 /* UIProgressView+AFNetworking.m in Sources */, |
| 1798 | D2029C8D1E6EADE10027CD92 /* AFAutoPurgingImageCache.m in Sources */, | 1871 | D2029C8D1E6EADE10027CD92 /* AFAutoPurgingImageCache.m in Sources */, |
| 1872 | + 81A483111E88B8630097A80A /* LVCChannelDetailsModel.m in Sources */, | ||
| 1799 | D2029D011E6EAE2E0027CD92 /* UIColor+HexString.m in Sources */, | 1873 | D2029D011E6EAE2E0027CD92 /* UIColor+HexString.m in Sources */, |
| 1800 | D2029CA41E6EADE10027CD92 /* MJRefreshComponent.m in Sources */, | 1874 | D2029CA41E6EADE10027CD92 /* MJRefreshComponent.m in Sources */, |
| 1801 | D2575C7A1E76A4F300E3A8FC /* NHCarViews.m in Sources */, | 1875 | D2575C7A1E76A4F300E3A8FC /* NHCarViews.m in Sources */, |
| @@ -1826,14 +1900,17 @@ | @@ -1826,14 +1900,17 @@ | ||
| 1826 | D2029C8F1E6EADE10027CD92 /* AFNetworkActivityIndicatorManager.m in Sources */, | 1900 | D2029C8F1E6EADE10027CD92 /* AFNetworkActivityIndicatorManager.m in Sources */, |
| 1827 | 810B65031E779B1F00133E15 /* MASViewConstraint.m in Sources */, | 1901 | 810B65031E779B1F00133E15 /* MASViewConstraint.m in Sources */, |
| 1828 | D2029BCE1E6EADD70027CD92 /* ZXNavigationController.m in Sources */, | 1902 | D2029BCE1E6EADD70027CD92 /* ZXNavigationController.m in Sources */, |
| 1903 | + 81A482F51E88ACC80097A80A /* LVCTelevisionView.m in Sources */, | ||
| 1829 | D2029CA21E6EADE10027CD92 /* MJRefreshAutoFooter.m in Sources */, | 1904 | D2029CA21E6EADE10027CD92 /* MJRefreshAutoFooter.m in Sources */, |
| 1830 | D2029CC71E6EADE10027CD92 /* SVIndefiniteAnimatedView.m in Sources */, | 1905 | D2029CC71E6EADE10027CD92 /* SVIndefiniteAnimatedView.m in Sources */, |
| 1831 | D2029CA31E6EADE10027CD92 /* MJRefreshBackFooter.m in Sources */, | 1906 | D2029CA31E6EADE10027CD92 /* MJRefreshBackFooter.m in Sources */, |
| 1832 | D255300C1E793F8200DF38A5 /* NHFighterView+animDelegagte.m in Sources */, | 1907 | D255300C1E793F8200DF38A5 /* NHFighterView+animDelegagte.m in Sources */, |
| 1908 | + 81A4831D1E88E1EB0097A80A /* LVCMoreSortTableViewCell.m in Sources */, | ||
| 1833 | D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */, | 1909 | D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */, |
| 1834 | D2029CA61E6EADE10027CD92 /* MJRefreshHeader.m in Sources */, | 1910 | D2029CA61E6EADE10027CD92 /* MJRefreshHeader.m in Sources */, |
| 1835 | D2029CC41E6EADE10027CD92 /* UIImageView+WebCache.m in Sources */, | 1911 | D2029CC41E6EADE10027CD92 /* UIImageView+WebCache.m in Sources */, |
| 1836 | D236967E1E7F9E4100E4BF71 /* GiftPayButton.m in Sources */, | 1912 | D236967E1E7F9E4100E4BF71 /* GiftPayButton.m in Sources */, |
| 1913 | + 81A483081E88B6140097A80A /* UIView+ViewController.m in Sources */, | ||
| 1837 | D2029CC81E6EADE10027CD92 /* SVProgressAnimatedView.m in Sources */, | 1914 | D2029CC81E6EADE10027CD92 /* SVProgressAnimatedView.m in Sources */, |
| 1838 | D2029C961E6EADE10027CD92 /* MBProgressHUD.m in Sources */, | 1915 | D2029C961E6EADE10027CD92 /* MBProgressHUD.m in Sources */, |
| 1839 | 810B65071E779B1F00133E15 /* ViewController+MASAdditions.m in Sources */, | 1916 | 810B65071E779B1F00133E15 /* ViewController+MASAdditions.m in Sources */, |
| @@ -1842,7 +1919,6 @@ | @@ -1842,7 +1919,6 @@ | ||
| 1842 | D2029CB61E6EADE10027CD92 /* MKAnnotationView+WebCache.m in Sources */, | 1919 | D2029CB61E6EADE10027CD92 /* MKAnnotationView+WebCache.m in Sources */, |
| 1843 | 810B64FE1E779B1F00133E15 /* MASCompositeConstraint.m in Sources */, | 1920 | 810B64FE1E779B1F00133E15 /* MASCompositeConstraint.m in Sources */, |
| 1844 | D2029C981E6EADE10027CD92 /* MJExtensionConst.m in Sources */, | 1921 | D2029C981E6EADE10027CD92 /* MJExtensionConst.m in Sources */, |
| 1845 | - 811BB68B1E8108DB005C6291 /* LVCChatRoomModel.m in Sources */, | ||
| 1846 | D2575C671E76A25400E3A8FC /* LVCInteractionController.m in Sources */, | 1922 | D2575C671E76A25400E3A8FC /* LVCInteractionController.m in Sources */, |
| 1847 | D2029CAE1E6EADE10027CD92 /* MJRefreshNormalHeader.m in Sources */, | 1923 | D2029CAE1E6EADE10027CD92 /* MJRefreshNormalHeader.m in Sources */, |
| 1848 | D23696921E7FC83800E4BF71 /* chatMsgModel.m in Sources */, | 1924 | D23696921E7FC83800E4BF71 /* chatMsgModel.m in Sources */, |
| @@ -1853,36 +1929,44 @@ | @@ -1853,36 +1929,44 @@ | ||
| 1853 | D2029C921E6EADE10027CD92 /* UIImageView+AFNetworking.m in Sources */, | 1929 | D2029C921E6EADE10027CD92 /* UIImageView+AFNetworking.m in Sources */, |
| 1854 | D224B1971E826ED800CC61D0 /* ChatBarrageAnimAction.m in Sources */, | 1930 | D224B1971E826ED800CC61D0 /* ChatBarrageAnimAction.m in Sources */, |
| 1855 | D2029C9E1E6EADE10027CD92 /* NSObject+MJCoding.m in Sources */, | 1931 | D2029C9E1E6EADE10027CD92 /* NSObject+MJCoding.m in Sources */, |
| 1932 | + 81A483021E88B0130097A80A /* LVCChatRoomModel.m in Sources */, | ||
| 1856 | D2029C991E6EADE10027CD92 /* MJFoundation.m in Sources */, | 1933 | D2029C991E6EADE10027CD92 /* MJFoundation.m in Sources */, |
| 1857 | D2575C461E76857100E3A8FC /* LVCAnimationManager.m in Sources */, | 1934 | D2575C461E76857100E3A8FC /* LVCAnimationManager.m in Sources */, |
| 1858 | D2029C8A1E6EADE10027CD92 /* AFURLRequestSerialization.m in Sources */, | 1935 | D2029C8A1E6EADE10027CD92 /* AFURLRequestSerialization.m in Sources */, |
| 1859 | D2029D041E6EAE2E0027CD92 /* UILabel+ContentSize.m in Sources */, | 1936 | D2029D041E6EAE2E0027CD92 /* UILabel+ContentSize.m in Sources */, |
| 1860 | D25530031E79115100DF38A5 /* AnimQueueManager.m in Sources */, | 1937 | D25530031E79115100DF38A5 /* AnimQueueManager.m in Sources */, |
| 1861 | D2029C871E6EADE10027CD92 /* AFHTTPSessionManager.m in Sources */, | 1938 | D2029C871E6EADE10027CD92 /* AFHTTPSessionManager.m in Sources */, |
| 1939 | + D236968D1E7FC7C200E4BF71 /* CNBarrageManager.m in Sources */, | ||
| 1940 | + 81A482F81E88AFA20097A80A /* LVCFirstHeaderReusableView.m in Sources */, | ||
| 1862 | D2029B861E6EAAA50027CD92 /* main.m in Sources */, | 1941 | D2029B861E6EAAA50027CD92 /* main.m in Sources */, |
| 1863 | D2029C8C1E6EADE10027CD92 /* AFURLSessionManager.m in Sources */, | 1942 | D2029C8C1E6EADE10027CD92 /* AFURLSessionManager.m in Sources */, |
| 1864 | D2029C9F1E6EADE10027CD92 /* NSObject+MJKeyValue.m in Sources */, | 1943 | D2029C9F1E6EADE10027CD92 /* NSObject+MJKeyValue.m in Sources */, |
| 1865 | D25BF8A01E80C4BD007FB138 /* UIImage+LVCVagueImage.m in Sources */, | 1944 | D25BF8A01E80C4BD007FB138 /* UIImage+LVCVagueImage.m in Sources */, |
| 1866 | D2888DB11E6EC05F003A77C8 /* TempViewController.m in Sources */, | 1945 | D2888DB11E6EC05F003A77C8 /* TempViewController.m in Sources */, |
| 1946 | + 81A483011E88B0130097A80A /* LVCBannerModel.m in Sources */, | ||
| 1867 | 810B65021E779B1F00133E15 /* MASViewAttribute.m in Sources */, | 1947 | 810B65021E779B1F00133E15 /* MASViewAttribute.m in Sources */, |
| 1868 | D2B7B2511E8247D400ED084E /* ChatBarrageManager.m in Sources */, | 1948 | D2B7B2511E8247D400ED084E /* ChatBarrageManager.m in Sources */, |
| 1869 | D2029CAC1E6EADE10027CD92 /* MJRefreshBackStateFooter.m in Sources */, | 1949 | D2029CAC1E6EADE10027CD92 /* MJRefreshBackStateFooter.m in Sources */, |
| 1870 | D2029CB11E6EADE10027CD92 /* MJRefreshConst.m in Sources */, | 1950 | D2029CB11E6EADE10027CD92 /* MJRefreshConst.m in Sources */, |
| 1871 | D2029CAD1E6EADE10027CD92 /* MJRefreshGifHeader.m in Sources */, | 1951 | D2029CAD1E6EADE10027CD92 /* MJRefreshGifHeader.m in Sources */, |
| 1952 | + 81A483141E88BA420097A80A /* LVCLiveListCollectionViewCell.m in Sources */, | ||
| 1872 | D2029CB31E6EADE10027CD92 /* UIScrollView+MJRefresh.m in Sources */, | 1953 | D2029CB31E6EADE10027CD92 /* UIScrollView+MJRefresh.m in Sources */, |
| 1873 | D2029D051E6EAE2E0027CD92 /* UILabel+labelFitSize.m in Sources */, | 1954 | D2029D051E6EAE2E0027CD92 /* UILabel+labelFitSize.m in Sources */, |
| 1874 | D2029CB21E6EADE10027CD92 /* UIScrollView+MJExtension.m in Sources */, | 1955 | D2029CB21E6EADE10027CD92 /* UIScrollView+MJExtension.m in Sources */, |
| 1875 | D29D88481E88C53300543A03 /* LVCUGCLivePrepareView.m in Sources */, | 1956 | D29D88481E88C53300543A03 /* LVCUGCLivePrepareView.m in Sources */, |
| 1876 | D2029D091E6EAE2E0027CD92 /* Foundation+Log.m in Sources */, | 1957 | D2029D091E6EAE2E0027CD92 /* Foundation+Log.m in Sources */, |
| 1877 | D2029C8E1E6EADE10027CD92 /* AFImageDownloader.m in Sources */, | 1958 | D2029C8E1E6EADE10027CD92 /* AFImageDownloader.m in Sources */, |
| 1959 | + 81A483201E88F4BF0097A80A /* LVCProgramModel.m in Sources */, | ||
| 1878 | D2029BCA1E6EADD70027CD92 /* BaseModel.m in Sources */, | 1960 | D2029BCA1E6EADD70027CD92 /* BaseModel.m in Sources */, |
| 1879 | D25BF87B1E7B8A82007FB138 /* SliderView.m in Sources */, | 1961 | D25BF87B1E7B8A82007FB138 /* SliderView.m in Sources */, |
| 1880 | 810B65041E779B1F00133E15 /* NSArray+MASAdditions.m in Sources */, | 1962 | 810B65041E779B1F00133E15 /* NSArray+MASAdditions.m in Sources */, |
| 1963 | + 81A4830B1E88B7EE0097A80A /* LVCOtherHeaderReusableView.m in Sources */, | ||
| 1881 | D25BF8801E7BD266007FB138 /* LVCUGCLivePlayerController.m in Sources */, | 1964 | D25BF8801E7BD266007FB138 /* LVCUGCLivePlayerController.m in Sources */, |
| 1882 | D2029D031E6EAE2E0027CD92 /* UIImage+ZXExtension.m in Sources */, | 1965 | D2029D031E6EAE2E0027CD92 /* UIImage+ZXExtension.m in Sources */, |
| 1883 | D24571581E8393EB00AA85D6 /* UIImageView+ZXExtension.m in Sources */, | 1966 | D24571581E8393EB00AA85D6 /* UIImageView+ZXExtension.m in Sources */, |
| 1884 | D2029D0A1E6EAE2E0027CD92 /* ZXServerUrl.m in Sources */, | 1967 | D2029D0A1E6EAE2E0027CD92 /* ZXServerUrl.m in Sources */, |
| 1885 | D2029CCA1E6EADE10027CD92 /* SVProgressHUD.m in Sources */, | 1968 | D2029CCA1E6EADE10027CD92 /* SVProgressHUD.m in Sources */, |
| 1969 | + 81A483051E88B32C0097A80A /* LVCHeaderRollCollectionViewCell.m in Sources */, | ||
| 1886 | D2029CA81E6EADE10027CD92 /* MJRefreshAutoNormalFooter.m in Sources */, | 1970 | D2029CA81E6EADE10027CD92 /* MJRefreshAutoNormalFooter.m in Sources */, |
| 1887 | D2029C891E6EADE10027CD92 /* AFSecurityPolicy.m in Sources */, | 1971 | D2029C891E6EADE10027CD92 /* AFSecurityPolicy.m in Sources */, |
| 1888 | D217A24A1E7B76C7003B44CB /* PresentView.m in Sources */, | 1972 | D217A24A1E7B76C7003B44CB /* PresentView.m in Sources */, |
| @@ -1921,6 +2005,7 @@ | @@ -1921,6 +2005,7 @@ | ||
| 1921 | D2888DB41E6EC154003A77C8 /* HomeViewController.m in Sources */, | 2005 | D2888DB41E6EC154003A77C8 /* HomeViewController.m in Sources */, |
| 1922 | D2B7B2541E824B2D00ED084E /* ChatBarrageView.m in Sources */, | 2006 | D2B7B2541E824B2D00ED084E /* ChatBarrageView.m in Sources */, |
| 1923 | D25530061E7911A800DF38A5 /* GiftAnimationAction.m in Sources */, | 2007 | D25530061E7911A800DF38A5 /* GiftAnimationAction.m in Sources */, |
| 2008 | + 81A483171E88BED00097A80A /* LVCTVLiveViewController.m in Sources */, | ||
| 1924 | 81A1B9A91E8277410079FF5F /* LVCInputView.m in Sources */, | 2009 | 81A1B9A91E8277410079FF5F /* LVCInputView.m in Sources */, |
| 1925 | D2029CD41E6EADE70027CD92 /* HttpService.m in Sources */, | 2010 | D2029CD41E6EADE70027CD92 /* HttpService.m in Sources */, |
| 1926 | ); | 2011 | ); |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatView.h
| @@ -9,7 +9,11 @@ | @@ -9,7 +9,11 @@ | ||
| 9 | #import <UIKit/UIKit.h> | 9 | #import <UIKit/UIKit.h> |
| 10 | 10 | ||
| 11 | @interface LVCChatView : UIView | 11 | @interface LVCChatView : UIView |
| 12 | +@property (nonatomic, strong) UITableView *tableView; | ||
| 12 | 13 | ||
| 13 | - (instancetype)initWithFrame:(CGRect)frame roomId:(NSString *)roomId; | 14 | - (instancetype)initWithFrame:(CGRect)frame roomId:(NSString *)roomId; |
| 14 | 15 | ||
| 16 | +- (void)sendMsgWithMessage:(NSString *)message; | ||
| 17 | + | ||
| 18 | + | ||
| 15 | @end | 19 | @end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatView.m
| @@ -11,6 +11,7 @@ | @@ -11,6 +11,7 @@ | ||
| 11 | #import "LVCChatRoomModel.h" | 11 | #import "LVCChatRoomModel.h" |
| 12 | #import "UILabel+ContentSize.h" | 12 | #import "UILabel+ContentSize.h" |
| 13 | #import "NSString+StringSize.h" | 13 | #import "NSString+StringSize.h" |
| 14 | +#import "LVCMessage.h" | ||
| 14 | 15 | ||
| 15 | @interface LVCChatView ()<CNLiveChatManagerDelegate,UITableViewDelegate,UITableViewDataSource> | 16 | @interface LVCChatView ()<CNLiveChatManagerDelegate,UITableViewDelegate,UITableViewDataSource> |
| 16 | { | 17 | { |
| @@ -18,7 +19,7 @@ | @@ -18,7 +19,7 @@ | ||
| 18 | NSMutableArray *_chatDataArr; | 19 | NSMutableArray *_chatDataArr; |
| 19 | } | 20 | } |
| 20 | 21 | ||
| 21 | -@property (nonatomic, strong) UITableView *tableView; | 22 | + |
| 22 | @property (nonatomic, strong) UILabel *chatLab; | 23 | @property (nonatomic, strong) UILabel *chatLab; |
| 23 | @property (nonatomic, strong) NSMutableArray *messageHeight; | 24 | @property (nonatomic, strong) NSMutableArray *messageHeight; |
| 24 | 25 | ||
| @@ -31,10 +32,11 @@ | @@ -31,10 +32,11 @@ | ||
| 31 | self = [super initWithFrame:frame]; | 32 | self = [super initWithFrame:frame]; |
| 32 | if (self) { | 33 | if (self) { |
| 33 | 34 | ||
| 35 | + _roomId = roomId; | ||
| 36 | + | ||
| 34 | self.backgroundColor = [UIColor whiteColor]; | 37 | self.backgroundColor = [UIColor whiteColor]; |
| 35 | _chatDataArr = [NSMutableArray new]; | 38 | _chatDataArr = [NSMutableArray new]; |
| 36 | _messageHeight = [NSMutableArray new]; | 39 | _messageHeight = [NSMutableArray new]; |
| 37 | - [self addData]; | ||
| 38 | 40 | ||
| 39 | [self addSubview:self.tableView]; | 41 | [self addSubview:self.tableView]; |
| 40 | [self addSubview:self.chatLab]; | 42 | [self addSubview:self.chatLab]; |
| @@ -44,26 +46,19 @@ | @@ -44,26 +46,19 @@ | ||
| 44 | return self; | 46 | return self; |
| 45 | } | 47 | } |
| 46 | 48 | ||
| 47 | -- (void)addData | 49 | +- (void)addData:(LVCMessage *)msg |
| 48 | { | 50 | { |
| 49 | - for (int i = 0; i < 8; i ++) { | ||
| 50 | - LVCChatRoomModel *model = [[LVCChatRoomModel alloc] init]; | ||
| 51 | - model.nikeName = @"zzllzz"; | ||
| 52 | - model.isReceive = NO; | ||
| 53 | - model.message = @"我有一只😁啦啡哦我"; | ||
| 54 | - [_chatDataArr addObject:model]; | ||
| 55 | - [self cellMessageLabelHeightWithModel:model]; | ||
| 56 | - } | ||
| 57 | - | 51 | + [_chatDataArr addObject:msg]; |
| 58 | [_tableView reloadData]; | 52 | [_tableView reloadData]; |
| 53 | + [self scrollToBottom]; | ||
| 59 | } | 54 | } |
| 60 | 55 | ||
| 61 | - (void)joinChatRoomWithRoomId:(NSString *)roomId | 56 | - (void)joinChatRoomWithRoomId:(NSString *)roomId |
| 62 | { | 57 | { |
| 63 | - [[CNLiveChatManager sharedCNLiveChatManager] joinExistChatRoom:roomId messageCount:10 success:^(NSString *targetId) { | ||
| 64 | - NSLog(@"电视台--加入聊天室---success-%@",targetId); | 58 | + [[CNLiveChatManager sharedCNLiveChatManager] joinChatRoom:roomId messageCount:10 success:^(NSString *targetId) { |
| 59 | + NSLog(@"电视台--加入聊天室---success-(%@)",targetId); | ||
| 65 | } error:^(CNLiveChatErrorCode errors, NSString *targetId) { | 60 | } error:^(CNLiveChatErrorCode errors, NSString *targetId) { |
| 66 | - NSLog(@"电视台--加入聊天室---failed -%ld",(long)errors); | 61 | + NSLog(@"电视台--加入聊天室---failed -(%ld)",(long)errors); |
| 67 | }]; | 62 | }]; |
| 68 | 63 | ||
| 69 | [CNLiveChatManager sharedCNLiveChatManager].delegate = self; | 64 | [CNLiveChatManager sharedCNLiveChatManager].delegate = self; |
| @@ -74,10 +69,16 @@ | @@ -74,10 +69,16 @@ | ||
| 74 | { | 69 | { |
| 75 | [[CNLiveChatManager sharedCNLiveChatManager] sendMessage:message type:CNLive_ConversationType_CHATROOM targetId:_roomId success:^(CNLiveChatMessage *message) { | 70 | [[CNLiveChatManager sharedCNLiveChatManager] sendMessage:message type:CNLive_ConversationType_CHATROOM targetId:_roomId success:^(CNLiveChatMessage *message) { |
| 76 | 71 | ||
| 77 | - NSLog(@"电视台--发送消息---success-%@",message); | 72 | + LVCMessage *msg = [LVCMessage messageWihtContent:message isRight:YES]; |
| 73 | + | ||
| 74 | + dispatch_sync(dispatch_get_main_queue(), ^{ | ||
| 75 | + [self addData:msg]; | ||
| 76 | + }); | ||
| 77 | + | ||
| 78 | + NSLog(@"电视台--发送消息---success-(%@)",msg.content); | ||
| 78 | 79 | ||
| 79 | } error:^(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId) { | 80 | } error:^(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId) { |
| 80 | - NSLog(@"电视台--发送消息---failed-%ld",(long)errors); | 81 | + NSLog(@"电视台--发送消息---failed-(%ld)",(long)errors); |
| 81 | }]; | 82 | }]; |
| 82 | } | 83 | } |
| 83 | 84 | ||
| @@ -96,6 +97,20 @@ | @@ -96,6 +97,20 @@ | ||
| 96 | - (void)onReceived:(CNLiveChatMessage *)message | 97 | - (void)onReceived:(CNLiveChatMessage *)message |
| 97 | { | 98 | { |
| 98 | //接收消息 | 99 | //接收消息 |
| 100 | + dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); | ||
| 101 | + dispatch_async(globalQueue, ^{ | ||
| 102 | + LVCMessage *msg = [LVCMessage messageWihtContent:message isRight:NO]; | ||
| 103 | + dispatch_sync(dispatch_get_main_queue(), ^{ | ||
| 104 | + [self addData:msg]; | ||
| 105 | + }); | ||
| 106 | + }); | ||
| 107 | +} | ||
| 108 | + | ||
| 109 | +- (void)scrollToBottom { //滚到下方 | ||
| 110 | + NSUInteger rowCount = _chatDataArr.count; | ||
| 111 | + NSIndexPath* indexPath = [NSIndexPath indexPathForRow:rowCount-1 inSection:0]; | ||
| 112 | + [_tableView scrollToRowAtIndexPath:indexPath | ||
| 113 | + atScrollPosition:UITableViewScrollPositionBottom animated:NO]; | ||
| 99 | } | 114 | } |
| 100 | 115 | ||
| 101 | #pragma mark - | 116 | #pragma mark - |
| @@ -113,33 +128,17 @@ | @@ -113,33 +128,17 @@ | ||
| 113 | cell = [[LVCChatViewTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID]; | 128 | cell = [[LVCChatViewTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID]; |
| 114 | } | 129 | } |
| 115 | 130 | ||
| 116 | - LVCChatRoomModel *model = _chatDataArr[indexPath.row]; | ||
| 117 | - cell.model = model; | 131 | + LVCMessage *message = _chatDataArr[indexPath.row]; |
| 132 | + cell.message = message; | ||
| 118 | 133 | ||
| 119 | return cell; | 134 | return cell; |
| 120 | } | 135 | } |
| 121 | 136 | ||
| 122 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath | 137 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath |
| 123 | { | 138 | { |
| 124 | - LVCChatRoomModel *model = [_chatDataArr objectAtIndex:indexPath.row]; | ||
| 125 | - | ||
| 126 | - return [LVCChatViewTableViewCell getCellHeight:model filterName:model.nikeName height:[_messageHeight objectAtIndex:indexPath.row]]; | ||
| 127 | -} | ||
| 128 | - | ||
| 129 | -- (void)cellMessageLabelHeightWithModel:(LVCChatRoomModel *)model { | 139 | + LVCMessage *message = _chatDataArr[indexPath.row]; |
| 140 | + return message.cellHeight; | ||
| 130 | 141 | ||
| 131 | - UILabel *messageLabel = [[UILabel alloc]init]; | ||
| 132 | - messageLabel.text = model.message; | ||
| 133 | - | ||
| 134 | - messageLabel.width = [messageLabel contentWidth].width; | ||
| 135 | - | ||
| 136 | - if ((SCREEN_WIDTH - messageLabel.width - 85) < 0) { // 多行 | ||
| 137 | - CGSize statusLabelSize = [messageLabel.text sizeWithLabelWidth:SCREEN_WIDTH - 85 font:[UIFont systemFontOfSize:14]]; | ||
| 138 | - [_messageHeight addObject:@(statusLabelSize.height)]; | ||
| 139 | - } else { // 单行 | ||
| 140 | - CGSize statusLabelSize = [messageLabel.text sizeWithLabelWidth:messageLabel.width font:[UIFont systemFontOfSize:14]]; | ||
| 141 | - [_messageHeight addObject:@(statusLabelSize.height)]; | ||
| 142 | - } | ||
| 143 | } | 142 | } |
| 144 | 143 | ||
| 145 | #pragma mark - | 144 | #pragma mark - |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatViewTableViewCell.h
| @@ -7,13 +7,10 @@ | @@ -7,13 +7,10 @@ | ||
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | #import <UIKit/UIKit.h> | 9 | #import <UIKit/UIKit.h> |
| 10 | -#import "LVCChatRoomModel.h" | 10 | +#import "LVCMessage.h" |
| 11 | 11 | ||
| 12 | @interface LVCChatViewTableViewCell : UITableViewCell | 12 | @interface LVCChatViewTableViewCell : UITableViewCell |
| 13 | 13 | ||
| 14 | -@property (nonatomic, strong) LVCChatRoomModel *model; //聊天室model | ||
| 15 | - | ||
| 16 | -+ (CGFloat)getCellHeight:(LVCChatRoomModel *)message filterName:(NSString *)filterName height:(NSNumber *)height; | ||
| 17 | - | 14 | +@property (nonatomic, strong) LVCMessage *message; |
| 18 | 15 | ||
| 19 | @end | 16 | @end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatViewTableViewCell.m
| @@ -42,104 +42,44 @@ | @@ -42,104 +42,44 @@ | ||
| 42 | return self; | 42 | return self; |
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | -- (void)setModel:(LVCChatRoomModel *)model | 45 | +- (void)setMessage:(LVCMessage *)message |
| 46 | { | 46 | { |
| 47 | - if (!model || ![model isKindOfClass:[LVCChatRoomModel class]]) { | ||
| 48 | - return; | ||
| 49 | - } | ||
| 50 | - | ||
| 51 | - _model = model; | ||
| 52 | - | ||
| 53 | - self.messageLab.text = model.message; | ||
| 54 | - self.nickNameLab.text = model.nikeName; | ||
| 55 | - if (model.isReceive) { //收到的消息 | ||
| 56 | - | ||
| 57 | - UIImage *bgImage = [UIImage imageNamed:@"Gift box"]; | ||
| 58 | - bgImage = [bgImage stretchableImageWithLeftCapWidth:0 topCapHeight:50]; | ||
| 59 | - self.bgImageView.image = bgImage; | ||
| 60 | - | ||
| 61 | - self.nickNameLab.hidden = NO; | ||
| 62 | - self.lineLab.hidden = NO; | ||
| 63 | - self.iconImageView.frame = CGRectMake(10,10,HEAD_SIZE,HEAD_SIZE); | ||
| 64 | - self.nickNameLab.frame = CGRectMake(13,2.5,200,20); | ||
| 65 | - | ||
| 66 | - self.messageLab.width = [self.messageLab contentWidth].width; | ||
| 67 | - | ||
| 68 | - //多行 | ||
| 69 | - if ((SCREEN_WIDTH - self.messageLab.width - 85) < 0) { | ||
| 70 | - CGSize statusLabelSize = [self.messageLab.text sizeWithLabelWidth:SCREEN_WIDTH - 85 font:[UIFont systemFontOfSize:14]]; | ||
| 71 | - self.bgImageView.frame = CGRectMake(60, 7.5, SCREEN_WIDTH - 70, statusLabelSize.height + 35); | ||
| 72 | - self.messageLab.frame = CGRectMake(13, 27.5, SCREEN_WIDTH - 80, statusLabelSize.height); | ||
| 73 | - self.lineLab.width = self.bgImageView.width - 20; | ||
| 74 | - | ||
| 75 | - } else { //单行 | ||
| 76 | - | ||
| 77 | - CGSize statusLabelSize = [self.messageLab.text sizeWithLabelWidth:self.messageLab.width font:[UIFont systemFontOfSize:14]]; | ||
| 78 | - | ||
| 79 | - self.nickNameLab.width = [self.nickNameLab contentWidth].width; | ||
| 80 | - if (self.nickNameLab.width > self.messageLab.width) { | ||
| 81 | - self.bgImageView.frame = CGRectMake(60, 7.5, self.nickNameLab.width + 20, statusLabelSize.height + 35); | ||
| 82 | - self.lineLab.width = self.nickNameLab.width + 5; | ||
| 83 | - } else { | ||
| 84 | - self.bgImageView.frame = CGRectMake(60, 7.5, self.messageLab.width + 20, statusLabelSize.height + 35); | ||
| 85 | - self.lineLab.width = self.messageLab.width + 5; | ||
| 86 | - } | ||
| 87 | - self.messageLab.frame = CGRectMake(13, 27.5, self.messageLab.width, statusLabelSize.height); | ||
| 88 | - } | ||
| 89 | - | ||
| 90 | - | ||
| 91 | - } else { //我的消息 | ||
| 92 | - | 47 | + if (message.isRight) { //我的消息 |
| 93 | UIImage *bgImage = [UIImage imageNamed:@"Gift box right"]; | 48 | UIImage *bgImage = [UIImage imageNamed:@"Gift box right"]; |
| 94 | bgImage = [bgImage stretchableImageWithLeftCapWidth:10 topCapHeight:27]; | 49 | bgImage = [bgImage stretchableImageWithLeftCapWidth:10 topCapHeight:27]; |
| 95 | - self.bgImageView.image = bgImage; | ||
| 96 | - self.nickNameLab.hidden = YES; | ||
| 97 | - self.lineLab.hidden = YES; | ||
| 98 | - self.iconImageView.frame = CGRectMake(SCREEN_WIDTH - 50,6,40,40); | 50 | + _bgImageView.image = bgImage; |
| 51 | + _bgImageView.frame = message.popFrame; | ||
| 52 | + _messageLab.text = message.content; | ||
| 53 | + _messageLab.frame = message.contentFrame; | ||
| 54 | + _nickNameLab.frame = message.nikenameFrame; | ||
| 55 | + _iconImageView.frame = message.portraitsFrame; | ||
| 56 | + [_iconImageView sd_setImageWithURL:[NSURL URLWithString:message.portraits] placeholderImage:[UIImage imageNamed:@"touxiang"]]; | ||
| 57 | + _lineLab.hidden = YES; | ||
| 58 | + | ||
| 59 | + } else { //收到的消息 | ||
| 99 | 60 | ||
| 100 | - self.messageLab.width = [self.messageLab contentWidth].width; | ||
| 101 | - | ||
| 102 | - if ((SCREEN_WIDTH - self.messageLab.width - 85) < 0) { // 多行 | ||
| 103 | - CGSize statusLabelSize = [self.messageLab.text sizeWithLabelWidth:SCREEN_WIDTH - 85 font:[UIFont systemFontOfSize:14]]; | ||
| 104 | - | ||
| 105 | - self.bgImageView.frame = CGRectMake(10, 7.5, SCREEN_WIDTH - 65, statusLabelSize.height + 20); | ||
| 106 | - | ||
| 107 | - self.messageLab.frame = CGRectMake(10, 10, SCREEN_WIDTH - 85, statusLabelSize.height); | ||
| 108 | - | ||
| 109 | - } else { // 单行 | ||
| 110 | - CGSize statusLabelSize = [self.messageLab.text sizeWithLabelWidth:self.messageLab.width font:[UIFont systemFontOfSize:14]]; | ||
| 111 | - self.bgImageView.frame = CGRectMake(SCREEN_WIDTH - self.messageLab.width - 75, 7.5, self.messageLab.width + 20, statusLabelSize.height + 20); | ||
| 112 | - self.messageLab.frame = CGRectMake(8, 10, self.messageLab.width, statusLabelSize.height); | ||
| 113 | - } | ||
| 114 | - | 61 | + UIImage *bgImage = [UIImage imageNamed:@"Gift box"]; |
| 62 | + bgImage = [bgImage stretchableImageWithLeftCapWidth:10 topCapHeight:27]; | ||
| 63 | + _bgImageView.image = bgImage; | ||
| 64 | + _bgImageView.frame = message.popFrame; | ||
| 65 | + _nickNameLab.text = message.nikename; | ||
| 66 | + _nickNameLab.frame = message.nikenameFrame; | ||
| 67 | + _lineLab.frame = message.lineFrame; | ||
| 68 | + _lineLab.hidden = NO; | ||
| 69 | + [_iconImageView sd_setImageWithURL:[NSURL URLWithString:message.portraits] placeholderImage:[UIImage imageNamed:@"touxiang"]]; | ||
| 70 | + _iconImageView.frame = message.portraitsFrame; | ||
| 71 | + _messageLab.text = message.content; | ||
| 72 | + _messageLab.frame = message.contentFrame; | ||
| 115 | 73 | ||
| 116 | } | 74 | } |
| 117 | } | 75 | } |
| 118 | 76 | ||
| 119 | -#pragma mark - action | ||
| 120 | -+ (CGFloat)getCellHeight:(LVCChatRoomModel *)message filterName:(NSString *)filterName height:(NSNumber *)height | ||
| 121 | -{ | ||
| 122 | - if (!message) { | ||
| 123 | - return 0; | ||
| 124 | - } | ||
| 125 | - | ||
| 126 | - CGFloat height1 = [height floatValue]; | ||
| 127 | - | ||
| 128 | - if ([message.nikeName isEqualToString:filterName]) { | ||
| 129 | - return height1 + 20 + 15; | ||
| 130 | - } else { | ||
| 131 | - return height1 + 20 + 15 + 40; | ||
| 132 | - } | ||
| 133 | -} | ||
| 134 | - | ||
| 135 | - | ||
| 136 | #pragma mark - | 77 | #pragma mark - |
| 137 | #pragma mark - getter | 78 | #pragma mark - getter |
| 138 | - (UIImageView *)iconImageView | 79 | - (UIImageView *)iconImageView |
| 139 | { | 80 | { |
| 140 | if (!_iconImageView) { | 81 | if (!_iconImageView) { |
| 141 | - _iconImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 5, HEAD_SIZE, HEAD_SIZE)]; | ||
| 142 | - _iconImageView.image = [UIImage imageNamed:@"touxiang"]; | 82 | + _iconImageView = [[UIImageView alloc] init]; |
| 143 | } | 83 | } |
| 144 | return _iconImageView; | 84 | return _iconImageView; |
| 145 | } | 85 | } |
| @@ -147,7 +87,7 @@ | @@ -147,7 +87,7 @@ | ||
| 147 | - (UIImageView *)bgImageView | 87 | - (UIImageView *)bgImageView |
| 148 | { | 88 | { |
| 149 | if (!_bgImageView) { | 89 | if (!_bgImageView) { |
| 150 | - _bgImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; | 90 | + _bgImageView = [[UIImageView alloc] init]; |
| 151 | } | 91 | } |
| 152 | return _bgImageView; | 92 | return _bgImageView; |
| 153 | } | 93 | } |
| @@ -155,7 +95,7 @@ | @@ -155,7 +95,7 @@ | ||
| 155 | - (UILabel *)lineLab | 95 | - (UILabel *)lineLab |
| 156 | { | 96 | { |
| 157 | if (!_lineLab) { | 97 | if (!_lineLab) { |
| 158 | - _lineLab = [[UILabel alloc] initWithFrame:CGRectMake(10, 23.5, 80, 0.5)]; | 98 | + _lineLab = [[UILabel alloc] init]; |
| 159 | _lineLab.backgroundColor = [UIColor colorWithHexString:@"#5a5b5b"]; | 99 | _lineLab.backgroundColor = [UIColor colorWithHexString:@"#5a5b5b"]; |
| 160 | } | 100 | } |
| 161 | return _lineLab; | 101 | return _lineLab; |
| @@ -164,10 +104,9 @@ | @@ -164,10 +104,9 @@ | ||
| 164 | - (UILabel *)nickNameLab | 104 | - (UILabel *)nickNameLab |
| 165 | { | 105 | { |
| 166 | if (!_nickNameLab) { | 106 | if (!_nickNameLab) { |
| 167 | - _nickNameLab = [[UILabel alloc] initWithFrame:CGRectMake(13,2.5,200,20)]; | 107 | + _nickNameLab = [[UILabel alloc] init]; |
| 168 | _nickNameLab.font = [UIFont systemFontOfSize:10]; | 108 | _nickNameLab.font = [UIFont systemFontOfSize:10]; |
| 169 | _nickNameLab.textColor = [UIColor colorWithHexString:@"#5a5b5b"]; | 109 | _nickNameLab.textColor = [UIColor colorWithHexString:@"#5a5b5b"]; |
| 170 | - _nickNameLab.text = @"zzll"; | ||
| 171 | } | 110 | } |
| 172 | return _nickNameLab; | 111 | return _nickNameLab; |
| 173 | } | 112 | } |
| @@ -175,10 +114,9 @@ | @@ -175,10 +114,9 @@ | ||
| 175 | - (UILabel *)messageLab | 114 | - (UILabel *)messageLab |
| 176 | { | 115 | { |
| 177 | if (!_messageLab) { | 116 | if (!_messageLab) { |
| 178 | - _messageLab = [[UILabel alloc] initWithFrame:CGRectMake(10, 25, SCREEN_WIDTH - 85, 30)]; | 117 | + _messageLab = [[UILabel alloc] init]; |
| 179 | _messageLab.textColor = [UIColor whiteColor]; | 118 | _messageLab.textColor = [UIColor whiteColor]; |
| 180 | _messageLab.font = [UIFont systemFontOfSize:14]; | 119 | _messageLab.font = [UIFont systemFontOfSize:14]; |
| 181 | - _messageLab.text = @"哈哈哈哈"; | ||
| 182 | _messageLab.numberOfLines = 0; | 120 | _messageLab.numberOfLines = 0; |
| 183 | } | 121 | } |
| 184 | return _messageLab; | 122 | return _messageLab; |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCInputView.h
| @@ -17,6 +17,8 @@ | @@ -17,6 +17,8 @@ | ||
| 17 | 17 | ||
| 18 | @interface LVCInputView : UIView | 18 | @interface LVCInputView : UIView |
| 19 | 19 | ||
| 20 | +@property (nonatomic, strong) UITextField *inputTextField; | ||
| 21 | + | ||
| 20 | @property (nonatomic, assign) id<LVCInputViewDelegate> delegate; | 22 | @property (nonatomic, assign) id<LVCInputViewDelegate> delegate; |
| 21 | 23 | ||
| 22 | @end | 24 | @end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCInputView.m
| @@ -12,8 +12,8 @@ | @@ -12,8 +12,8 @@ | ||
| 12 | 12 | ||
| 13 | @interface LVCInputView ()<UITextFieldDelegate> | 13 | @interface LVCInputView ()<UITextFieldDelegate> |
| 14 | 14 | ||
| 15 | -@property (nonatomic, strong) UITextField *inputTextField; | ||
| 16 | @property (nonatomic, strong) UIButton *sendBtn; | 15 | @property (nonatomic, strong) UIButton *sendBtn; |
| 16 | + | ||
| 17 | @end | 17 | @end |
| 18 | 18 | ||
| 19 | @implementation LVCInputView | 19 | @implementation LVCInputView |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCMessage.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCMessage.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/24. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +@interface LVCMessage : NSObject | ||
| 12 | + | ||
| 13 | +@property (nonatomic, strong, readonly) NSString *nikename; //昵称 | ||
| 14 | +@property (nonatomic, strong, readonly) NSString *portraits; //头像 | ||
| 15 | +@property (nonatomic, strong, readonly) NSString *content; //消息内容 | ||
| 16 | + | ||
| 17 | +@property (nonatomic, assign, readonly) CGRect nikenameFrame; //昵称frame | ||
| 18 | +@property (nonatomic, assign, readonly) CGRect contentFrame; //内容frame | ||
| 19 | +@property (nonatomic, assign, readonly) CGRect popFrame; //气泡frame | ||
| 20 | +@property (nonatomic, assign, readonly) CGRect portraitsFrame; //头像frame | ||
| 21 | +@property (nonatomic, assign, readonly) CGRect lineFrame; //分割线frame | ||
| 22 | +@property (nonatomic, assign, readonly) CGFloat cellHeight; //cell高 | ||
| 23 | + | ||
| 24 | +@property (nonatomic, assign, readonly) BOOL isRight; //是否是接收者 | ||
| 25 | + | ||
| 26 | + | ||
| 27 | +//构造消息对象 -- 消息文本 | ||
| 28 | ++ (instancetype)messageWihtContent:(CNLiveChatMessage *)content isRight:(BOOL)isRight; | ||
| 29 | + | ||
| 30 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCMessage.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCMessage.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/24. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCMessage.h" | ||
| 10 | + | ||
| 11 | +#define ICON_WIDTH 35.0 //头像大小 | ||
| 12 | +#define ICON_TOP_SPACE 8.0 //头像与cell间距 | ||
| 13 | +#define POP_TOP_SPACE 10 //pop与cell间距 | ||
| 14 | + | ||
| 15 | +@interface LVCMessage () | ||
| 16 | + | ||
| 17 | +@property (nonatomic, strong) NSString *nikename; //昵称 | ||
| 18 | +@property (nonatomic, strong) NSString *portraits; //头像 | ||
| 19 | +@property (nonatomic, strong) NSString *content; //消息内容 | ||
| 20 | + | ||
| 21 | +@property (nonatomic, assign) CGRect nikenameFrame; //昵称frame | ||
| 22 | +@property (nonatomic, assign) CGRect contentFrame; //内容frame | ||
| 23 | +@property (nonatomic, assign) CGRect popFrame; //气泡frame | ||
| 24 | +@property (nonatomic, assign) CGRect portraitsFrame; //头像frame | ||
| 25 | +@property (nonatomic, assign) CGRect lineFrame; //分割线frame | ||
| 26 | +@property (nonatomic, assign) CGFloat cellHeight; //cell高 | ||
| 27 | + | ||
| 28 | +@property (nonatomic, assign) BOOL isRight; //是否是接收者(YES:我的消息) | ||
| 29 | + | ||
| 30 | +@end | ||
| 31 | + | ||
| 32 | +@implementation LVCMessage | ||
| 33 | + | ||
| 34 | ++ (instancetype)messageWihtContent:(CNLiveChatMessage *)content isRight:(BOOL)isRight | ||
| 35 | +{ | ||
| 36 | + LVCMessage *msg = [LVCMessage new]; | ||
| 37 | + msg.isRight = isRight; | ||
| 38 | + msg.content = content.messageContent; | ||
| 39 | + msg.nikename = content.userInfo.name; | ||
| 40 | + msg.portraits = content.userInfo.portraitUri; | ||
| 41 | + | ||
| 42 | + CGRect rect = [msg.content boundingRectWithSize:CGSizeMake((SCREEN_WIDTH-60)*0.8, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14]} context:nil]; | ||
| 43 | + CGRect frameOfLabel = CGRectZero; | ||
| 44 | + | ||
| 45 | + frameOfLabel.size = rect.size; | ||
| 46 | + | ||
| 47 | + if (isRight) { //我的消息 | ||
| 48 | + | ||
| 49 | + msg.portraitsFrame = CGRectMake(SCREEN_WIDTH-45, ICON_TOP_SPACE, ICON_WIDTH, ICON_WIDTH); | ||
| 50 | + | ||
| 51 | + 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); | ||
| 52 | + | ||
| 53 | + msg.contentFrame = CGRectMake(POP_TOP_SPACE, POP_TOP_SPACE, CGRectGetWidth(rect), CGRectGetHeight(rect)); | ||
| 54 | + | ||
| 55 | + msg.cellHeight = CGRectGetHeight(msg.popFrame)+20; | ||
| 56 | + | ||
| 57 | + } else { //收到的消息 | ||
| 58 | + | ||
| 59 | + msg.nikenameFrame = CGRectMake(POP_TOP_SPACE, ICON_TOP_SPACE, CGRectGetWidth(rect), 12); | ||
| 60 | + | ||
| 61 | + msg.lineFrame = CGRectMake(POP_TOP_SPACE, 25, CGRectGetWidth(rect), 0.5); | ||
| 62 | + | ||
| 63 | + msg.portraitsFrame = CGRectMake(10, ICON_TOP_SPACE , ICON_WIDTH, ICON_WIDTH); | ||
| 64 | + | ||
| 65 | + msg.popFrame = CGRectMake(50, POP_TOP_SPACE , CGRectGetWidth(rect)+2*POP_TOP_SPACE, CGRectGetHeight(rect)+2*POP_TOP_SPACE+20); | ||
| 66 | + | ||
| 67 | + msg.contentFrame = CGRectMake(POP_TOP_SPACE, 30, CGRectGetWidth(rect), CGRectGetHeight(rect)); | ||
| 68 | + | ||
| 69 | + msg.cellHeight = CGRectGetHeight(msg.popFrame)+20; | ||
| 70 | + | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + return msg; | ||
| 74 | +} | ||
| 75 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/HomeViewController.m
| @@ -11,6 +11,7 @@ | @@ -11,6 +11,7 @@ | ||
| 11 | #import "LVCInteractionController.h" | 11 | #import "LVCInteractionController.h" |
| 12 | #import "LVCLivePlayerController.h" | 12 | #import "LVCLivePlayerController.h" |
| 13 | #import "LVCUGCLivePlayerController.h" | 13 | #import "LVCUGCLivePlayerController.h" |
| 14 | +#import "LVCTVLiveViewController.h" | ||
| 14 | 15 | ||
| 15 | @interface HomeViewController () | 16 | @interface HomeViewController () |
| 16 | 17 | ||
| @@ -55,8 +56,8 @@ | @@ -55,8 +56,8 @@ | ||
| 55 | 56 | ||
| 56 | - (void)liveAction | 57 | - (void)liveAction |
| 57 | { | 58 | { |
| 58 | - LVCLivePlayerController *liveVC = [[LVCLivePlayerController alloc] init]; | ||
| 59 | - self.navigationController.navigationBar.hidden = YES; | 59 | + LVCTVLiveViewController *liveVC = [[LVCTVLiveViewController alloc] init]; |
| 60 | +// self.navigationController.navigationBar.hidden = YES; | ||
| 60 | [self.navigationController pushViewController:liveVC animated:YES]; | 61 | [self.navigationController pushViewController:liveVC animated:YES]; |
| 61 | } | 62 | } |
| 62 | 63 |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCLivePlayerController.m
| @@ -15,10 +15,10 @@ | @@ -15,10 +15,10 @@ | ||
| 15 | @interface LVCLivePlayerController ()<LVCPlayerDelegate,LVCInputViewDelegate> | 15 | @interface LVCLivePlayerController ()<LVCPlayerDelegate,LVCInputViewDelegate> |
| 16 | { | 16 | { |
| 17 | BOOL isHiddenStatusBar; //记录状态的隐藏显示 | 17 | BOOL isHiddenStatusBar; //记录状态的隐藏显示 |
| 18 | - CGRect playerFrame; // | 18 | + CGRect playerFrame; //播放器原始位置 |
| 19 | NSInteger _originalDirection; //记录原始方向 | 19 | NSInteger _originalDirection; //记录原始方向 |
| 20 | - | ||
| 21 | CGFloat keyboardHeight; //键盘高度 | 20 | CGFloat keyboardHeight; //键盘高度 |
| 21 | + NSString *_roomId; //聊天室ID | ||
| 22 | 22 | ||
| 23 | } | 23 | } |
| 24 | @property (nonatomic, strong) LVCPlayer *player; | 24 | @property (nonatomic, strong) LVCPlayer *player; |
| @@ -34,6 +34,8 @@ | @@ -34,6 +34,8 @@ | ||
| 34 | { | 34 | { |
| 35 | [super viewWillAppear:animated]; | 35 | [super viewWillAppear:animated]; |
| 36 | [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; | 36 | [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; |
| 37 | + [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; | ||
| 38 | + | ||
| 37 | } | 39 | } |
| 38 | 40 | ||
| 39 | - (void)viewWillDisappear:(BOOL)animated | 41 | - (void)viewWillDisappear:(BOOL)animated |
| @@ -45,9 +47,9 @@ | @@ -45,9 +47,9 @@ | ||
| 45 | 47 | ||
| 46 | - (void)viewDidLoad { | 48 | - (void)viewDidLoad { |
| 47 | [super viewDidLoad]; | 49 | [super viewDidLoad]; |
| 48 | - | ||
| 49 | self.view.backgroundColor = [UIColor blackColor]; | 50 | self.view.backgroundColor = [UIColor blackColor]; |
| 50 | 51 | ||
| 52 | + _roomId = @"778899"; | ||
| 51 | playerFrame = CGRectMake(0, 20, SCREEN_WIDTH, SCREEN_WIDTH*9/16); | 53 | playerFrame = CGRectMake(0, 20, SCREEN_WIDTH, SCREEN_WIDTH*9/16); |
| 52 | _originalDirection = 0; | 54 | _originalDirection = 0; |
| 53 | 55 | ||
| @@ -58,7 +60,18 @@ | @@ -58,7 +60,18 @@ | ||
| 58 | [self.view addSubview:self.chatView]; | 60 | [self.view addSubview:self.chatView]; |
| 59 | [self.view addSubview:self.inputView]; | 61 | [self.view addSubview:self.inputView]; |
| 60 | 62 | ||
| 63 | + //隐藏和显示输入框 | ||
| 64 | + __weak typeof(self) weakSelf = self; | ||
| 65 | + self.player.hideBlock = ^(BOOL hide) { | ||
| 66 | + weakSelf.inputView.hidden = hide; | ||
| 67 | + if (!hide) { | ||
| 68 | + [weakSelf.inputView.inputTextField becomeFirstResponder]; | ||
| 69 | + } | ||
| 70 | + }; | ||
| 71 | + | ||
| 61 | [self makeConstraints]; | 72 | [self makeConstraints]; |
| 73 | + | ||
| 74 | + [_player autoHideControlView]; //自动隐藏工具条 | ||
| 62 | } | 75 | } |
| 63 | 76 | ||
| 64 | - (void)addObservers | 77 | - (void)addObservers |
| @@ -136,13 +149,17 @@ | @@ -136,13 +149,17 @@ | ||
| 136 | _inputView.frame = CGRectMake(0, SCREEN_HEIGHT-50, SCREEN_WIDTH, 50); | 149 | _inputView.frame = CGRectMake(0, SCREEN_HEIGHT-50, SCREEN_WIDTH, 50); |
| 137 | } | 150 | } |
| 138 | 151 | ||
| 152 | +#pragma mark - | ||
| 153 | +#pragma mark - 屏幕旋转 | ||
| 139 | //旋转至全屏 | 154 | //旋转至全屏 |
| 140 | - (void)toFullWithrotationAngle:(CGFloat)angle | 155 | - (void)toFullWithrotationAngle:(CGFloat)angle |
| 141 | { | 156 | { |
| 157 | + _inputView.hidden = YES; | ||
| 158 | + | ||
| 142 | if (_player.isFullScreen) return; | 159 | if (_player.isFullScreen) return; |
| 143 | 160 | ||
| 144 | _player.isFullScreen = YES; | 161 | _player.isFullScreen = YES; |
| 145 | - | 162 | + |
| 146 | [self presentViewController:self.fullVC animated:NO completion:^{ | 163 | [self presentViewController:self.fullVC animated:NO completion:^{ |
| 147 | [_player removeFromSuperview]; | 164 | [_player removeFromSuperview]; |
| 148 | [self.fullVC.view addSubview:self.player]; | 165 | [self.fullVC.view addSubview:self.player]; |
| @@ -162,6 +179,7 @@ | @@ -162,6 +179,7 @@ | ||
| 162 | - (void)toHalfScreenWithrotationAngle:(CGFloat)angle | 179 | - (void)toHalfScreenWithrotationAngle:(CGFloat)angle |
| 163 | { | 180 | { |
| 164 | _player.isFullScreen = NO; | 181 | _player.isFullScreen = NO; |
| 182 | + _inputView.hidden = NO; | ||
| 165 | 183 | ||
| 166 | [_fullVC dismissViewControllerAnimated:NO completion:^{ | 184 | [_fullVC dismissViewControllerAnimated:NO completion:^{ |
| 167 | [_player removeFromSuperview]; | 185 | [_player removeFromSuperview]; |
| @@ -187,6 +205,10 @@ | @@ -187,6 +205,10 @@ | ||
| 187 | self.player.isFullScreen = NO; | 205 | self.player.isFullScreen = NO; |
| 188 | } else { | 206 | } else { |
| 189 | [_player stopPlaying]; | 207 | [_player stopPlaying]; |
| 208 | + | ||
| 209 | + //退出聊天室 | ||
| 210 | + [[CNLiveChatManager sharedCNLiveChatManager] quitChatRoom:_roomId success:NULL error:NULL]; | ||
| 211 | + | ||
| 190 | self.navigationController.navigationBar.hidden = NO; | 212 | self.navigationController.navigationBar.hidden = NO; |
| 191 | [self.navigationController popViewControllerAnimated:YES]; | 213 | [self.navigationController popViewControllerAnimated:YES]; |
| 192 | } | 214 | } |
| @@ -213,6 +235,8 @@ | @@ -213,6 +235,8 @@ | ||
| 213 | - (void)lvcInputView:(LVCInputView *)inputView sendMessage:(NSString *)message | 235 | - (void)lvcInputView:(LVCInputView *)inputView sendMessage:(NSString *)message |
| 214 | { | 236 | { |
| 215 | NSLog(@"发送消息(%@)",message); | 237 | NSLog(@"发送消息(%@)",message); |
| 238 | + | ||
| 239 | + [_chatView sendMsgWithMessage:message]; | ||
| 216 | 240 | ||
| 217 | } | 241 | } |
| 218 | 242 | ||
| @@ -221,6 +245,7 @@ | @@ -221,6 +245,7 @@ | ||
| 221 | [self.view endEditing:YES]; | 245 | [self.view endEditing:YES]; |
| 222 | } | 246 | } |
| 223 | 247 | ||
| 248 | + | ||
| 224 | #pragma mark - | 249 | #pragma mark - |
| 225 | #pragma mark - makeConstraints | 250 | #pragma mark - makeConstraints |
| 226 | - (void)makeConstraints | 251 | - (void)makeConstraints |
| @@ -238,21 +263,17 @@ | @@ -238,21 +263,17 @@ | ||
| 238 | - (void)makePlayerViewConstraints:(BOOL)fullScreen | 263 | - (void)makePlayerViewConstraints:(BOOL)fullScreen |
| 239 | { | 264 | { |
| 240 | if (fullScreen) { //全屏 | 265 | if (fullScreen) { //全屏 |
| 241 | - | ||
| 242 | [self.player mas_remakeConstraints:^(MASConstraintMaker *make) { | 266 | [self.player mas_remakeConstraints:^(MASConstraintMaker *make) { |
| 243 | make.top.left.right.bottom.mas_equalTo(0); | 267 | make.top.left.right.bottom.mas_equalTo(0); |
| 244 | }]; | 268 | }]; |
| 245 | - | ||
| 246 | _inputView.frame = CGRectMake(0, SCREEN_HEIGHT-50, SCREEN_WIDTH, 49); | 269 | _inputView.frame = CGRectMake(0, SCREEN_HEIGHT-50, SCREEN_WIDTH, 49); |
| 247 | 270 | ||
| 248 | } else { //半屏 | 271 | } else { //半屏 |
| 249 | - | ||
| 250 | [self.player mas_remakeConstraints:^(MASConstraintMaker *make) { | 272 | [self.player mas_remakeConstraints:^(MASConstraintMaker *make) { |
| 251 | make.top.mas_equalTo(20); | 273 | make.top.mas_equalTo(20); |
| 252 | make.left.right.mas_equalTo(0); | 274 | make.left.right.mas_equalTo(0); |
| 253 | make.height.equalTo(@(playerFrame.size.height)); | 275 | make.height.equalTo(@(playerFrame.size.height)); |
| 254 | }]; | 276 | }]; |
| 255 | - | ||
| 256 | _inputView.frame = CGRectMake(0, SCREEN_HEIGHT-50, SCREEN_WIDTH, 49); | 277 | _inputView.frame = CGRectMake(0, SCREEN_HEIGHT-50, SCREEN_WIDTH, 49); |
| 257 | 278 | ||
| 258 | } | 279 | } |
| @@ -289,7 +310,7 @@ | @@ -289,7 +310,7 @@ | ||
| 289 | - (LVCChatView *)chatView | 310 | - (LVCChatView *)chatView |
| 290 | { | 311 | { |
| 291 | if (!_chatView) { | 312 | if (!_chatView) { |
| 292 | - _chatView = [[LVCChatView alloc] initWithFrame:CGRectMake(0, SCREEN_WIDTH*9/16+20, SCREEN_WIDTH, SCREEN_HEIGHT-SCREEN_WIDTH*9/16-20-49) roomId:@"1122"]; | 313 | + _chatView = [[LVCChatView alloc] initWithFrame:CGRectMake(0, SCREEN_WIDTH*9/16+20, SCREEN_WIDTH, SCREEN_HEIGHT-SCREEN_WIDTH*9/16-20-49) roomId:_roomId]; |
| 293 | } | 314 | } |
| 294 | return _chatView; | 315 | return _chatView; |
| 295 | } | 316 | } |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCMoreProgramViewController.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCMoreProgramViewController.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +@interface LVCMoreProgramViewController : UIViewController | ||
| 12 | + | ||
| 13 | +@property (nonatomic, strong) NSString *cid; | ||
| 14 | + | ||
| 15 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCMoreProgramViewController.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCMoreProgramViewController.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCMoreProgramViewController.h" | ||
| 10 | +#import "LVCMoreSortTableViewCell.h" | ||
| 11 | +#import "LVCProgramModel.h" | ||
| 12 | + | ||
| 13 | +@interface LVCMoreProgramViewController ()<UITableViewDelegate,UITableViewDataSource> | ||
| 14 | +{ | ||
| 15 | + NSMutableArray *_data; | ||
| 16 | + int _page; //请求数据的页数 | ||
| 17 | + int _next; | ||
| 18 | +} | ||
| 19 | +@property (nonatomic, strong)UITableView *tableView; | ||
| 20 | +@property (nonatomic, strong) UIView *bbView; | ||
| 21 | + | ||
| 22 | +@end | ||
| 23 | + | ||
| 24 | +@implementation LVCMoreProgramViewController | ||
| 25 | + | ||
| 26 | +- (void)viewDidLoad { | ||
| 27 | + [super viewDidLoad]; | ||
| 28 | + self.view.backgroundColor = [UIColor backgroundColorZX]; | ||
| 29 | + _data = [[NSMutableArray alloc] init]; | ||
| 30 | + [self.view addSubview:self.tableView]; | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | +- (void)setCid:(NSString *)cid { | ||
| 34 | + _cid = cid; | ||
| 35 | + [self.tableView.header beginRefreshing]; | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +- (void)request:(int)page refresh:(BOOL)refresh | ||
| 39 | +{ | ||
| 40 | + NSDictionary *parameters = @{@"page": [NSString stringWithFormat:@"%d", page], | ||
| 41 | + @"pagesize": @"15", | ||
| 42 | + @"cid": self.cid ? self.cid : @"", | ||
| 43 | + @"type": @"live", | ||
| 44 | + @"version": @"5.3", @"appid": @"spzg", @"plat": @"a"}; | ||
| 45 | + [[AFHTTPSessionManager manager] GET:@"http://app.jczb.cnlive.com/api/catprogramlist" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { | ||
| 46 | + | ||
| 47 | + if (refresh) { | ||
| 48 | + _page = 1; | ||
| 49 | + [_tableView.header endRefreshing]; | ||
| 50 | + [_data removeAllObjects]; | ||
| 51 | + } else { | ||
| 52 | + [_tableView.footer endRefreshing]; | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + _next = [[responseObject objectForKey:@"next_cursor"] intValue]; | ||
| 56 | + for (NSDictionary *dic in [responseObject objectForKey:@"programs"]) { | ||
| 57 | + LVCProgramModel *model = [LVCProgramModel mj_objectWithKeyValues:dic]; | ||
| 58 | + [_data addObject:model]; | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + [_tableView reloadData]; | ||
| 62 | + | ||
| 63 | + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { | ||
| 64 | + if (refresh) { | ||
| 65 | + [_tableView.header endRefreshing]; | ||
| 66 | + } else { | ||
| 67 | + _page -= 1; | ||
| 68 | + [_tableView.footer endRefreshing]; | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + NSLog(@"电视台更多节目列表获取失败"); | ||
| 72 | + | ||
| 73 | + }]; | ||
| 74 | +} | ||
| 75 | + | ||
| 76 | + | ||
| 77 | +- (void)refreshAction | ||
| 78 | +{ | ||
| 79 | + [self request:1 refresh:YES]; | ||
| 80 | +} | ||
| 81 | + | ||
| 82 | +- (void)loadMoreAction | ||
| 83 | +{ | ||
| 84 | + _page += 1; | ||
| 85 | + if (_next == 0) { | ||
| 86 | + if (_page != 1) { | ||
| 87 | + [_tableView.footer endRefreshing]; | ||
| 88 | + return ; | ||
| 89 | + } | ||
| 90 | + } else { | ||
| 91 | + [self request:_page refresh:NO]; | ||
| 92 | + } | ||
| 93 | +} | ||
| 94 | + | ||
| 95 | +#pragma mark - | ||
| 96 | +#pragma mark - UITableView | ||
| 97 | +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section | ||
| 98 | +{ | ||
| 99 | + return _data.count; | ||
| 100 | +} | ||
| 101 | + | ||
| 102 | +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath | ||
| 103 | +{ | ||
| 104 | + static NSString *identify = @"liveMoreProgramCell"; | ||
| 105 | + LVCMoreSortTableViewCell *cell = (LVCMoreSortTableViewCell *)[tableView dequeueReusableCellWithIdentifier:identify]; | ||
| 106 | + if (cell == nil) { | ||
| 107 | + cell = [[LVCMoreSortTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identify]; | ||
| 108 | + if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { | ||
| 109 | + cell.separatorInset = UIEdgeInsetsZero; | ||
| 110 | + } | ||
| 111 | + if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { | ||
| 112 | + cell.layoutMargins = UIEdgeInsetsZero; | ||
| 113 | + } | ||
| 114 | + } | ||
| 115 | + cell.model = [_data objectAtIndex:indexPath.row]; | ||
| 116 | + return cell; | ||
| 117 | +} | ||
| 118 | + | ||
| 119 | +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath | ||
| 120 | +{ | ||
| 121 | + if (SCREEN_WIDTH == 320.0) { | ||
| 122 | + return 80.0; | ||
| 123 | + } else if (SCREEN_WIDTH == 375.0) { | ||
| 124 | + return 93.0; | ||
| 125 | + } else if (SCREEN_WIDTH == 414.0) { | ||
| 126 | + return 103.0; | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + return 93.0; | ||
| 130 | +} | ||
| 131 | + | ||
| 132 | +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath | ||
| 133 | +{ | ||
| 134 | + [tableView deselectRowAtIndexPath:indexPath animated:YES]; | ||
| 135 | + | ||
| 136 | +} | ||
| 137 | + | ||
| 138 | +#pragma mark - | ||
| 139 | +#pragma mark - getter | ||
| 140 | +- (UITableView *)tableView | ||
| 141 | +{ | ||
| 142 | + if (!_tableView) { | ||
| 143 | + _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) style:UITableViewStylePlain]; | ||
| 144 | + _tableView.showsHorizontalScrollIndicator = NO; | ||
| 145 | + _tableView.showsVerticalScrollIndicator = NO; | ||
| 146 | + _tableView.delegate = self; | ||
| 147 | + _tableView.dataSource = self; | ||
| 148 | + _tableView.backgroundColor = [UIColor clearColor]; | ||
| 149 | + _tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; | ||
| 150 | + _tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(refreshAction)]; | ||
| 151 | + _tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreAction)]; | ||
| 152 | + if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) { | ||
| 153 | + [_tableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)]; | ||
| 154 | + } | ||
| 155 | + | ||
| 156 | + if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) { | ||
| 157 | + [_tableView setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)]; | ||
| 158 | + } | ||
| 159 | + _tableView.backgroundColor = [UIColor clearColor]; | ||
| 160 | + } | ||
| 161 | + return _tableView; | ||
| 162 | +} | ||
| 163 | + | ||
| 164 | + | ||
| 165 | + | ||
| 166 | +- (void)didReceiveMemoryWarning { | ||
| 167 | + [super didReceiveMemoryWarning]; | ||
| 168 | + // Dispose of any resources that can be recreated. | ||
| 169 | +} | ||
| 170 | + | ||
| 171 | +/* | ||
| 172 | +#pragma mark - Navigation | ||
| 173 | + | ||
| 174 | +// In a storyboard-based application, you will often want to do a little preparation before navigation | ||
| 175 | +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | ||
| 176 | + // Get the new view controller using [segue destinationViewController]. | ||
| 177 | + // Pass the selected object to the new view controller. | ||
| 178 | +} | ||
| 179 | +*/ | ||
| 180 | + | ||
| 181 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCTVLiveViewController.h
0 → 100644
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCTVLiveViewController.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCLiveViewController.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCTVLiveViewController.h" | ||
| 10 | +#import "LVCTelevisionView.h" | ||
| 11 | + | ||
| 12 | +@interface LVCTVLiveViewController () | ||
| 13 | + | ||
| 14 | +@property (nonatomic, strong) LVCTelevisionView *tvView; | ||
| 15 | + | ||
| 16 | +@end | ||
| 17 | + | ||
| 18 | +@implementation LVCTVLiveViewController | ||
| 19 | + | ||
| 20 | +- (void)viewDidLoad { | ||
| 21 | + [super viewDidLoad]; | ||
| 22 | + | ||
| 23 | + self.view.backgroundColor = [UIColor whiteColor]; | ||
| 24 | + | ||
| 25 | + [self.view addSubview:self.tvView]; | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +- (LVCTelevisionView *)tvView | ||
| 29 | +{ | ||
| 30 | + if (!_tvView) { | ||
| 31 | + _tvView = [[LVCTelevisionView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; | ||
| 32 | + } | ||
| 33 | + return _tvView; | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +- (void)didReceiveMemoryWarning { | ||
| 37 | + [super didReceiveMemoryWarning]; | ||
| 38 | + // Dispose of any resources that can be recreated. | ||
| 39 | +} | ||
| 40 | + | ||
| 41 | +/* | ||
| 42 | +#pragma mark - Navigation | ||
| 43 | + | ||
| 44 | +// In a storyboard-based application, you will often want to do a little preparation before navigation | ||
| 45 | +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | ||
| 46 | + // Get the new view controller using [segue destinationViewController]. | ||
| 47 | + // Pass the selected object to the new view controller. | ||
| 48 | +} | ||
| 49 | +*/ | ||
| 50 | + | ||
| 51 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Model/LVCBannerModel.h
0 → 100644
| 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
0 → 100644
| 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/Model/LVCChannelDetailsModel.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCChannelDetailsModel.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 LVCChannelDetailsModel : NSObject | ||
| 12 | + | ||
| 13 | + | ||
| 14 | +// 直播播放 channelId | ||
| 15 | +@property (nonatomic, copy) NSString *mediaId; | ||
| 16 | +// 播放类型 live直播 | ||
| 17 | +@property (nonatomic, copy) NSString *type; | ||
| 18 | +// 节目名称 | ||
| 19 | +@property (nonatomic, copy) NSString *title; | ||
| 20 | +// 节目详情 | ||
| 21 | +@property (nonatomic, copy) NSString *subTitle; | ||
| 22 | +// 节目图片 | ||
| 23 | +@property (nonatomic, copy) NSString *img; | ||
| 24 | +// 正在直播 | ||
| 25 | +@property (nonatomic, copy) NSString *currentPlay; | ||
| 26 | +// 即将直播 | ||
| 27 | +@property (nonatomic, copy) NSString *nextPlay; | ||
| 28 | +// 活动id (???) | ||
| 29 | +@property (nonatomic, copy) NSString *activityId; | ||
| 30 | +@property (nonatomic, copy) NSString *docID; | ||
| 31 | +@property (nonatomic, copy) NSString *desc; | ||
| 32 | + | ||
| 33 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Model/LVCChannelDetailsModel.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCChannelDetailsModel.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCChannelDetailsModel.h" | ||
| 10 | + | ||
| 11 | +@implementation LVCChannelDetailsModel | ||
| 12 | + | ||
| 13 | +- (void)setValue:(id)value forUndefinedKey:(NSString *)key { | ||
| 14 | + | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +- (NSString *)description { | ||
| 18 | + | ||
| 19 | + return [NSString stringWithFormat:@"mediaId:%@, type:%@, title:%@, img:%@",_mediaId,_type,_title,_img]; | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Model/LVCChannelsModel.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCChannelsModel.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 | +#import "LVCChannelDetailsModel.h" | ||
| 11 | + | ||
| 12 | +@interface LVCChannelsModel : NSObject | ||
| 13 | + | ||
| 14 | +@property (nonatomic, copy) NSString *title; | ||
| 15 | +// 列表详情模型数组 | ||
| 16 | +@property (nonatomic, strong) NSArray <LVCChannelDetailsModel *> *programs; | ||
| 17 | +@property (nonatomic, copy) NSString *cid; | ||
| 18 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Model/LVCChannelsModel.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCChannelsModel.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCChannelsModel.h" | ||
| 10 | + | ||
| 11 | +@implementation LVCChannelsModel | ||
| 12 | + | ||
| 13 | +- (void)setValue:(id)value forKey:(NSString *)key { | ||
| 14 | + | ||
| 15 | + if ([key isEqualToString:@"programs"]) { | ||
| 16 | + | ||
| 17 | + NSArray *array = value; | ||
| 18 | + | ||
| 19 | + NSMutableArray *arrayM = [NSMutableArray array]; | ||
| 20 | + | ||
| 21 | + for (NSDictionary *dict in array) { | ||
| 22 | + | ||
| 23 | + LVCChannelDetailsModel *model = [[LVCChannelDetailsModel alloc] init]; | ||
| 24 | + | ||
| 25 | + [model setValuesForKeysWithDictionary:dict]; | ||
| 26 | + | ||
| 27 | + [arrayM addObject:model]; | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + _programs = arrayM.copy; | ||
| 31 | + | ||
| 32 | + return; | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + [super setValue:value forKey:key]; | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +- (void)setValue:(id)value forUndefinedKey:(NSString *)key { | ||
| 39 | + | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +- (NSString *)description { | ||
| 43 | + return [NSString stringWithFormat:@"title:%@, programs:%@",_title,_programs]; | ||
| 44 | +} | ||
| 45 | + | ||
| 46 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatRoomModel.h renamed to LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Model/LVCChatRoomModel.h
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/ChatView/LVCChatRoomModel.m renamed to LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Model/LVCChatRoomModel.m
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Model/LVCProgramModel.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCProgramModel.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 LVCProgramModel : NSObject | ||
| 12 | + | ||
| 13 | +@property (nonatomic, strong)NSString *currentPlay; | ||
| 14 | +@property (nonatomic, strong)NSString *desc; | ||
| 15 | +@property (nonatomic, strong)NSString *docID; | ||
| 16 | +@property (nonatomic, strong)NSString *img; | ||
| 17 | +@property (nonatomic, strong)NSString *mediaId; | ||
| 18 | +@property (nonatomic, strong)NSString *nextPlay; | ||
| 19 | +@property (nonatomic, strong)NSString *subTitle; | ||
| 20 | +@property (nonatomic, strong)NSString *title; | ||
| 21 | +@property (nonatomic, strong)NSString *type; | ||
| 22 | +@property (nonatomic, strong)NSString *vipFlag; | ||
| 23 | + | ||
| 24 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Model/LVCProgramModel.m
0 → 100644
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCFirstHeaderReusableView.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCFirstHeaderReusableView.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +#import "LVCBannerModel.h" | ||
| 11 | + | ||
| 12 | +@interface LVCFirstHeaderReusableView : UICollectionReusableView | ||
| 13 | + | ||
| 14 | +@property (nonatomic, strong) NSArray <NSURL *> *imageUrls; | ||
| 15 | +@property (nonatomic, strong) NSArray <LVCBannerModel *> *modelArray; | ||
| 16 | + | ||
| 17 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCFirstHeaderReusableView.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCFirstHeaderReusableView.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCFirstHeaderReusableView.h" | ||
| 10 | +#import "LVCHeaderRollCollectionViewCell.h" | ||
| 11 | +#import "LVCLivePlayerController.h" | ||
| 12 | + | ||
| 13 | +#define kDataScaleSeed 100 | ||
| 14 | +static NSString *cellId = @"cellId"; | ||
| 15 | + | ||
| 16 | +@interface CZSlideLayout: UICollectionViewFlowLayout | ||
| 17 | + | ||
| 18 | +@end | ||
| 19 | +@implementation CZSlideLayout | ||
| 20 | + | ||
| 21 | +- (void)prepareLayout { | ||
| 22 | + [super prepareLayout]; | ||
| 23 | + self.itemSize = self.collectionView.bounds.size; | ||
| 24 | + self.minimumLineSpacing = 0; | ||
| 25 | + self.minimumInteritemSpacing = 0; | ||
| 26 | + self.scrollDirection = UICollectionViewScrollDirectionHorizontal; | ||
| 27 | +} | ||
| 28 | +@end | ||
| 29 | + | ||
| 30 | +@interface LVCFirstHeaderReusableView ()<UICollectionViewDelegate,UICollectionViewDataSource> | ||
| 31 | +{ | ||
| 32 | + // 定时器 | ||
| 33 | + NSTimer *_timer; | ||
| 34 | + // 定时器触发时间 | ||
| 35 | + NSTimeInterval _timerDuration; | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +@property (nonatomic, weak) UICollectionView *collectionView; | ||
| 39 | +@property (nonatomic, weak) UIPageControl *pageControl; | ||
| 40 | +@property (nonatomic, strong)UIButton *button; | ||
| 41 | +@property (nonatomic, strong)UILabel *cycleViewTitle; //轮播下方标题 | ||
| 42 | + | ||
| 43 | +@end | ||
| 44 | + | ||
| 45 | +@implementation LVCFirstHeaderReusableView | ||
| 46 | + | ||
| 47 | +#pragma mark - 构造函数 | ||
| 48 | +- (instancetype)initWithFrame:(CGRect)frame | ||
| 49 | +{ | ||
| 50 | + self = [super initWithFrame:frame]; | ||
| 51 | + if (self) { | ||
| 52 | + [self setupUI]; | ||
| 53 | + } | ||
| 54 | + return self; | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +#pragma mark - 设置数据 | ||
| 58 | +- (void)setImageUrls:(NSArray<NSURL *> *)imageUrls { | ||
| 59 | + _imageUrls = imageUrls; | ||
| 60 | + | ||
| 61 | + if (_timer != nil) { | ||
| 62 | + [_timer invalidate]; | ||
| 63 | + } | ||
| 64 | + [_collectionView reloadData]; | ||
| 65 | + [self addSubview:self.cycleViewTitle]; | ||
| 66 | + | ||
| 67 | + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:_imageUrls.count * kDataScaleSeed inSection:0]; | ||
| 68 | + | ||
| 69 | + [_collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO]; | ||
| 70 | + | ||
| 71 | + // _pageControl.currentPage = 0; | ||
| 72 | + // _pageControl.numberOfPages = _imageUrls.count; | ||
| 73 | + | ||
| 74 | + _timerDuration = 4.0; | ||
| 75 | + _timer = [NSTimer timerWithTimeInterval:_timerDuration target:self selector:@selector(updateTimer) userInfo:nil repeats:YES]; | ||
| 76 | + | ||
| 77 | + [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes]; | ||
| 78 | +} | ||
| 79 | + | ||
| 80 | +- (void)setModelArray:(NSArray<LVCBannerModel *> *)modelArray { | ||
| 81 | + _modelArray = modelArray; | ||
| 82 | + self.cycleViewTitle.text = [NSString stringWithFormat:@" %@",_modelArray[0].title]; | ||
| 83 | +} | ||
| 84 | + | ||
| 85 | +#pragma mark - 子视图 | ||
| 86 | +- (UILabel *)cycleViewTitle | ||
| 87 | +{ | ||
| 88 | + if (!_cycleViewTitle) { | ||
| 89 | + | ||
| 90 | + _cycleViewTitle = [[UILabel alloc] initWithFrame:CGRectMake(10, self.collectionView.bottom-35, self.collectionView.width, 35)]; | ||
| 91 | + _cycleViewTitle.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5]; | ||
| 92 | + _cycleViewTitle.textColor = [UIColor whiteColor]; | ||
| 93 | + _cycleViewTitle.font = [UIFont systemFontOfSize:19]; | ||
| 94 | + } | ||
| 95 | + return _cycleViewTitle; | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +#pragma mark - 时钟方法 | ||
| 99 | +- (void)updateTimer { | ||
| 100 | + | ||
| 101 | + NSIndexPath *indexPath = [_collectionView indexPathsForVisibleItems].lastObject; | ||
| 102 | + NSIndexPath *newIndexPath = [NSIndexPath indexPathForItem:indexPath.item + 1 inSection:indexPath.section]; | ||
| 103 | + | ||
| 104 | + [_collectionView scrollToItemAtIndexPath:newIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:YES]; | ||
| 105 | +} | ||
| 106 | + | ||
| 107 | +#pragma mark - UICollectionViewDataSource 数据源协议方法! | ||
| 108 | +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { | ||
| 109 | + | ||
| 110 | + return _imageUrls.count * kDataScaleSeed * 2; | ||
| 111 | +} | ||
| 112 | + | ||
| 113 | +- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { | ||
| 114 | + | ||
| 115 | + LVCHeaderRollCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; | ||
| 116 | + NSInteger index = indexPath.item % _imageUrls.count; | ||
| 117 | + cell.imageUrl = _imageUrls[index]; | ||
| 118 | + return cell; | ||
| 119 | +} | ||
| 120 | + | ||
| 121 | +#pragma mark - UICollectionViewDelegate | ||
| 122 | +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { | ||
| 123 | + | ||
| 124 | + if (_imageUrls.count == 0) { | ||
| 125 | + return; | ||
| 126 | + } | ||
| 127 | + | ||
| 128 | + CGFloat offsetX = scrollView.contentOffset.x / scrollView.bounds.size.width; | ||
| 129 | + | ||
| 130 | + // 2. 根据 offsetX 四舍五入计算页数 | ||
| 131 | + NSInteger page = (NSInteger)(offsetX + 0.5); | ||
| 132 | + | ||
| 133 | + // 3. 根据数组数量,取余数 | ||
| 134 | + page = page % _imageUrls.count; | ||
| 135 | + | ||
| 136 | + // NSLog(@"%zd!!!", page); | ||
| 137 | + | ||
| 138 | + _pageControl.currentPage = page; | ||
| 139 | + | ||
| 140 | + self.cycleViewTitle.text = [NSString stringWithFormat:@" %@",_modelArray[page].title]; | ||
| 141 | +} | ||
| 142 | + | ||
| 143 | +/** | ||
| 144 | + * 通过设置 contentOffset 动画滚动完成之后调用 | ||
| 145 | + */ | ||
| 146 | +- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { | ||
| 147 | + // 主动调用动画停止代理方法 | ||
| 148 | + [self scrollViewDidEndDecelerating:scrollView]; | ||
| 149 | +} | ||
| 150 | + | ||
| 151 | +/** | ||
| 152 | + * 滚动视图停止滚动会调用 | ||
| 153 | + */ | ||
| 154 | +- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { | ||
| 155 | + | ||
| 156 | + // 根据 contentOffset.x 判断页数 | ||
| 157 | + NSInteger page = scrollView.contentOffset.x / scrollView.bounds.size.width; | ||
| 158 | + | ||
| 159 | + // lastItem = _imageUrl.count * 2 | ||
| 160 | + NSInteger lastItem = [_collectionView numberOfItemsInSection:0]; | ||
| 161 | + | ||
| 162 | + // NSLog(@"第 %zd 页 - lastItem %zd", page, lastItem); | ||
| 163 | + // 只处理第 0 页,和最后一页 | ||
| 164 | + if (page == 0 || page == (lastItem - 1)) { | ||
| 165 | + // 如果是 0 页,跳转到 _imageUrl.count | ||
| 166 | + // 如果是最后一页,跳转到 _imageUrl.count - 1 | ||
| 167 | + NSInteger offset = _imageUrls.count * kDataScaleSeed; | ||
| 168 | + | ||
| 169 | + // 判断最后一页 | ||
| 170 | + if (page == (lastItem - 1)) { | ||
| 171 | + offset = offset - 1; // (5 - 1) * 10 = 40 // 5 * 10 - 1 | ||
| 172 | + } | ||
| 173 | + | ||
| 174 | + // 设置 contentOffset | ||
| 175 | + // NSLog(@"我要跳转到 %zd", offset); | ||
| 176 | + | ||
| 177 | + CGFloat width = scrollView.bounds.size.width; | ||
| 178 | + | ||
| 179 | + scrollView.contentOffset = CGPointMake(offset * width, 0); | ||
| 180 | + } | ||
| 181 | +} | ||
| 182 | + | ||
| 183 | +// 开始拖,暂停时钟! | ||
| 184 | +- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { | ||
| 185 | + | ||
| 186 | + _timer.fireDate = [NSDate distantFuture]; | ||
| 187 | +} | ||
| 188 | + | ||
| 189 | +// 结束拖,继续时钟! | ||
| 190 | +- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { | ||
| 191 | + | ||
| 192 | + _timer.fireDate = [NSDate dateWithTimeIntervalSinceNow:_timerDuration]; | ||
| 193 | +} | ||
| 194 | + | ||
| 195 | +// 选择 | ||
| 196 | +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath | ||
| 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 | + */ | ||
| 203 | +} | ||
| 204 | + | ||
| 205 | +#pragma mark - 第一个组头设置界面 | ||
| 206 | +- (void)setupUI { | ||
| 207 | + | ||
| 208 | + CZSlideLayout *layout = [[CZSlideLayout alloc] init]; | ||
| 209 | + UICollectionView *cv = [[UICollectionView alloc] initWithFrame:CGRectMake(10, 7, SCREEN_WIDTH-20, (SCREEN_WIDTH-20)/2) collectionViewLayout:layout]; | ||
| 210 | + cv.backgroundColor = [UIColor whiteColor]; | ||
| 211 | + | ||
| 212 | + [self addSubview:cv]; | ||
| 213 | + | ||
| 214 | + [cv registerClass:[LVCHeaderRollCollectionViewCell class] forCellWithReuseIdentifier:cellId]; | ||
| 215 | + | ||
| 216 | + cv.dataSource = self; | ||
| 217 | + cv.delegate = self; | ||
| 218 | + | ||
| 219 | + cv.pagingEnabled = YES; | ||
| 220 | + cv.showsVerticalScrollIndicator = NO; | ||
| 221 | + cv.showsHorizontalScrollIndicator = NO; | ||
| 222 | + cv.bounces = NO; | ||
| 223 | + | ||
| 224 | + UIPageControl *pager = [[UIPageControl alloc] init]; | ||
| 225 | + pager.numberOfPages = 0; | ||
| 226 | + pager.currentPage = 0; | ||
| 227 | + pager.currentPageIndicatorTintColor = [UIColor yellowColor]; | ||
| 228 | + pager.pageIndicatorTintColor = [UIColor redColor]; | ||
| 229 | + pager.userInteractionEnabled = NO; | ||
| 230 | + | ||
| 231 | + _collectionView = cv; | ||
| 232 | + _pageControl = pager; | ||
| 233 | +} | ||
| 234 | + | ||
| 235 | +- (void)removeFromSuperview { | ||
| 236 | + [super removeFromSuperview]; | ||
| 237 | + | ||
| 238 | + [_timer invalidate]; | ||
| 239 | +} | ||
| 240 | + | ||
| 241 | +// 添加了时钟 & 运行循环,dealloc 方法不会被调用! | ||
| 242 | +- (void)dealloc { | ||
| 243 | + | ||
| 244 | +} | ||
| 245 | + | ||
| 246 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCHeaderRollCollectionViewCell.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCHeaderRollCollectionViewCell.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +@interface LVCHeaderRollCollectionViewCell : UICollectionViewCell | ||
| 12 | + | ||
| 13 | +@property (nonatomic, strong) NSURL *imageUrl; | ||
| 14 | + | ||
| 15 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCHeaderRollCollectionViewCell.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCHeaderRollCollectionViewCell.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCHeaderRollCollectionViewCell.h" | ||
| 10 | + | ||
| 11 | +@interface LVCHeaderRollCollectionViewCell () | ||
| 12 | + | ||
| 13 | +@property (nonatomic, strong) UIImageView *imageView; | ||
| 14 | + | ||
| 15 | +@end | ||
| 16 | + | ||
| 17 | +@implementation LVCHeaderRollCollectionViewCell | ||
| 18 | + | ||
| 19 | +- (instancetype)initWithFrame:(CGRect)frame | ||
| 20 | +{ | ||
| 21 | + self = [super initWithFrame:frame]; | ||
| 22 | + if (self) { | ||
| 23 | + | ||
| 24 | + [self.contentView addSubview:self.imageView]; | ||
| 25 | + | ||
| 26 | + } | ||
| 27 | + return self; | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +#pragma mark - | ||
| 31 | +#pragma mark - setter | ||
| 32 | +- (void)setImageUrl:(NSURL *)imageUrl { | ||
| 33 | + _imageUrl = imageUrl; | ||
| 34 | + [_imageView sd_setImageWithURL:imageUrl placeholderImage:[UIImage imageNamed:@"load_03"]]; | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +#pragma mark - | ||
| 38 | +#pragma mark - gstter | ||
| 39 | +- (UIImageView *)imageView | ||
| 40 | +{ | ||
| 41 | + if (!_imageView) { | ||
| 42 | + _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH-20, (SCREEN_WIDTH-20)/2)]; | ||
| 43 | + _imageView.backgroundColor = [UIColor whiteColor]; | ||
| 44 | + _imageView.contentMode = UIViewContentModeScaleToFill; | ||
| 45 | + } | ||
| 46 | + return _imageView; | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCLiveListCollectionViewCell.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCLiveListCollectionViewCell.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +#import "LVCChannelDetailsModel.h" | ||
| 11 | + | ||
| 12 | +@interface LVCLiveListCollectionViewCell : UICollectionViewCell | ||
| 13 | + | ||
| 14 | +@property (nonatomic, strong) LVCChannelDetailsModel *details; | ||
| 15 | + | ||
| 16 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCLiveListCollectionViewCell.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCLiveListCollectionViewCell.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCLiveListCollectionViewCell.h" | ||
| 10 | + | ||
| 11 | +// 首页横版cell比例 | ||
| 12 | +#define H_Cell_Ratio (196.0/300) | ||
| 13 | + | ||
| 14 | +@interface LVCLiveListCollectionViewCell () | ||
| 15 | + | ||
| 16 | +@property (nonatomic, strong)UIImageView *image; | ||
| 17 | +@property (nonatomic, strong)UILabel *title; | ||
| 18 | +@property (nonatomic, strong)UILabel *detail; | ||
| 19 | + | ||
| 20 | +@end | ||
| 21 | + | ||
| 22 | +@implementation LVCLiveListCollectionViewCell | ||
| 23 | + | ||
| 24 | +- (instancetype)initWithFrame:(CGRect)frame | ||
| 25 | +{ | ||
| 26 | + self = [super initWithFrame:frame]; | ||
| 27 | + if (self) { | ||
| 28 | + | ||
| 29 | + self.contentView.backgroundColor = [UIColor whiteColor]; | ||
| 30 | + [self.contentView addSubview:self.image]; | ||
| 31 | + [self.contentView addSubview:self.title]; | ||
| 32 | + [self.contentView addSubview:self.detail]; | ||
| 33 | + | ||
| 34 | + } | ||
| 35 | + return self; | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +- (void)setDetails:(LVCChannelDetailsModel *)details { | ||
| 39 | + | ||
| 40 | + self.title.font = [UIFont systemFontOfSize:13]; | ||
| 41 | + self.detail.font = [UIFont systemFontOfSize:12]; | ||
| 42 | + self.title.text = [NSString stringWithFormat:@"正在直播:%@", details.currentPlay]; | ||
| 43 | + self.detail.text = [NSString stringWithFormat:@"即将直播:%@", details.nextPlay]; | ||
| 44 | + [self.image sd_setImageWithURL:[NSURL URLWithString:details.img] placeholderImage:[UIImage imageNamed:@"load_03"]]; | ||
| 45 | + | ||
| 46 | +} | ||
| 47 | + | ||
| 48 | +#pragma mark - | ||
| 49 | +#pragma mark - getter | ||
| 50 | +- (UIImageView *)image | ||
| 51 | +{ | ||
| 52 | + if (!_image) { | ||
| 53 | + _image = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.contentView.width, (self.contentView.width)*H_Cell_Ratio)]; | ||
| 54 | + _image.backgroundColor = [UIColor grayColor]; | ||
| 55 | + _image.contentMode = UIViewContentModeScaleAspectFill; | ||
| 56 | + _image.clipsToBounds = YES; | ||
| 57 | + } | ||
| 58 | + return _image; | ||
| 59 | +} | ||
| 60 | + | ||
| 61 | +- (UILabel *)title | ||
| 62 | +{ | ||
| 63 | + if (!_title) { | ||
| 64 | + _title = [[UILabel alloc] initWithFrame:CGRectMake(0, self.image.bottom+7, self.contentView.width, 12)]; | ||
| 65 | + _title.font = [UIFont systemFontOfSize:14]; | ||
| 66 | + _title.textColor = [UIColor blackColorZX]; | ||
| 67 | + } | ||
| 68 | + return _title; | ||
| 69 | +} | ||
| 70 | + | ||
| 71 | +- (UILabel *)detail | ||
| 72 | +{ | ||
| 73 | + if (!_detail) { | ||
| 74 | + _detail = [[UILabel alloc] initWithFrame:CGRectMake(0, self.title.bottom+7, self.contentView.width, 11)]; | ||
| 75 | + _detail.font = [UIFont systemFontOfSize:12]; | ||
| 76 | + _detail.textColor = [UIColor grayColorZX]; | ||
| 77 | + } | ||
| 78 | + return _detail; | ||
| 79 | +} | ||
| 80 | + | ||
| 81 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCMoreSortTableViewCell.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCMoreSortTableViewCell.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +#import "LVCProgramModel.h" | ||
| 11 | + | ||
| 12 | +@interface LVCMoreSortTableViewCell : UITableViewCell | ||
| 13 | + | ||
| 14 | +@property (nonatomic, strong) LVCProgramModel *model; | ||
| 15 | + | ||
| 16 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCMoreSortTableViewCell.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCMoreSortTableViewCell.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCMoreSortTableViewCell.h" | ||
| 10 | + | ||
| 11 | +@interface LVCMoreSortTableViewCell () | ||
| 12 | + | ||
| 13 | +@property(nonatomic,strong)UIImageView *imgView; | ||
| 14 | +@property(nonatomic,strong)UILabel *titleLab; | ||
| 15 | +@property(nonatomic,strong)UILabel *desLab; | ||
| 16 | + | ||
| 17 | +@end | ||
| 18 | + | ||
| 19 | +@implementation LVCMoreSortTableViewCell | ||
| 20 | + | ||
| 21 | +#pragma mark - Calculate Size Specs | ||
| 22 | + | ||
| 23 | +- (CGFloat)imageWidth { | ||
| 24 | + | ||
| 25 | + if (SCREEN_WIDTH == 320.0) { | ||
| 26 | + return 96.0; | ||
| 27 | + } else if (SCREEN_WIDTH == 375.0) { | ||
| 28 | + return 112.0; | ||
| 29 | + } else if (SCREEN_WIDTH == 414.0) { | ||
| 30 | + return 124.0; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + return SCREEN_WIDTH*0.3; | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +- (CGFloat)imageHeight { | ||
| 37 | + if (SCREEN_WIDTH == 320.0) { | ||
| 38 | + return 62.5; | ||
| 39 | + } else if (SCREEN_WIDTH == 375.0) { | ||
| 40 | + return 73.0; | ||
| 41 | + } else if (SCREEN_WIDTH == 414.0) { | ||
| 42 | + return 81.0; | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + return SCREEN_WIDTH*0.3*146/224; | ||
| 46 | +} | ||
| 47 | + | ||
| 48 | +- (CGFloat)imageMargin { | ||
| 49 | + if (SCREEN_WIDTH == 320.0) { | ||
| 50 | + return 8.0; | ||
| 51 | + } else if (SCREEN_WIDTH == 375.0) { | ||
| 52 | + return 10.0; | ||
| 53 | + } else if (SCREEN_WIDTH == 414.0) { | ||
| 54 | + return 11.0; | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + return 10.0; | ||
| 58 | +} | ||
| 59 | + | ||
| 60 | +- (CGFloat)titleMargin { | ||
| 61 | + if (SCREEN_WIDTH == 320.0) { | ||
| 62 | + return 24.0; | ||
| 63 | + } else if (SCREEN_WIDTH == 375.0) { | ||
| 64 | + return 28.0; | ||
| 65 | + } else if (SCREEN_WIDTH == 414.0) { | ||
| 66 | + return 31.0; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + return 28.0; | ||
| 70 | +} | ||
| 71 | + | ||
| 72 | +- (CGFloat)subtitleMargin | ||
| 73 | +{ | ||
| 74 | + if (SCREEN_WIDTH == 320.0) { | ||
| 75 | + return 48.0; | ||
| 76 | + } else if (SCREEN_WIDTH == 375.0) { | ||
| 77 | + return 55.0; | ||
| 78 | + } else if (SCREEN_WIDTH == 414.0) { | ||
| 79 | + return 60.0; | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + return 53.0; | ||
| 83 | +} | ||
| 84 | + | ||
| 85 | +- (CGFloat)titleFontSize | ||
| 86 | +{ | ||
| 87 | + if (SCREEN_WIDTH == 320.0) { | ||
| 88 | + return 14.0; | ||
| 89 | + } else if (SCREEN_WIDTH == 375.0) { | ||
| 90 | + return 17.0; | ||
| 91 | + } else if (SCREEN_WIDTH == 414.0) { | ||
| 92 | + return 19.0; | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + return 17.0; | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +- (CGFloat)subtitleFontSize | ||
| 99 | +{ | ||
| 100 | + if (SCREEN_WIDTH == 320.0) { | ||
| 101 | + return 12.0; | ||
| 102 | + } else if (SCREEN_WIDTH == 375.0) { | ||
| 103 | + return 14.0; | ||
| 104 | + } else if (SCREEN_WIDTH == 414.0) { | ||
| 105 | + return 15.0; | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + return 14.0; | ||
| 109 | +} | ||
| 110 | + | ||
| 111 | +- (CGFloat)cellHeight | ||
| 112 | +{ | ||
| 113 | + if (SCREEN_WIDTH == 320.0) { | ||
| 114 | + return 80.0; | ||
| 115 | + } else if (SCREEN_WIDTH == 375.0) { | ||
| 116 | + return 93.0; | ||
| 117 | + } else if (SCREEN_WIDTH == 414.0) { | ||
| 118 | + return 103.0; | ||
| 119 | + } | ||
| 120 | + return 93.0; | ||
| 121 | +} | ||
| 122 | + | ||
| 123 | +#pragma mark | ||
| 124 | +- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier | ||
| 125 | +{ | ||
| 126 | + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; | ||
| 127 | + if (self) { | ||
| 128 | + self.selectionStyle = UITableViewCellSelectionStyleNone; | ||
| 129 | + [self.contentView addSubview:self.imgView]; | ||
| 130 | + [self.contentView addSubview:self.titleLab]; | ||
| 131 | + [self.contentView addSubview:self.desLab]; | ||
| 132 | + } | ||
| 133 | + return self; | ||
| 134 | +} | ||
| 135 | + | ||
| 136 | +-(UIImageView*)imgView | ||
| 137 | +{ | ||
| 138 | + if (!_imgView) { | ||
| 139 | + | ||
| 140 | + _imgView=[[UIImageView alloc] initWithFrame:CGRectMake(10, [self imageMargin], [self imageWidth], [self imageHeight])]; | ||
| 141 | + } | ||
| 142 | + return _imgView; | ||
| 143 | +} | ||
| 144 | + | ||
| 145 | +-(UILabel*)titleLab | ||
| 146 | +{ | ||
| 147 | + if (!_titleLab) { | ||
| 148 | + _titleLab=[[UILabel alloc] initWithFrame:CGRectMake([self imageWidth]+20.0, [self titleMargin], SCREEN_WIDTH-[self imageWidth]-30, [self titleFontSize])]; | ||
| 149 | + _titleLab.textColor=[UIColor blackColorZX]; | ||
| 150 | + _titleLab.font=[UIFont systemFontOfSize:[self titleFontSize]]; | ||
| 151 | + } | ||
| 152 | + return _titleLab; | ||
| 153 | +} | ||
| 154 | + | ||
| 155 | +-(UILabel*)desLab | ||
| 156 | +{ | ||
| 157 | + if (!_desLab) { | ||
| 158 | + _desLab=[[UILabel alloc] initWithFrame:CGRectMake([self imageWidth]+20.0, [self subtitleMargin], SCREEN_WIDTH-[self imageWidth]-30, [self subtitleFontSize])]; | ||
| 159 | + _desLab.textColor=[UIColor colorWithHexString:@"#969797"]; | ||
| 160 | + _desLab.font=[UIFont systemFontOfSize:[self subtitleFontSize]]; | ||
| 161 | + _desLab.numberOfLines=0; | ||
| 162 | + } | ||
| 163 | + return _desLab; | ||
| 164 | +} | ||
| 165 | + | ||
| 166 | +- (void)setModel:(LVCProgramModel *)model | ||
| 167 | +{ | ||
| 168 | + self.titleLab.text=model.title; | ||
| 169 | + self.desLab.text=model.subTitle; | ||
| 170 | + if (model.img) { | ||
| 171 | + | ||
| 172 | + [self.imgView sd_setImageWithURL:[NSURL URLWithString:model.img] placeholderImage:[UIImage imageNamed:@"load_03"]]; | ||
| 173 | + } | ||
| 174 | +} | ||
| 175 | + | ||
| 176 | +- (void)awakeFromNib { | ||
| 177 | + [super awakeFromNib]; | ||
| 178 | + // Initialization code | ||
| 179 | +} | ||
| 180 | + | ||
| 181 | +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { | ||
| 182 | + [super setSelected:selected animated:animated]; | ||
| 183 | + | ||
| 184 | + // Configure the view for the selected state | ||
| 185 | +} | ||
| 186 | + | ||
| 187 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCOtherHeaderReusableView.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCOtherHeaderCollectionReusableView.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +#import "LVCChannelDetailsModel.h" | ||
| 11 | +#import "LVCChannelsModel.h" | ||
| 12 | + | ||
| 13 | +@interface LVCOtherHeaderReusableView : UICollectionReusableView | ||
| 14 | + | ||
| 15 | +@property (nonatomic, strong) LVCChannelsModel *model; | ||
| 16 | + | ||
| 17 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCOtherHeaderReusableView.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCOtherHeaderCollectionReusableView.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCOtherHeaderReusableView.h" | ||
| 10 | +#import "LVCMoreProgramViewController.h" | ||
| 11 | + | ||
| 12 | +@interface LVCOtherHeaderReusableView () | ||
| 13 | + | ||
| 14 | +@property (nonatomic, strong)UIButton *button; | ||
| 15 | +@property (nonatomic, strong)UIView *intervalView; | ||
| 16 | +@property (nonatomic, strong)UIImageView *arrow; | ||
| 17 | + | ||
| 18 | +@end | ||
| 19 | + | ||
| 20 | +@implementation LVCOtherHeaderReusableView | ||
| 21 | + | ||
| 22 | +- (instancetype)initWithFrame:(CGRect)frame | ||
| 23 | +{ | ||
| 24 | + self = [super initWithFrame:frame]; | ||
| 25 | + if (self) { | ||
| 26 | + | ||
| 27 | + self.backgroundColor = [UIColor whiteColor]; | ||
| 28 | + | ||
| 29 | + UIView *intervalView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.width, 6)]; | ||
| 30 | + intervalView.backgroundColor = [UIColor backgroundColorZX]; | ||
| 31 | + [self addSubview:intervalView]; | ||
| 32 | + [self addSubview:self.button]; | ||
| 33 | + [self addSubview:self.arrow]; | ||
| 34 | + | ||
| 35 | + } | ||
| 36 | + return self; | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +#pragma mark - | ||
| 40 | +#pragma mark - Action | ||
| 41 | +- (void)buttonAction | ||
| 42 | +{ | ||
| 43 | + LVCMoreProgramViewController *more = [[LVCMoreProgramViewController alloc]init]; | ||
| 44 | + more.cid = _model.cid; | ||
| 45 | + more.title = _model.title; | ||
| 46 | + [self.viewController.navigationController pushViewController:more animated:YES]; | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +#pragma mark - | ||
| 50 | +#pragma mark - setter | ||
| 51 | +- (void)setModel:(LVCChannelsModel *)model { | ||
| 52 | + | ||
| 53 | + _model = model; | ||
| 54 | + [self.button setTitle:[NSString stringWithFormat:@" %@", model.title] forState:UIControlStateNormal]; | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +#pragma mark - | ||
| 58 | +#pragma mark - gatter | ||
| 59 | +- (UIButton *)button | ||
| 60 | +{ | ||
| 61 | + if (!_button) { | ||
| 62 | + _button = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 63 | + _button.frame = CGRectMake(0, 6, self.frame.size.width, 47); | ||
| 64 | + [_button setTitleColor:[UIColor blackColorZX] forState:UIControlStateNormal]; | ||
| 65 | + _button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; | ||
| 66 | + [_button addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside]; | ||
| 67 | + _button.titleLabel.font = [UIFont boldSystemFontOfSize:18]; | ||
| 68 | + } | ||
| 69 | + return _button; | ||
| 70 | +} | ||
| 71 | + | ||
| 72 | +- (UIImageView *)arrow | ||
| 73 | +{ | ||
| 74 | + if (!_arrow) { | ||
| 75 | + _arrow = [[UIImageView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-5-15, 19, 15, 21)]; | ||
| 76 | + _arrow.image = [UIImage imageNamed:@"gengduo"]; | ||
| 77 | + } | ||
| 78 | + return _arrow; | ||
| 79 | +} | ||
| 80 | + | ||
| 81 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCPlayer.h
| @@ -20,15 +20,19 @@ | @@ -20,15 +20,19 @@ | ||
| 20 | 20 | ||
| 21 | @end | 21 | @end |
| 22 | 22 | ||
| 23 | +typedef void(^HideInputViewBlock)(BOOL hide); | ||
| 23 | 24 | ||
| 24 | @interface LVCPlayer : UIView | 25 | @interface LVCPlayer : UIView |
| 25 | 26 | ||
| 27 | +@property (nonatomic, strong) UIImageView *topBgView; //顶部蒙版 | ||
| 28 | +@property (nonatomic, strong) UIImageView *bottomBgView; //底部蒙版 | ||
| 29 | +@property (nonatomic, readwrite, assign) BOOL isFullScreen; //是否是全屏 | ||
| 30 | +@property (nonatomic, copy) HideInputViewBlock hideBlock; //全屏模式下是否隐藏输入框 | ||
| 31 | + | ||
| 26 | @property (nonatomic, assign) id<LVCPlayerDelegate> delegate; | 32 | @property (nonatomic, assign) id<LVCPlayerDelegate> delegate; |
| 27 | 33 | ||
| 28 | -@property (nonatomic, strong) UIImageView *contentView; //所有空间统一管理在这个view中 | ||
| 29 | -@property (nonatomic, strong) UIButton *backBtn; //返回 | ||
| 30 | -@property (nonatomic, readwrite, assign) BOOL isFullScreen; //是否是全屏 | 34 | +- (void)autoHideControlView; //自动隐藏上下功能条 |
| 31 | 35 | ||
| 32 | -- (void)stopPlaying; | 36 | +- (void)stopPlaying; //停止播放 |
| 33 | 37 | ||
| 34 | @end | 38 | @end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCPlayer.m
| @@ -16,8 +16,8 @@ | @@ -16,8 +16,8 @@ | ||
| 16 | 16 | ||
| 17 | @interface LVCPlayer ()<UIGestureRecognizerDelegate> | 17 | @interface LVCPlayer ()<UIGestureRecognizerDelegate> |
| 18 | 18 | ||
| 19 | -@property (nonatomic, strong) UIImageView *topBgView; //顶部蒙版 | ||
| 20 | -@property (nonatomic, strong) UIImageView *bottomBgView; //底部蒙版 | 19 | +@property (nonatomic, strong) UIButton *backBtn; //返回 |
| 20 | +@property (nonatomic, strong) UIImageView *contentView; //所有空间统一管理在这个view中 | ||
| 21 | @property (nonatomic, strong) UIButton *playOrPauseBtn; //播放/暂停 | 21 | @property (nonatomic, strong) UIButton *playOrPauseBtn; //播放/暂停 |
| 22 | @property (nonatomic, strong) UILabel *titleLab; //标题 | 22 | @property (nonatomic, strong) UILabel *titleLab; //标题 |
| 23 | @property (nonatomic, strong) UIButton *fullScreenBtn; //控制全屏按钮 | 23 | @property (nonatomic, strong) UIButton *fullScreenBtn; //控制全屏按钮 |
| @@ -26,6 +26,8 @@ | @@ -26,6 +26,8 @@ | ||
| 26 | @property (nonatomic, strong) CNLiveMoviePlayerController *player; | 26 | @property (nonatomic, strong) CNLiveMoviePlayerController *player; |
| 27 | @property (nonatomic, strong) SevenSwitch *barrageSwitch; //弹幕开关 | 27 | @property (nonatomic, strong) SevenSwitch *barrageSwitch; //弹幕开关 |
| 28 | @property (nonatomic, strong) UIButton *editBtn; //全屏编辑按钮 | 28 | @property (nonatomic, strong) UIButton *editBtn; //全屏编辑按钮 |
| 29 | + | ||
| 30 | +@property (nonatomic, strong) NSTimer *timer; //控制上下工具条定时器 | ||
| 29 | @end | 31 | @end |
| 30 | 32 | ||
| 31 | @implementation LVCPlayer | 33 | @implementation LVCPlayer |
| @@ -108,31 +110,73 @@ | @@ -108,31 +110,73 @@ | ||
| 108 | 110 | ||
| 109 | } | 111 | } |
| 110 | 112 | ||
| 113 | +- (void)barrageSwitchAction | ||
| 114 | +{ | ||
| 115 | + NSString *string = self.barrageSwitch.on ? @"已开启弹幕" : @"已关闭弹幕"; | ||
| 116 | + | ||
| 117 | + NSLog(@"%@",string); | ||
| 118 | +} | ||
| 119 | + | ||
| 120 | +- (void)editBtnAction:(UIButton *)btn | ||
| 121 | +{ | ||
| 122 | + if (self.hideBlock) { | ||
| 123 | + self.hideBlock(NO); | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + [self hideControlView]; | ||
| 127 | + | ||
| 128 | + if (self.delegate && [self.delegate respondsToSelector:@selector(lvcPlayer:clickedEditBtn:)]) { | ||
| 129 | + [self.delegate lvcPlayer:self clickedEditBtn:btn]; | ||
| 130 | + } | ||
| 131 | +} | ||
| 132 | + | ||
| 133 | + | ||
| 111 | - (void)singleTapView | 134 | - (void)singleTapView |
| 112 | { | 135 | { |
| 113 | [UIView animateWithDuration:0.25 animations:^{ | 136 | [UIView animateWithDuration:0.25 animations:^{ |
| 114 | - self.topBgView.alpha = self.topBgView.alpha == 0 ? 1 : 0; | ||
| 115 | - self.bottomBgView.alpha = self.bottomBgView.alpha == 0 ? 1 : 0; | ||
| 116 | - self.editBtn.alpha = self.editBtn.alpha == 0 ? 1 : 0; | 137 | + _topBgView.alpha = _topBgView.alpha == 0 ? 1 : 0; |
| 138 | + _bottomBgView.alpha = _bottomBgView.alpha == 0 ? 1 : 0; | ||
| 139 | + _editBtn.alpha = _editBtn.alpha == 0 ? 1 : 0; | ||
| 117 | }]; | 140 | }]; |
| 118 | 141 | ||
| 142 | + [self autoHideControlView]; | ||
| 143 | + | ||
| 119 | if (_isFullScreen) { | 144 | if (_isFullScreen) { |
| 120 | [[UIApplication sharedApplication] setStatusBarHidden:self.topBgView.alpha == 0 ? YES : NO withAnimation:UIStatusBarAnimationFade]; | 145 | [[UIApplication sharedApplication] setStatusBarHidden:self.topBgView.alpha == 0 ? YES : NO withAnimation:UIStatusBarAnimationFade]; |
| 146 | + if (self.hideBlock) { | ||
| 147 | + self.hideBlock(YES); | ||
| 148 | + } | ||
| 121 | } | 149 | } |
| 122 | - | 150 | + |
| 123 | } | 151 | } |
| 124 | 152 | ||
| 125 | -- (void)barrageSwitchAction | 153 | +- (void)autoHideControlView |
| 126 | { | 154 | { |
| 127 | - NSString *string = self.barrageSwitch.on ? @"已开启弹幕" : @"已关闭弹幕"; | ||
| 128 | - | ||
| 129 | - NSLog(@"%@",string); | 155 | + if (!_timer) { |
| 156 | + _timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(hideControlView) userInfo:nil repeats:NO]; | ||
| 157 | + } else { | ||
| 158 | + [NSObject cancelPreviousPerformRequestsWithTarget:self]; | ||
| 159 | + [_timer invalidate]; | ||
| 160 | + _timer = nil; | ||
| 161 | + } | ||
| 130 | } | 162 | } |
| 131 | 163 | ||
| 132 | -- (void)editBtnAction:(UIButton *)btn | 164 | +- (void)hideControlView |
| 133 | { | 165 | { |
| 134 | - if (self.delegate && [self.delegate respondsToSelector:@selector(lvcPlayer:clickedEditBtn:)]) { | ||
| 135 | - [self.delegate lvcPlayer:self clickedEditBtn:btn]; | 166 | + |
| 167 | + [UIView animateWithDuration:0.25 animations:^{ | ||
| 168 | + _topBgView.alpha = 0; | ||
| 169 | + _bottomBgView.alpha = 0; | ||
| 170 | + _editBtn.alpha = 0; | ||
| 171 | + }]; | ||
| 172 | + | ||
| 173 | + if (_isFullScreen) { | ||
| 174 | + [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; | ||
| 175 | + } | ||
| 176 | + | ||
| 177 | + if (_timer) { | ||
| 178 | + [_timer invalidate]; | ||
| 179 | + _timer = nil; | ||
| 136 | } | 180 | } |
| 137 | } | 181 | } |
| 138 | 182 | ||
| @@ -305,6 +349,12 @@ | @@ -305,6 +349,12 @@ | ||
| 305 | [_player stop]; | 349 | [_player stop]; |
| 306 | } | 350 | } |
| 307 | _player = nil; | 351 | _player = nil; |
| 352 | + | ||
| 353 | + if (_timer) { | ||
| 354 | + [_timer invalidate]; | ||
| 355 | + _timer = nil; | ||
| 356 | + } | ||
| 357 | + | ||
| 308 | [self removeMovieNotificationObservers]; | 358 | [self removeMovieNotificationObservers]; |
| 309 | } | 359 | } |
| 310 | 360 | ||
| @@ -349,7 +399,7 @@ | @@ -349,7 +399,7 @@ | ||
| 349 | }]; | 399 | }]; |
| 350 | 400 | ||
| 351 | [self.backBtn mas_makeConstraints:^(MASConstraintMaker *make) { | 401 | [self.backBtn mas_makeConstraints:^(MASConstraintMaker *make) { |
| 352 | - make.left.equalTo(self.topBgView).with.offset(5); | 402 | + make.left.equalTo(self.topBgView).with.offset(10); |
| 353 | make.width.height.mas_equalTo(30); | 403 | make.width.height.mas_equalTo(30); |
| 354 | make.top.equalTo(self.topBgView).with.offset(10); | 404 | make.top.equalTo(self.topBgView).with.offset(10); |
| 355 | }]; | 405 | }]; |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCTelevisionView.h
0 → 100644
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCTelevisionView.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCTelevisionView.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by iOS on 17/3/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCTelevisionView.h" | ||
| 10 | +#import "LVCLiveListCollectionViewCell.h" | ||
| 11 | +#import "LVCFirstHeaderReusableView.h" | ||
| 12 | +#import "LVCOtherHeaderReusableView.h" | ||
| 13 | +#import "LVCChannelDetailsModel.h" | ||
| 14 | +#import "LVCChannelsModel.h" | ||
| 15 | +#import "LVCBannerModel.h" | ||
| 16 | + | ||
| 17 | +static NSString *cellId = @"LVCLiveListCollectionViewCell"; | ||
| 18 | +static NSString *firstHeaderId = @"LVCFirstHeaderReusableView"; | ||
| 19 | +static NSString *otherHeaderId = @"LVCOtherHeaderReusableView"; | ||
| 20 | + | ||
| 21 | +@interface LVCTelevisionView ()<UICollectionViewDelegate,UICollectionViewDataSource> | ||
| 22 | +{ | ||
| 23 | + long long _timestamp; | ||
| 24 | + NSTimer *_autoRefreshTimer; | ||
| 25 | + CGFloat _refreshTime; | ||
| 26 | + NSNotification *_liveNotification; | ||
| 27 | + BOOL _adImageHidden; //开机广告或引导页是否显示完毕 | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +@property (nonatomic, strong) UICollectionView *collectionView; | ||
| 31 | +@property (nonatomic, strong) NSArray *bannerModelArray; //banner数据源 | ||
| 32 | +@property (nonatomic, strong) NSArray *marqueeModelArray; // | ||
| 33 | +@property (nonatomic, strong) NSArray *channelsModelArray; // | ||
| 34 | +@property (nonatomic, strong) UIButton *reloadBtn; // 刷新按钮 | ||
| 35 | +@property (nonatomic, strong) UILabel *reloadLab; // 刷新提示文字 | ||
| 36 | +@property (nonatomic, strong) UIImageView *reloadImg; //刷新图片 | ||
| 37 | + | ||
| 38 | +@end | ||
| 39 | + | ||
| 40 | +@implementation LVCTelevisionView | ||
| 41 | + | ||
| 42 | +- (instancetype)initWithFrame:(CGRect)frame | ||
| 43 | +{ | ||
| 44 | + self = [super initWithFrame:frame]; | ||
| 45 | + if (self) { | ||
| 46 | + | ||
| 47 | + self.backgroundColor = [UIColor lightGrayColor]; | ||
| 48 | + | ||
| 49 | + [self loadData]; | ||
| 50 | + | ||
| 51 | +// _timestamp = [[self timestamp] longLongValue]; | ||
| 52 | +// if (_refreshTime != 0) { | ||
| 53 | +// _autoRefreshTimer = [NSTimer scheduledTimerWithTimeInterval:_refreshTime target:self selector:@selector(autoRefresh) userInfo:nil repeats:YES]; | ||
| 54 | +// } | ||
| 55 | + | ||
| 56 | + [self addSubview:self.collectionView]; | ||
| 57 | + [self.collectionView.header beginRefreshing]; | ||
| 58 | + | ||
| 59 | + | ||
| 60 | + } | ||
| 61 | + return self; | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +#pragma mark - | ||
| 65 | +#pragma mark - action | ||
| 66 | +- (void)reloadBtnAction | ||
| 67 | +{ | ||
| 68 | + // [self.reloadBtn removeFromSuperview]; | ||
| 69 | + // [self.collectionView.header beginRefreshing]; | ||
| 70 | + [self refresh]; | ||
| 71 | +} | ||
| 72 | + | ||
| 73 | +- (void)refresh | ||
| 74 | +{ | ||
| 75 | + [self.reloadBtn removeFromSuperview]; | ||
| 76 | + [self loadData]; | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +- (void)isNeedToRefresh | ||
| 80 | +{ | ||
| 81 | + if (_refreshTime != 0) { | ||
| 82 | + [_autoRefreshTimer invalidate]; | ||
| 83 | + _autoRefreshTimer = nil; | ||
| 84 | + _autoRefreshTimer = [NSTimer scheduledTimerWithTimeInterval:_refreshTime target:self selector:@selector(autoRefresh) userInfo:nil repeats:YES]; | ||
| 85 | + } | ||
| 86 | + long long timestamp = [[self timestamp] longLongValue]; | ||
| 87 | + if (timestamp-_timestamp > 180000) { | ||
| 88 | + [self.collectionView.header beginRefreshing]; | ||
| 89 | + } | ||
| 90 | +} | ||
| 91 | + | ||
| 92 | +- (void)autoRefresh | ||
| 93 | +{ | ||
| 94 | + [self.collectionView.header beginRefreshing]; | ||
| 95 | + [self loadData]; | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +- (void)stopAutoRefresh | ||
| 99 | +{ | ||
| 100 | + [_autoRefreshTimer invalidate]; | ||
| 101 | + _autoRefreshTimer = nil; | ||
| 102 | +} | ||
| 103 | + | ||
| 104 | +#pragma mark - | ||
| 105 | +#pragma mark - UICollectionViewDataSource | ||
| 106 | +- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { | ||
| 107 | + if (self.channelsModelArray.count > 0) { | ||
| 108 | + return self.channelsModelArray.count + 1; | ||
| 109 | + } | ||
| 110 | + return self.channelsModelArray.count; | ||
| 111 | +} | ||
| 112 | + | ||
| 113 | +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { | ||
| 114 | + | ||
| 115 | + if (section == 0) { | ||
| 116 | + return 0; | ||
| 117 | + } | ||
| 118 | + LVCChannelsModel *model = self.channelsModelArray[section - 1]; | ||
| 119 | + | ||
| 120 | + NSArray *array = model.programs; | ||
| 121 | + | ||
| 122 | + return array.count; | ||
| 123 | +} | ||
| 124 | + | ||
| 125 | +- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { | ||
| 126 | + | ||
| 127 | + LVCLiveListCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; | ||
| 128 | + | ||
| 129 | + cell.backgroundColor = [UIColor lightGrayColor]; | ||
| 130 | + | ||
| 131 | + LVCChannelsModel *model = _channelsModelArray[indexPath.section - 1]; | ||
| 132 | + | ||
| 133 | + LVCChannelDetailsModel *details = model.programs[indexPath.item]; | ||
| 134 | + | ||
| 135 | + cell.details = details; | ||
| 136 | + | ||
| 137 | + return cell; | ||
| 138 | +} | ||
| 139 | + | ||
| 140 | +- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { | ||
| 141 | + | ||
| 142 | + if (kind == UICollectionElementKindSectionHeader) { | ||
| 143 | + | ||
| 144 | + if (indexPath.section == 0) { | ||
| 145 | + | ||
| 146 | + LVCFirstHeaderReusableView *firstHeaderView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:firstHeaderId forIndexPath:indexPath]; | ||
| 147 | + | ||
| 148 | + firstHeaderView.imageUrls = [self bannerImage]; | ||
| 149 | + firstHeaderView.modelArray = self.bannerModelArray; | ||
| 150 | + | ||
| 151 | + return firstHeaderView; | ||
| 152 | + } else { | ||
| 153 | + | ||
| 154 | + LVCOtherHeaderReusableView *otherHeaderView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:otherHeaderId forIndexPath:indexPath]; | ||
| 155 | + | ||
| 156 | + LVCChannelsModel *model = _channelsModelArray[indexPath.section - 1]; | ||
| 157 | + | ||
| 158 | + otherHeaderView.model = model; | ||
| 159 | + | ||
| 160 | + return otherHeaderView; | ||
| 161 | + } | ||
| 162 | + } | ||
| 163 | + return nil; | ||
| 164 | +} | ||
| 165 | + | ||
| 166 | +- (NSArray <NSURL *>*)bannerImage { | ||
| 167 | + | ||
| 168 | + NSMutableArray *arrayM = [NSMutableArray array]; | ||
| 169 | + for (LVCBannerModel *model in _bannerModelArray) { | ||
| 170 | + NSString *imgStr = model.img; | ||
| 171 | + NSURL *url = [NSURL URLWithString:imgStr]; | ||
| 172 | + [arrayM addObject:url]; | ||
| 173 | + } | ||
| 174 | + return arrayM.copy; | ||
| 175 | +} | ||
| 176 | + | ||
| 177 | +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { | ||
| 178 | + | ||
| 179 | + if (section == 0) { | ||
| 180 | + return CGSizeMake(SCREEN_WIDTH, SCREEN_WIDTH * 0.5); | ||
| 181 | + }else { | ||
| 182 | + return CGSizeMake(SCREEN_WIDTH, 47); | ||
| 183 | + } | ||
| 184 | +} | ||
| 185 | + | ||
| 186 | +#pragma mark - | ||
| 187 | +#pragma mark - UICollectionViewDelegate | ||
| 188 | +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { | ||
| 189 | + NSLog(@"跳转-----"); | ||
| 190 | + | ||
| 191 | +} | ||
| 192 | + | ||
| 193 | +#pragma mark - | ||
| 194 | +#pragma mark - 加载数据 | ||
| 195 | +- (void)loadData { | ||
| 196 | + | ||
| 197 | + NSDictionary *parameter = @{@"cid": @"zb/", | ||
| 198 | + @"plat":@"i", | ||
| 199 | + @"appid":@"spzg", | ||
| 200 | + @"version":@"1"}; | ||
| 201 | + | ||
| 202 | + [[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) { | ||
| 203 | + _timestamp = [[self timestamp] longLongValue]; | ||
| 204 | +// if (_refreshTime != 0) { | ||
| 205 | +// [_autoRefreshTimer invalidate]; | ||
| 206 | +// _autoRefreshTimer = nil; | ||
| 207 | +// _autoRefreshTimer = [NSTimer scheduledTimerWithTimeInterval:_refreshTime target:self selector:@selector(autoRefresh) userInfo:nil repeats:YES]; | ||
| 208 | +// } | ||
| 209 | + | ||
| 210 | + [self.collectionView.header endRefreshing]; | ||
| 211 | + | ||
| 212 | + if (responseObject[@"channels"] && [responseObject[@"channels"] isKindOfClass:[NSArray class]]) { | ||
| 213 | + | ||
| 214 | + NSMutableArray *arrayM = [[NSMutableArray alloc]init]; | ||
| 215 | + for (NSDictionary *dict in responseObject[@"channels"]) { | ||
| 216 | + LVCChannelsModel *model = [LVCChannelsModel new]; | ||
| 217 | + [model setValuesForKeysWithDictionary:dict]; | ||
| 218 | + [arrayM addObject:model]; | ||
| 219 | + } | ||
| 220 | + self.channelsModelArray = arrayM; | ||
| 221 | + } | ||
| 222 | + if (responseObject[@"banner"] && [responseObject[@"banner"] isKindOfClass:[NSArray class]]) { | ||
| 223 | + | ||
| 224 | + NSMutableArray *arrayM = [NSMutableArray array]; | ||
| 225 | + for (NSDictionary *dict in responseObject[@"banner"]) { | ||
| 226 | + LVCBannerModel *rollModel = [LVCBannerModel new]; | ||
| 227 | + [rollModel setValuesForKeysWithDictionary:dict]; | ||
| 228 | + [arrayM addObject:rollModel]; | ||
| 229 | + } | ||
| 230 | + self.bannerModelArray = arrayM; | ||
| 231 | + } | ||
| 232 | + self.collectionView.backgroundColor = [UIColor whiteColor]; | ||
| 233 | + [self.collectionView reloadData]; | ||
| 234 | + | ||
| 235 | + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { | ||
| 236 | + | ||
| 237 | + NSLog(@"获取电视台数据失败"); | ||
| 238 | + | ||
| 239 | + }]; | ||
| 240 | + | ||
| 241 | + | ||
| 242 | +} | ||
| 243 | + | ||
| 244 | +- (NSString *)timestamp { | ||
| 245 | + | ||
| 246 | + NSString *stamp = @""; | ||
| 247 | + | ||
| 248 | + stamp = [NSString stringWithFormat:@"%.3f", [[NSDate date] timeIntervalSince1970]]; | ||
| 249 | + stamp = [stamp stringByReplacingOccurrencesOfString:@"." withString:@""]; | ||
| 250 | + | ||
| 251 | + return stamp; | ||
| 252 | +} | ||
| 253 | + | ||
| 254 | +#pragma mark - | ||
| 255 | +#pragma mark - getter | ||
| 256 | +- (UICollectionView *)collectionView { | ||
| 257 | + | ||
| 258 | + if (!_collectionView) { | ||
| 259 | + | ||
| 260 | + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init]; | ||
| 261 | + layout.itemSize = CGSizeMake((SCREEN_WIDTH-30)/2, (SCREEN_WIDTH-30)/2*9/16+65); | ||
| 262 | + layout.minimumLineSpacing = 0; | ||
| 263 | + layout.minimumInteritemSpacing = 0; | ||
| 264 | + layout.sectionInset = UIEdgeInsetsMake(6, 10, 0, 10); | ||
| 265 | + _collectionView.showsHorizontalScrollIndicator = NO; | ||
| 266 | + | ||
| 267 | + _collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) collectionViewLayout:layout]; | ||
| 268 | + _collectionView.backgroundColor = [UIColor whiteColor]; | ||
| 269 | + | ||
| 270 | + [_collectionView registerClass:[LVCLiveListCollectionViewCell class] forCellWithReuseIdentifier:cellId]; | ||
| 271 | + [_collectionView registerClass:[LVCFirstHeaderReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:firstHeaderId]; | ||
| 272 | + [_collectionView registerClass:[LVCOtherHeaderReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:otherHeaderId]; | ||
| 273 | + | ||
| 274 | + _collectionView.dataSource = self; | ||
| 275 | + _collectionView.delegate = self; | ||
| 276 | + | ||
| 277 | +// MJRefreshGifHeader *header = [CNRefreshHeader headerWithRefreshingTarget:self refreshingAction:@selector(refresh)]; | ||
| 278 | +// _collectionView.header = header; | ||
| 279 | + } | ||
| 280 | + return _collectionView; | ||
| 281 | +} | ||
| 282 | + | ||
| 283 | +//- (UIButton *)reloadBtn | ||
| 284 | +//{ | ||
| 285 | +// if (!_reloadBtn) { | ||
| 286 | +// _reloadBtn = [Tools getReloadBtn]; | ||
| 287 | +// // _reloadBtn.backgroundColor = [UIColor brownColor]; | ||
| 288 | +// _reloadBtn.x = (self.width-220)/2; | ||
| 289 | +// _reloadBtn.y = (self.height-[Tools adapterReloadBtnHeight])/2-50; | ||
| 290 | +// [_reloadBtn addTarget:self action:@selector(reloadBtnAction) forControlEvents:UIControlEventTouchUpInside]; | ||
| 291 | +// [_reloadBtn addSubview:self.reloadImg]; | ||
| 292 | +// [_reloadBtn addSubview:self.reloadLab]; | ||
| 293 | +// } | ||
| 294 | +// return _reloadBtn; | ||
| 295 | +//} | ||
| 296 | + | ||
| 297 | +//- (UILabel *)reloadLab | ||
| 298 | +//{ | ||
| 299 | +// if (!_reloadLab) { | ||
| 300 | +// _reloadLab = [Tools getReloadLab]; | ||
| 301 | +// } | ||
| 302 | +// return _reloadLab; | ||
| 303 | +//} | ||
| 304 | +//- (UIImageView *)reloadImg | ||
| 305 | +//{ | ||
| 306 | +// if (!_reloadImg) { | ||
| 307 | +// _reloadImg = [[UIImageView alloc] init]; | ||
| 308 | +// // _reloadImg.backgroundColor = [UIColor redColor]; | ||
| 309 | +// _reloadImg.frame = CGRectMake(_reloadBtn.width/2-[Tools adapterImgWidth]/2+10, 0, [Tools adapterImgWidth], [Tools adapterImgWidth]); | ||
| 310 | +// } | ||
| 311 | +// return _reloadImg; | ||
| 312 | +//} | ||
| 313 | + | ||
| 314 | + | ||
| 315 | + | ||
| 316 | +/* | ||
| 317 | +// Only override drawRect: if you perform custom drawing. | ||
| 318 | +// An empty implementation adversely affects performance during animation. | ||
| 319 | +- (void)drawRect:(CGRect)rect { | ||
| 320 | + // Drawing code | ||
| 321 | +} | ||
| 322 | +*/ | ||
| 323 | + | ||
| 324 | +@end |
LiveVideoCloud/LiveVideoCloud/PrefixHeader.pch
| @@ -24,6 +24,7 @@ | @@ -24,6 +24,7 @@ | ||
| 24 | #import "SVProgressHUD.h" | 24 | #import "SVProgressHUD.h" |
| 25 | #import "AFNetworking.h" | 25 | #import "AFNetworking.h" |
| 26 | #import "Masonry.h" | 26 | #import "Masonry.h" |
| 27 | + #import "UIView+ViewController.h" | ||
| 27 | #import <CNLivePlayerSDK/CNLiveWebcastManager.h> | 28 | #import <CNLivePlayerSDK/CNLiveWebcastManager.h> |
| 28 | #import <CNLiveMsgTools/CNLiveMsgManager.h> | 29 | #import <CNLiveMsgTools/CNLiveMsgManager.h> |
| 29 | #import <CNLiveChatManager/CNLiveChatManager.h> | 30 | #import <CNLiveChatManager/CNLiveChatManager.h> |
LiveVideoCloud/LiveVideoCloud/UtilKits/Category/UIView+ViewController.h
0 → 100755
LiveVideoCloud/LiveVideoCloud/UtilKits/Category/UIView+ViewController.m
0 → 100755
| 1 | +// | ||
| 2 | +// UIView+ViewController.m | ||
| 3 | +// CNLive | ||
| 4 | +// | ||
| 5 | +// Created by 雷浩杰 on 15/9/1. | ||
| 6 | +// Copyright (c) 2015年 雷浩杰. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "UIView+ViewController.h" | ||
| 10 | + | ||
| 11 | +@implementation UIView (ViewController) | ||
| 12 | + | ||
| 13 | +- (UIViewController *)viewController { | ||
| 14 | + UIResponder *next = self.nextResponder; | ||
| 15 | + | ||
| 16 | + do { | ||
| 17 | + //判断响应者是否为视图控制器 | ||
| 18 | + if ([next isKindOfClass:[UIViewController class]]) { | ||
| 19 | + return (UIViewController *)next; | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + next = next.nextResponder; | ||
| 23 | + } while (next != nil); | ||
| 24 | + | ||
| 25 | + return nil; | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +@end |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/player/Gift box.imageset/Contents.json
| @@ -2,7 +2,6 @@ | @@ -2,7 +2,6 @@ | ||
| 2 | "images" : [ | 2 | "images" : [ |
| 3 | { | 3 | { |
| 4 | "idiom" : "universal", | 4 | "idiom" : "universal", |
| 5 | - "filename" : "Gift box.png", | ||
| 6 | "scale" : "1x" | 5 | "scale" : "1x" |
| 7 | }, | 6 | }, |
| 8 | { | 7 | { |
| @@ -11,6 +10,7 @@ | @@ -11,6 +10,7 @@ | ||
| 11 | }, | 10 | }, |
| 12 | { | 11 | { |
| 13 | "idiom" : "universal", | 12 | "idiom" : "universal", |
| 13 | + "filename" : "Gift box.png", | ||
| 14 | "scale" : "3x" | 14 | "scale" : "3x" |
| 15 | } | 15 | } |
| 16 | ], | 16 | ], |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/player/gengduo.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "scale" : "1x" | ||
| 6 | + }, | ||
| 7 | + { | ||
| 8 | + "idiom" : "universal", | ||
| 9 | + "scale" : "2x" | ||
| 10 | + }, | ||
| 11 | + { | ||
| 12 | + "idiom" : "universal", | ||
| 13 | + "filename" : "gengduo.png", | ||
| 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/gengduo.imageset/gengduo.png
0 → 100644
1.32 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/player/load_03-1.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "load_03.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/load_03-1.imageset/load_03.png
0 → 100644
3.63 KB