Commit f015ec56bbbd0eaa81a70ab7483c93bcf5d9d40a
Merge branch 'master' of bj.gitlab.cnlive.com:ios-team/LiveVideoCloud
Conflicts: LiveVideoCloud/LiveVideoCloud.xcodeproj/project.pbxproj LiveVideoCloud/LiveVideoCloud/Assets.xcassets/bottom_shadow.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/bottom_shadow.imageset/bottom_shadow.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/dot.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/dot.imageset/dot@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/fullscreen.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/fullscreen.imageset/fullscreen@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/nonfullscreen.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/nonfullscreen.imageset/nonfullscreen@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/pause.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/pause.imageset/pause@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/play.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/play.imageset/play@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/play_back.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/play_back.imageset/play_back.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/bottom_shadow.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/bottom_shadow.imageset/bottom_shadow.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/dot.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/dot.imageset/dot@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/fullscreen.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/fullscreen.imageset/fullscreen@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/nonfullscreen.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/nonfullscreen.imageset/nonfullscreen@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/pause.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/pause.imageset/pause@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/play.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/play.imageset/play@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/play_back.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/play_back.imageset/play_back.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/top_shadow.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/top_shadow.imageset/top_shadow.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/返回.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/返回.imageset/返回@3x.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/top_shadow.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/top_shadow.imageset/top_shadow.png LiveVideoCloud/LiveVideoCloud/Assets.xcassets/返回.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/Assets.xcassets/返回.imageset/返回@3x.png LiveVideoCloud/LiveVideoCloud/animation.xcassets/bottom_shadow.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/animation.xcassets/bottom_shadow.imageset/bottom_shadow.png LiveVideoCloud/LiveVideoCloud/animation.xcassets/dot.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/animation.xcassets/dot.imageset/dot@3x.png LiveVideoCloud/LiveVideoCloud/animation.xcassets/fullscreen.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/animation.xcassets/fullscreen.imageset/fullscreen@3x.png LiveVideoCloud/LiveVideoCloud/animation.xcassets/nonfullscreen.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/animation.xcassets/nonfullscreen.imageset/nonfullscreen@3x.png LiveVideoCloud/LiveVideoCloud/animation.xcassets/pause.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/animation.xcassets/pause.imageset/pause@3x.png LiveVideoCloud/LiveVideoCloud/animation.xcassets/play.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/animation.xcassets/play.imageset/play@3x.png LiveVideoCloud/LiveVideoCloud/animation.xcassets/play_back.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/animation.xcassets/play_back.imageset/play_back.png LiveVideoCloud/LiveVideoCloud/animation.xcassets/top_shadow.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/animation.xcassets/top_shadow.imageset/top_shadow.png LiveVideoCloud/LiveVideoCloud/animation.xcassets/返回.imageset/Contents.json LiveVideoCloud/LiveVideoCloud/animation.xcassets/返回.imageset/返回@3x.png
Showing
92 changed files
with
1618 additions
and
20 deletions
LiveVideoCloud/LiveVideoCloud.xcodeproj/project.pbxproj
| @@ -29,6 +29,8 @@ | @@ -29,6 +29,8 @@ | ||
| 29 | 81FB5B031E7A251300F98E1D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81FB5B021E7A251300F98E1D /* Assets.xcassets */; }; | 29 | 81FB5B031E7A251300F98E1D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81FB5B021E7A251300F98E1D /* Assets.xcassets */; }; |
| 30 | 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */; }; | 30 | 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */; }; |
| 31 | D2029B861E6EAAA50027CD92 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B851E6EAAA50027CD92 /* main.m */; }; | 31 | D2029B861E6EAAA50027CD92 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B851E6EAAA50027CD92 /* main.m */; }; |
| 32 | + D2029B8F1E6EAAA50027CD92 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2029B8D1E6EAAA50027CD92 /* Main.storyboard */; }; | ||
| 33 | + D2029B911E6EAAA50027CD92 /* animation.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2029B901E6EAAA50027CD92 /* animation.xcassets */; }; | ||
| 32 | D2029B941E6EAAA50027CD92 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2029B921E6EAAA50027CD92 /* LaunchScreen.storyboard */; }; | 34 | D2029B941E6EAAA50027CD92 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2029B921E6EAAA50027CD92 /* LaunchScreen.storyboard */; }; |
| 33 | D2029B9F1E6EAAA50027CD92 /* LiveVideoCloudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B9E1E6EAAA50027CD92 /* LiveVideoCloudTests.m */; }; | 35 | D2029B9F1E6EAAA50027CD92 /* LiveVideoCloudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B9E1E6EAAA50027CD92 /* LiveVideoCloudTests.m */; }; |
| 34 | D2029BAA1E6EAAA50027CD92 /* LiveVideoCloudUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029BA91E6EAAA50027CD92 /* LiveVideoCloudUITests.m */; }; | 36 | D2029BAA1E6EAAA50027CD92 /* LiveVideoCloudUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029BA91E6EAAA50027CD92 /* LiveVideoCloudUITests.m */; }; |
| @@ -125,6 +127,11 @@ | @@ -125,6 +127,11 @@ | ||
| 125 | D2029D091E6EAE2E0027CD92 /* Foundation+Log.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029CF21E6EAE2E0027CD92 /* Foundation+Log.m */; }; | 127 | D2029D091E6EAE2E0027CD92 /* Foundation+Log.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029CF21E6EAE2E0027CD92 /* Foundation+Log.m */; }; |
| 126 | D2029D0A1E6EAE2E0027CD92 /* ZXServerUrl.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029CFE1E6EAE2E0027CD92 /* ZXServerUrl.m */; }; | 128 | D2029D0A1E6EAE2E0027CD92 /* ZXServerUrl.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029CFE1E6EAE2E0027CD92 /* ZXServerUrl.m */; }; |
| 127 | D2029D161E6EB00D0027CD92 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029D151E6EB00D0027CD92 /* AppDelegate.m */; }; | 129 | D2029D161E6EB00D0027CD92 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029D151E6EB00D0027CD92 /* AppDelegate.m */; }; |
| 130 | + D22830F11E778C0F00627701 /* LiveBaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22830F01E778C0F00627701 /* LiveBaseView.m */; }; | ||
| 131 | + D22830FC1E77C2D900627701 /* BottomToolView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22830FB1E77C2D900627701 /* BottomToolView.m */; }; | ||
| 132 | + D22830FF1E77C69E00627701 /* GiftListView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22830FE1E77C69E00627701 /* GiftListView.m */; }; | ||
| 133 | + D22831021E77D83C00627701 /* GiftModelView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22831011E77D83C00627701 /* GiftModelView.m */; }; | ||
| 134 | + D22831091E77D8D500627701 /* GiftModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D22831081E77D8D500627701 /* GiftModel.m */; }; | ||
| 128 | D2575C461E76857100E3A8FC /* LVCAnimationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C451E76857100E3A8FC /* LVCAnimationManager.m */; }; | 135 | D2575C461E76857100E3A8FC /* LVCAnimationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C451E76857100E3A8FC /* LVCAnimationManager.m */; }; |
| 129 | D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C481E7685DE00E3A8FC /* UIView+Bubbling.m */; }; | 136 | D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C481E7685DE00E3A8FC /* UIView+Bubbling.m */; }; |
| 130 | D2575C671E76A25400E3A8FC /* LVCInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C661E76A25400E3A8FC /* LVCInteractionController.m */; }; | 137 | D2575C671E76A25400E3A8FC /* LVCInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C661E76A25400E3A8FC /* LVCInteractionController.m */; }; |
| @@ -217,6 +224,8 @@ | @@ -217,6 +224,8 @@ | ||
| 217 | 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SevenSwitch.m; sourceTree = "<group>"; }; | 224 | 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SevenSwitch.m; sourceTree = "<group>"; }; |
| 218 | D2029B811E6EAAA50027CD92 /* LiveVideoCloud.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LiveVideoCloud.app; sourceTree = BUILT_PRODUCTS_DIR; }; | 225 | D2029B811E6EAAA50027CD92 /* LiveVideoCloud.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LiveVideoCloud.app; sourceTree = BUILT_PRODUCTS_DIR; }; |
| 219 | D2029B851E6EAAA50027CD92 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; | 226 | D2029B851E6EAAA50027CD92 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; |
| 227 | + D2029B8E1E6EAAA50027CD92 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | ||
| 228 | + D2029B901E6EAAA50027CD92 /* animation.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = animation.xcassets; sourceTree = "<group>"; }; | ||
| 220 | D2029B931E6EAAA50027CD92 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; | 229 | D2029B931E6EAAA50027CD92 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; |
| 221 | D2029B951E6EAAA50027CD92 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | 230 | D2029B951E6EAAA50027CD92 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; |
| 222 | D2029B9A1E6EAAA50027CD92 /* LiveVideoCloudTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LiveVideoCloudTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | 231 | D2029B9A1E6EAAA50027CD92 /* LiveVideoCloudTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LiveVideoCloudTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; |
| @@ -425,6 +434,16 @@ | @@ -425,6 +434,16 @@ | ||
| 425 | D2029CFF1E6EAE2E0027CD92 /* UtilKits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UtilKits.h; sourceTree = "<group>"; }; | 434 | D2029CFF1E6EAE2E0027CD92 /* UtilKits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UtilKits.h; sourceTree = "<group>"; }; |
| 426 | D2029D121E6EAF8D0027CD92 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; }; | 435 | D2029D121E6EAF8D0027CD92 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; }; |
| 427 | D2029D151E6EB00D0027CD92 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; }; | 436 | D2029D151E6EB00D0027CD92 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; }; |
| 437 | + D22830EF1E778C0F00627701 /* LiveBaseView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiveBaseView.h; sourceTree = "<group>"; }; | ||
| 438 | + D22830F01E778C0F00627701 /* LiveBaseView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LiveBaseView.m; sourceTree = "<group>"; }; | ||
| 439 | + D22830FA1E77C2D900627701 /* BottomToolView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BottomToolView.h; sourceTree = "<group>"; }; | ||
| 440 | + D22830FB1E77C2D900627701 /* BottomToolView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BottomToolView.m; sourceTree = "<group>"; }; | ||
| 441 | + D22830FD1E77C69E00627701 /* GiftListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftListView.h; sourceTree = "<group>"; }; | ||
| 442 | + D22830FE1E77C69E00627701 /* GiftListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftListView.m; sourceTree = "<group>"; }; | ||
| 443 | + D22831001E77D83C00627701 /* GiftModelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftModelView.h; sourceTree = "<group>"; }; | ||
| 444 | + D22831011E77D83C00627701 /* GiftModelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftModelView.m; sourceTree = "<group>"; }; | ||
| 445 | + D22831071E77D8D500627701 /* GiftModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftModel.h; sourceTree = "<group>"; }; | ||
| 446 | + D22831081E77D8D500627701 /* GiftModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftModel.m; sourceTree = "<group>"; }; | ||
| 428 | D2575C441E76857100E3A8FC /* LVCAnimationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCAnimationManager.h; sourceTree = "<group>"; }; | 447 | D2575C441E76857100E3A8FC /* LVCAnimationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCAnimationManager.h; sourceTree = "<group>"; }; |
| 429 | D2575C451E76857100E3A8FC /* LVCAnimationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCAnimationManager.m; sourceTree = "<group>"; }; | 448 | D2575C451E76857100E3A8FC /* LVCAnimationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCAnimationManager.m; sourceTree = "<group>"; }; |
| 430 | D2575C481E7685DE00E3A8FC /* UIView+Bubbling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+Bubbling.m"; sourceTree = "<group>"; }; | 449 | D2575C481E7685DE00E3A8FC /* UIView+Bubbling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+Bubbling.m"; sourceTree = "<group>"; }; |
| @@ -574,6 +593,7 @@ | @@ -574,6 +593,7 @@ | ||
| 574 | D2029BD01E6EADE10027CD92 /* Classes */, | 593 | D2029BD01E6EADE10027CD92 /* Classes */, |
| 575 | D2029CD11E6EADE70027CD92 /* HttpService */, | 594 | D2029CD11E6EADE70027CD92 /* HttpService */, |
| 576 | D2029CD71E6EAE140027CD92 /* Resource */, | 595 | D2029CD71E6EAE140027CD92 /* Resource */, |
| 596 | + D2029B901E6EAAA50027CD92 /* animation.xcassets */, | ||
| 577 | D2029CD61E6EADFB0027CD92 /* PrefixHeader.pch */, | 597 | D2029CD61E6EADFB0027CD92 /* PrefixHeader.pch */, |
| 578 | D2029B841E6EAAA50027CD92 /* Supporting Files */, | 598 | D2029B841E6EAAA50027CD92 /* Supporting Files */, |
| 579 | ); | 599 | ); |
| @@ -1159,9 +1179,65 @@ | @@ -1159,9 +1179,65 @@ | ||
| 1159 | path = AppDelegate; | 1179 | path = AppDelegate; |
| 1160 | sourceTree = "<group>"; | 1180 | sourceTree = "<group>"; |
| 1161 | }; | 1181 | }; |
| 1182 | + D22830F51E77C24900627701 /* GiftViews */ = { | ||
| 1183 | + isa = PBXGroup; | ||
| 1184 | + children = ( | ||
| 1185 | + D22830FD1E77C69E00627701 /* GiftListView.h */, | ||
| 1186 | + D22830FE1E77C69E00627701 /* GiftListView.m */, | ||
| 1187 | + D22831001E77D83C00627701 /* GiftModelView.h */, | ||
| 1188 | + D22831011E77D83C00627701 /* GiftModelView.m */, | ||
| 1189 | + ); | ||
| 1190 | + path = GiftViews; | ||
| 1191 | + sourceTree = "<group>"; | ||
| 1192 | + }; | ||
| 1193 | + D22830F61E77C26C00627701 /* Chat */ = { | ||
| 1194 | + isa = PBXGroup; | ||
| 1195 | + children = ( | ||
| 1196 | + D22830F71E77C27A00627701 /* ChatViews */, | ||
| 1197 | + ); | ||
| 1198 | + path = Chat; | ||
| 1199 | + sourceTree = "<group>"; | ||
| 1200 | + }; | ||
| 1201 | + D22830F71E77C27A00627701 /* ChatViews */ = { | ||
| 1202 | + isa = PBXGroup; | ||
| 1203 | + children = ( | ||
| 1204 | + ); | ||
| 1205 | + path = ChatViews; | ||
| 1206 | + sourceTree = "<group>"; | ||
| 1207 | + }; | ||
| 1208 | + D22830F81E77C2A700627701 /* TopToolView */ = { | ||
| 1209 | + isa = PBXGroup; | ||
| 1210 | + children = ( | ||
| 1211 | + ); | ||
| 1212 | + path = TopToolView; | ||
| 1213 | + sourceTree = "<group>"; | ||
| 1214 | + }; | ||
| 1215 | + D22830F91E77C2D900627701 /* BottomToolView */ = { | ||
| 1216 | + isa = PBXGroup; | ||
| 1217 | + children = ( | ||
| 1218 | + D22830FA1E77C2D900627701 /* BottomToolView.h */, | ||
| 1219 | + D22830FB1E77C2D900627701 /* BottomToolView.m */, | ||
| 1220 | + ); | ||
| 1221 | + path = BottomToolView; | ||
| 1222 | + sourceTree = "<group>"; | ||
| 1223 | + }; | ||
| 1224 | + D22831061E77D8D500627701 /* GiftModel */ = { | ||
| 1225 | + isa = PBXGroup; | ||
| 1226 | + children = ( | ||
| 1227 | + D22831071E77D8D500627701 /* GiftModel.h */, | ||
| 1228 | + D22831081E77D8D500627701 /* GiftModel.m */, | ||
| 1229 | + ); | ||
| 1230 | + path = GiftModel; | ||
| 1231 | + sourceTree = "<group>"; | ||
| 1232 | + }; | ||
| 1162 | D2575C431E76846900E3A8FC /* InteractionSections */ = { | 1233 | D2575C431E76846900E3A8FC /* InteractionSections */ = { |
| 1163 | isa = PBXGroup; | 1234 | isa = PBXGroup; |
| 1164 | children = ( | 1235 | children = ( |
| 1236 | + D22830F91E77C2D900627701 /* BottomToolView */, | ||
| 1237 | + D22830F81E77C2A700627701 /* TopToolView */, | ||
| 1238 | + D22830F61E77C26C00627701 /* Chat */, | ||
| 1239 | + D22830EF1E778C0F00627701 /* LiveBaseView.h */, | ||
| 1240 | + D22830F01E778C0F00627701 /* LiveBaseView.m */, | ||
| 1165 | D2575C651E76A25400E3A8FC /* LVCInteractionController.h */, | 1241 | D2575C651E76A25400E3A8FC /* LVCInteractionController.h */, |
| 1166 | D2575C661E76A25400E3A8FC /* LVCInteractionController.m */, | 1242 | D2575C661E76A25400E3A8FC /* LVCInteractionController.m */, |
| 1167 | D2575C681E76A42B00E3A8FC /* Gift */, | 1243 | D2575C681E76A42B00E3A8FC /* Gift */, |
| @@ -1186,7 +1262,9 @@ | @@ -1186,7 +1262,9 @@ | ||
| 1186 | children = ( | 1262 | children = ( |
| 1187 | D2575C691E76A45400E3A8FC /* LVCGiftManager.h */, | 1263 | D2575C691E76A45400E3A8FC /* LVCGiftManager.h */, |
| 1188 | D2575C6A1E76A45400E3A8FC /* LVCGiftManager.m */, | 1264 | D2575C6A1E76A45400E3A8FC /* LVCGiftManager.m */, |
| 1265 | + D22830F51E77C24900627701 /* GiftViews */, | ||
| 1189 | D2575C6C1E76A4F300E3A8FC /* GiftResource */, | 1266 | D2575C6C1E76A4F300E3A8FC /* GiftResource */, |
| 1267 | + D22831061E77D8D500627701 /* GiftModel */, | ||
| 1190 | ); | 1268 | ); |
| 1191 | path = Gift; | 1269 | path = Gift; |
| 1192 | sourceTree = "<group>"; | 1270 | sourceTree = "<group>"; |
| @@ -1443,6 +1521,7 @@ | @@ -1443,6 +1521,7 @@ | ||
| 1443 | D2029CC91E6EADE10027CD92 /* SVProgressHUD.bundle in Resources */, | 1521 | D2029CC91E6EADE10027CD92 /* SVProgressHUD.bundle in Resources */, |
| 1444 | D2575C801E76A4F300E3A8FC /* resource.bundle in Resources */, | 1522 | D2575C801E76A4F300E3A8FC /* resource.bundle in Resources */, |
| 1445 | D2029B941E6EAAA50027CD92 /* LaunchScreen.storyboard in Resources */, | 1523 | D2029B941E6EAAA50027CD92 /* LaunchScreen.storyboard in Resources */, |
| 1524 | + D2029B911E6EAAA50027CD92 /* animation.xcassets in Resources */, | ||
| 1446 | D2029CB01E6EADE10027CD92 /* MJRefresh.bundle in Resources */, | 1525 | D2029CB01E6EADE10027CD92 /* MJRefresh.bundle in Resources */, |
| 1447 | D2575C7C1E76A4F300E3A8FC /* NHFighterView.nib in Resources */, | 1526 | D2575C7C1E76A4F300E3A8FC /* NHFighterView.nib in Resources */, |
| 1448 | 812E50541E7699DC004F5FCD /* KSYGPUResource.bundle in Resources */, | 1527 | 812E50541E7699DC004F5FCD /* KSYGPUResource.bundle in Resources */, |
| @@ -1471,6 +1550,7 @@ | @@ -1471,6 +1550,7 @@ | ||
| 1471 | buildActionMask = 2147483647; | 1550 | buildActionMask = 2147483647; |
| 1472 | files = ( | 1551 | files = ( |
| 1473 | D2029CC31E6EADE10027CD92 /* UIImageView+HighlightedWebCache.m in Sources */, | 1552 | D2029CC31E6EADE10027CD92 /* UIImageView+HighlightedWebCache.m in Sources */, |
| 1553 | + D22830FF1E77C69E00627701 /* GiftListView.m in Sources */, | ||
| 1474 | D2029CC01E6EADE10027CD92 /* UIImage+GIF.m in Sources */, | 1554 | D2029CC01E6EADE10027CD92 /* UIImage+GIF.m in Sources */, |
| 1475 | D2029BCF1E6EADD70027CD92 /* ZXTabBarController.m in Sources */, | 1555 | D2029BCF1E6EADD70027CD92 /* ZXTabBarController.m in Sources */, |
| 1476 | D2029D071E6EAE2E0027CD92 /* ZXConst.m in Sources */, | 1556 | D2029D071E6EAE2E0027CD92 /* ZXConst.m in Sources */, |
| @@ -1482,6 +1562,7 @@ | @@ -1482,6 +1562,7 @@ | ||
| 1482 | D2029CA01E6EADE10027CD92 /* NSObject+MJProperty.m in Sources */, | 1562 | D2029CA01E6EADE10027CD92 /* NSObject+MJProperty.m in Sources */, |
| 1483 | D2029CB51E6EADE10027CD92 /* SDiOSVersion.m in Sources */, | 1563 | D2029CB51E6EADE10027CD92 /* SDiOSVersion.m in Sources */, |
| 1484 | D2029C9C1E6EADE10027CD92 /* MJPropertyType.m in Sources */, | 1564 | D2029C9C1E6EADE10027CD92 /* MJPropertyType.m in Sources */, |
| 1565 | + D22831091E77D8D500627701 /* GiftModel.m in Sources */, | ||
| 1485 | D2029CCD1E6EADE10027CD92 /* SearchModel.m in Sources */, | 1566 | D2029CCD1E6EADE10027CD92 /* SearchModel.m in Sources */, |
| 1486 | 810B65051E779B1F00133E15 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, | 1567 | 810B65051E779B1F00133E15 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, |
| 1487 | D2029CCB1E6EADE10027CD92 /* SVRadialGradientLayer.m in Sources */, | 1568 | D2029CCB1E6EADE10027CD92 /* SVRadialGradientLayer.m in Sources */, |
| @@ -1495,6 +1576,7 @@ | @@ -1495,6 +1576,7 @@ | ||
| 1495 | D2575C7A1E76A4F300E3A8FC /* NHCarViews.m in Sources */, | 1576 | D2575C7A1E76A4F300E3A8FC /* NHCarViews.m in Sources */, |
| 1496 | D2029CBC1E6EADE10027CD92 /* SDWebImageDownloaderOperation.m in Sources */, | 1577 | D2029CBC1E6EADE10027CD92 /* SDWebImageDownloaderOperation.m in Sources */, |
| 1497 | D2029CA51E6EADE10027CD92 /* MJRefreshFooter.m in Sources */, | 1578 | D2029CA51E6EADE10027CD92 /* MJRefreshFooter.m in Sources */, |
| 1579 | + D22830FC1E77C2D900627701 /* BottomToolView.m in Sources */, | ||
| 1498 | 810B65061E779B1F00133E15 /* View+MASAdditions.m in Sources */, | 1580 | 810B65061E779B1F00133E15 /* View+MASAdditions.m in Sources */, |
| 1499 | D2029D161E6EB00D0027CD92 /* AppDelegate.m in Sources */, | 1581 | D2029D161E6EB00D0027CD92 /* AppDelegate.m in Sources */, |
| 1500 | D2029CB71E6EADE10027CD92 /* NSData+ImageContentType.m in Sources */, | 1582 | D2029CB71E6EADE10027CD92 /* NSData+ImageContentType.m in Sources */, |
| @@ -1519,6 +1601,7 @@ | @@ -1519,6 +1601,7 @@ | ||
| 1519 | D2029CC71E6EADE10027CD92 /* SVIndefiniteAnimatedView.m in Sources */, | 1601 | D2029CC71E6EADE10027CD92 /* SVIndefiniteAnimatedView.m in Sources */, |
| 1520 | D2029CA31E6EADE10027CD92 /* MJRefreshBackFooter.m in Sources */, | 1602 | D2029CA31E6EADE10027CD92 /* MJRefreshBackFooter.m in Sources */, |
| 1521 | D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */, | 1603 | D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */, |
| 1604 | + D22831021E77D83C00627701 /* GiftModelView.m in Sources */, | ||
| 1522 | D2029CA61E6EADE10027CD92 /* MJRefreshHeader.m in Sources */, | 1605 | D2029CA61E6EADE10027CD92 /* MJRefreshHeader.m in Sources */, |
| 1523 | D2029CC41E6EADE10027CD92 /* UIImageView+WebCache.m in Sources */, | 1606 | D2029CC41E6EADE10027CD92 /* UIImageView+WebCache.m in Sources */, |
| 1524 | D2029CC81E6EADE10027CD92 /* SVProgressAnimatedView.m in Sources */, | 1607 | D2029CC81E6EADE10027CD92 /* SVProgressAnimatedView.m in Sources */, |
| @@ -1561,6 +1644,7 @@ | @@ -1561,6 +1644,7 @@ | ||
| 1561 | D2029CCA1E6EADE10027CD92 /* SVProgressHUD.m in Sources */, | 1644 | D2029CCA1E6EADE10027CD92 /* SVProgressHUD.m in Sources */, |
| 1562 | D2029CA81E6EADE10027CD92 /* MJRefreshAutoNormalFooter.m in Sources */, | 1645 | D2029CA81E6EADE10027CD92 /* MJRefreshAutoNormalFooter.m in Sources */, |
| 1563 | D2029C891E6EADE10027CD92 /* AFSecurityPolicy.m in Sources */, | 1646 | D2029C891E6EADE10027CD92 /* AFSecurityPolicy.m in Sources */, |
| 1647 | + D22830F11E778C0F00627701 /* LiveBaseView.m in Sources */, | ||
| 1564 | D2029CBA1E6EADE10027CD92 /* SDWebImageDecoder.m in Sources */, | 1648 | D2029CBA1E6EADE10027CD92 /* SDWebImageDecoder.m in Sources */, |
| 1565 | 8112D4311E7927A5002E00F6 /* LVCPlayerLoadingView.m in Sources */, | 1649 | 8112D4311E7927A5002E00F6 /* LVCPlayerLoadingView.m in Sources */, |
| 1566 | D2029D081E6EAE2E0027CD92 /* ZXDeviceInfo.m in Sources */, | 1650 | D2029D081E6EAE2E0027CD92 /* ZXDeviceInfo.m in Sources */, |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/BottomToolView/BottomToolView.h
0 → 100644
| 1 | +// | ||
| 2 | +// BottomToolView.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/14. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "BaseView.h" | ||
| 10 | + | ||
| 11 | +typedef NS_ENUM(NSInteger, BtnClickType) {//底部按钮类型 | ||
| 12 | + BtnClickTypeChat = 1,//聊天按钮点击 | ||
| 13 | + BtnClickTypePriChat ,//私聊按钮点击 | ||
| 14 | + BtnClickTypeGift ,//礼物按钮点击 | ||
| 15 | +}; | ||
| 16 | + | ||
| 17 | +@protocol bottomBtnDeledate <NSObject> | ||
| 18 | + | ||
| 19 | +- (void)bottomActionWithType:(BtnClickType)btnType; | ||
| 20 | + | ||
| 21 | +@end | ||
| 22 | +@interface BottomToolView : BaseView | ||
| 23 | + | ||
| 24 | +@property (nonatomic) id <bottomBtnDeledate> delegate; | ||
| 25 | + | ||
| 26 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/BottomToolView/BottomToolView.m
0 → 100644
| 1 | +// | ||
| 2 | +// BottomToolView.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/14. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "BottomToolView.h" | ||
| 10 | + | ||
| 11 | +@interface BottomToolView () | ||
| 12 | + | ||
| 13 | +@property (nonatomic ,strong) UIButton * _Nullable chatBtn; | ||
| 14 | +@property (nonatomic ,strong) UIButton * _Nullable privateChatBtn; | ||
| 15 | +@property (nonatomic ,strong) UIButton * _Nullable giftBtn; | ||
| 16 | + | ||
| 17 | +@end | ||
| 18 | + | ||
| 19 | +@implementation BottomToolView | ||
| 20 | + | ||
| 21 | +- (instancetype)initWithFrame:(CGRect)frame | ||
| 22 | +{ | ||
| 23 | + if (self = [super initWithFrame:frame]) { | ||
| 24 | + [self addSubview:self.chatBtn]; | ||
| 25 | + [self addSubview:self.privateChatBtn]; | ||
| 26 | + [self addSubview:self.giftBtn]; | ||
| 27 | + } | ||
| 28 | + return self; | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +#pragma mark - buttonClick | ||
| 32 | +- (void)chatAction | ||
| 33 | +{ | ||
| 34 | + | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +- (void)privateChatAction | ||
| 38 | +{ | ||
| 39 | + | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +- (void)giftAction | ||
| 43 | +{ | ||
| 44 | + if ([self.delegate respondsToSelector:@selector(bottomActionWithType:)]) { | ||
| 45 | + [self.delegate bottomActionWithType:BtnClickTypeGift]; | ||
| 46 | + } | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +#pragma mark - getter | ||
| 50 | +- (UIButton *)chatBtn | ||
| 51 | +{ | ||
| 52 | + if (!_chatBtn) | ||
| 53 | + { | ||
| 54 | + UIButton *chatBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 55 | + chatBtn.frame = CGRectMake(10, (self.height - 45)*0.5, 45, 45); | ||
| 56 | + [chatBtn setBackgroundImage:[UIImage imageNamed:@"LiveChatNormal"] forState:UIControlStateNormal]; | ||
| 57 | + [chatBtn setBackgroundImage:[UIImage imageNamed:@"LiveChatTouch"] forState:UIControlStateHighlighted]; | ||
| 58 | + [chatBtn addTarget:self action:@selector(chatAction) forControlEvents:UIControlEventTouchUpInside]; | ||
| 59 | + _chatBtn = chatBtn; | ||
| 60 | + } | ||
| 61 | + return _chatBtn; | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +- (UIButton *)privateChatBtn | ||
| 65 | +{ | ||
| 66 | + if (!_privateChatBtn) | ||
| 67 | + { | ||
| 68 | + UIButton *privateChatBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 69 | + privateChatBtn.frame = CGRectMake(self.width*0.5 - 50, (self.height - 45)*0.5, 45, 45); | ||
| 70 | + [privateChatBtn setBackgroundImage:[UIImage imageNamed:@"LiveChatNormal"] forState:UIControlStateNormal]; | ||
| 71 | + [privateChatBtn setBackgroundImage:[UIImage imageNamed:@"LiveChatTouch"] forState:UIControlStateHighlighted]; | ||
| 72 | + [privateChatBtn addTarget:self action:@selector(privateChatAction) forControlEvents:UIControlEventTouchUpInside]; | ||
| 73 | + _privateChatBtn = privateChatBtn; | ||
| 74 | + } | ||
| 75 | + return _privateChatBtn; | ||
| 76 | +} | ||
| 77 | + | ||
| 78 | +- (UIButton *)giftBtn | ||
| 79 | +{ | ||
| 80 | + if (!_giftBtn) | ||
| 81 | + { | ||
| 82 | + UIButton *giftBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 83 | + giftBtn.frame = CGRectMake(self.width*0.5 + 10, (self.height - 45)*0.5, 45, 45); | ||
| 84 | + [giftBtn setBackgroundImage:[UIImage imageNamed:@"LiveChatGiftNormal"] forState:UIControlStateNormal]; | ||
| 85 | + [giftBtn setBackgroundImage:[UIImage imageNamed:@"LiveChatGiftTouch"] forState:UIControlStateHighlighted]; | ||
| 86 | + [giftBtn addTarget:self action:@selector(giftAction) forControlEvents:UIControlEventTouchUpInside]; | ||
| 87 | + _giftBtn = giftBtn; | ||
| 88 | + } | ||
| 89 | + return _giftBtn; | ||
| 90 | +} | ||
| 91 | + | ||
| 92 | +/* | ||
| 93 | +// Only override drawRect: if you perform custom drawing. | ||
| 94 | +// An empty implementation adversely affects performance during animation. | ||
| 95 | +- (void)drawRect:(CGRect)rect { | ||
| 96 | + // Drawing code | ||
| 97 | +} | ||
| 98 | +*/ | ||
| 99 | + | ||
| 100 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftModel/GiftModel.h
0 → 100644
| 1 | +// | ||
| 2 | +// GiftModel.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/14. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "BaseModel.h" | ||
| 10 | + | ||
| 11 | +typedef NS_ENUM(NSInteger, GiftModelType) {//礼物类型 | ||
| 12 | + GiftModelTypeCommon = 1,//普通礼物 | ||
| 13 | + GiftModelTypeSpecial //特殊(豪华)礼物 | ||
| 14 | +}; | ||
| 15 | + | ||
| 16 | +@interface GiftModel : BaseModel | ||
| 17 | + | ||
| 18 | +@property (nonatomic ,copy) NSString * _Nullable image; | ||
| 19 | +@property (nonatomic ) GiftModelType type; | ||
| 20 | +@property (nonatomic ,copy) NSString * _Nullable price; | ||
| 21 | + | ||
| 22 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftModel/GiftModel.m
0 → 100644
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftResource/NHPlaneViews.m
| @@ -39,7 +39,7 @@ | @@ -39,7 +39,7 @@ | ||
| 39 | 39 | ||
| 40 | CGPathAddQuadCurveToPoint(path, NULL, endPoint.x, endPoint.y, endPoint.x, endPoint.y); | 40 | CGPathAddQuadCurveToPoint(path, NULL, endPoint.x, endPoint.y, endPoint.x, endPoint.y); |
| 41 | position.path = path; | 41 | position.path = path; |
| 42 | - position.duration = 4.f; | 42 | + position.duration = 5.f; |
| 43 | position.speed = 0.6; | 43 | position.speed = 0.6; |
| 44 | position.removedOnCompletion = NO; | 44 | position.removedOnCompletion = NO; |
| 45 | position.fillMode = kCAFillModeForwards; | 45 | position.fillMode = kCAFillModeForwards; |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftViews/GiftListView.h
0 → 100644
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftViews/GiftListView.m
0 → 100644
| 1 | +// | ||
| 2 | +// GiftListView.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/14. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "GiftListView.h" | ||
| 10 | +#import "GiftModel.h" | ||
| 11 | + | ||
| 12 | +#define MAX_LINE_COUNT 4 | ||
| 13 | +#define MAX_ROW_COUNT 2 | ||
| 14 | + | ||
| 15 | +@interface GiftListView () | ||
| 16 | + | ||
| 17 | +@property (nonatomic ,strong) NSArray <GiftModel *>* _Nullable giftArray; | ||
| 18 | + | ||
| 19 | +@end | ||
| 20 | + | ||
| 21 | +@implementation GiftListView | ||
| 22 | + | ||
| 23 | +- (instancetype)initWithFrame:(CGRect)frame | ||
| 24 | +{ | ||
| 25 | + if (self = [super initWithFrame:frame]) { | ||
| 26 | + | ||
| 27 | + | ||
| 28 | + UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.bounds]; | ||
| 29 | + scrollView.contentSize = CGSizeMake(self.width *(self.giftArray.count/(MAX_ROW_COUNT*MAX_LINE_COUNT) + 1), self.height); | ||
| 30 | + scrollView.pagingEnabled = YES; | ||
| 31 | + scrollView.bounces = NO; | ||
| 32 | + scrollView.showsVerticalScrollIndicator = NO; | ||
| 33 | + scrollView.showsHorizontalScrollIndicator = NO; | ||
| 34 | + scrollView.backgroundColor = [UIColor blueColor]; | ||
| 35 | + [self addSubview:scrollView]; | ||
| 36 | + | ||
| 37 | + int line = 0; | ||
| 38 | + int row = 0; | ||
| 39 | + CGFloat giftX = 0; | ||
| 40 | + CGFloat giftY = 0; | ||
| 41 | + int page = 0; | ||
| 42 | + for (int i = 0; i < self.giftArray.count; i ++) { | ||
| 43 | + | ||
| 44 | + if (i % MAX_LINE_COUNT == 0 && i > 0) { | ||
| 45 | + line ++; | ||
| 46 | + } | ||
| 47 | + if (i % (MAX_LINE_COUNT * MAX_ROW_COUNT) == 0 && i > 0) { | ||
| 48 | + page++; | ||
| 49 | + line = 0; | ||
| 50 | + } | ||
| 51 | + row = i % MAX_LINE_COUNT; | ||
| 52 | + CGFloat giftWidth = self.width / MAX_LINE_COUNT * 1.0; | ||
| 53 | + CGFloat giftHeight = self.height / MAX_ROW_COUNT * 1.0; | ||
| 54 | + giftX = row * giftWidth + page * scrollView.width; | ||
| 55 | + giftY = line * giftHeight; | ||
| 56 | + | ||
| 57 | + UIView *giftView = [self giftViewWithFrame:CGRectMake(giftX, giftY, giftWidth, giftHeight) model:self.giftArray[i]]; | ||
| 58 | + giftView.backgroundColor = ZXRandomColor; | ||
| 59 | + | ||
| 60 | + UIImageView *picImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.giftArray[i].image]]; | ||
| 61 | + picImg.centerX = giftView.width * 0.5; | ||
| 62 | + picImg.centerY = giftView.height * 0.5; | ||
| 63 | + [giftView addSubview:picImg]; | ||
| 64 | + | ||
| 65 | + [scrollView addSubview:giftView]; | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | + return self; | ||
| 69 | +} | ||
| 70 | + | ||
| 71 | +- (UIView *)giftViewWithFrame:(CGRect)frame model:(GiftModel *)model | ||
| 72 | +{ | ||
| 73 | + UIView *giftView = [[UIView alloc] initWithFrame:frame]; | ||
| 74 | + switch (model.type) { | ||
| 75 | + case GiftModelTypeCommon: | ||
| 76 | + { | ||
| 77 | + UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(giftView.width - 17, 3, 15, 15)]; | ||
| 78 | + imageView.backgroundColor = ZXRandomColor; | ||
| 79 | + [giftView addSubview:imageView]; | ||
| 80 | + } | ||
| 81 | + break; | ||
| 82 | + case GiftModelTypeSpecial: | ||
| 83 | + { | ||
| 84 | + | ||
| 85 | + } | ||
| 86 | + break; | ||
| 87 | + default: | ||
| 88 | + break; | ||
| 89 | + } | ||
| 90 | + | ||
| 91 | + UIButton *coin = [[UIButton alloc] initWithFrame:CGRectMake(0, giftView.height - 13, 15, 10)]; | ||
| 92 | + coin.centerX = giftView.width * 0.5; | ||
| 93 | + coin.backgroundColor = ZXRandomColor; | ||
| 94 | + [giftView addSubview:coin]; | ||
| 95 | + return giftView; | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +- (NSArray *)giftArray | ||
| 99 | +{ | ||
| 100 | + if (!_giftArray) | ||
| 101 | + { | ||
| 102 | + GiftModel *model = [[GiftModel alloc] init]; | ||
| 103 | + model.image = @"love"; | ||
| 104 | + model.type = GiftModelTypeCommon; | ||
| 105 | + model.price = @"3"; | ||
| 106 | + _giftArray = [[NSArray alloc] initWithObjects:model,model,model,model,model,model,model,model,model,model, nil]; | ||
| 107 | + } | ||
| 108 | + return _giftArray; | ||
| 109 | +} | ||
| 110 | + | ||
| 111 | +/* | ||
| 112 | +// Only override drawRect: if you perform custom drawing. | ||
| 113 | +// An empty implementation adversely affects performance during animation. | ||
| 114 | +- (void)drawRect:(CGRect)rect { | ||
| 115 | + // Drawing code | ||
| 116 | +} | ||
| 117 | +*/ | ||
| 118 | + | ||
| 119 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftViews/GiftModelView.h
0 → 100644
| 1 | +// | ||
| 2 | +// GiftModelView.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/14. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "BaseView.h" | ||
| 10 | + | ||
| 11 | +@class GiftModel; | ||
| 12 | +@interface GiftModelView : BaseView | ||
| 13 | + | ||
| 14 | ++ (instancetype)giftViewWithModel:(GiftModel *)giftModel; | ||
| 15 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftViews/GiftModelView.m
0 → 100644
| 1 | +// | ||
| 2 | +// GiftModelView.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/14. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "GiftModelView.h" | ||
| 10 | +#import "GiftModel.h" | ||
| 11 | + | ||
| 12 | +@implementation GiftModelView | ||
| 13 | + | ||
| 14 | +//+ (instancetype)giftViewWithModel:(GiftModel *)giftModel | ||
| 15 | +//{ | ||
| 16 | +// GiftModelView *view = [[GiftModelView alloc] init]; | ||
| 17 | +// view | ||
| 18 | +// return ; | ||
| 19 | +//} | ||
| 20 | + | ||
| 21 | +/* | ||
| 22 | +// Only override drawRect: if you perform custom drawing. | ||
| 23 | +// An empty implementation adversely affects performance during animation. | ||
| 24 | +- (void)drawRect:(CGRect)rect { | ||
| 25 | + // Drawing code | ||
| 26 | +} | ||
| 27 | +*/ | ||
| 28 | + | ||
| 29 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/LVCGiftManager.m
| @@ -23,7 +23,7 @@ | @@ -23,7 +23,7 @@ | ||
| 23 | //数组中放CGRect数据,CGRect的x和y分别作为控制点的x和y,CGRect的width和height作为结束点的x和y | 23 | //数组中放CGRect数据,CGRect的x和y分别作为控制点的x和y,CGRect的width和height作为结束点的x和y |
| 24 | //方法如下:数组内的每个元素代码一个控制点和结束点 | 24 | //方法如下:数组内的每个元素代码一个控制点和结束点 |
| 25 | NSMutableArray *pointArrs = [[NSMutableArray alloc] init]; | 25 | NSMutableArray *pointArrs = [[NSMutableArray alloc] init]; |
| 26 | - CGFloat width = [UIScreen mainScreen].bounds.size.width / 2; | 26 | + CGFloat width = SCREEN_WIDTH / 2; |
| 27 | [pointArrs addObject:NSStringFromCGRect(CGRectMake(width, 300, width, 300))]; | 27 | [pointArrs addObject:NSStringFromCGRect(CGRectMake(width, 300, width, 300))]; |
| 28 | [pointArrs addObject:NSStringFromCGRect(CGRectMake(width, 300, width, 300))]; | 28 | [pointArrs addObject:NSStringFromCGRect(CGRectMake(width, 300, width, 300))]; |
| 29 | car.curveControlAndEndPoints = pointArrs; | 29 | car.curveControlAndEndPoints = pointArrs; |
| @@ -41,6 +41,10 @@ | @@ -41,6 +41,10 @@ | ||
| 41 | case GiftTypePlane: | 41 | case GiftTypePlane: |
| 42 | { | 42 | { |
| 43 | NHPlaneViews *plane = [NHPlaneViews loadPlaneViewWithPoint:CGPointMake(SCREEN_WIDTH + 232, 0)]; | 43 | NHPlaneViews *plane = [NHPlaneViews loadPlaneViewWithPoint:CGPointMake(SCREEN_WIDTH + 232, 0)]; |
| 44 | +// NSMutableArray *pointArrs = [[NSMutableArray alloc] init]; | ||
| 45 | +// [pointArrs addObject:NSStringFromCGRect(CGRectMake(290, 250, 290, 250))]; | ||
| 46 | +// [pointArrs addObject:NSStringFromCGRect(CGRectMake(290, 250, 290, 250))]; | ||
| 47 | +// plane.curveControlAndEndPoints = pointArrs; | ||
| 44 | [plane addAnimationsMoveToPoint:CGPointMake(SCREEN_WIDTH, 100) endPoint:CGPointMake(-500, 410)]; | 48 | [plane addAnimationsMoveToPoint:CGPointMake(SCREEN_WIDTH, 100) endPoint:CGPointMake(-500, 410)]; |
| 45 | [toView addSubview:plane]; | 49 | [toView addSubview:plane]; |
| 46 | } | 50 | } |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/LVCInteractionController.m
| @@ -7,10 +7,12 @@ | @@ -7,10 +7,12 @@ | ||
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | #import "LVCInteractionController.h" | 9 | #import "LVCInteractionController.h" |
| 10 | -#import "LVCGiftManager.h" | 10 | +#import "LiveBaseView.h" |
| 11 | 11 | ||
| 12 | @interface LVCInteractionController () | 12 | @interface LVCInteractionController () |
| 13 | 13 | ||
| 14 | +@property (nonatomic ,strong) LiveBaseView * _Nullable liveBaseView; | ||
| 15 | + | ||
| 14 | @end | 16 | @end |
| 15 | 17 | ||
| 16 | @implementation LVCInteractionController | 18 | @implementation LVCInteractionController |
| @@ -18,12 +20,22 @@ | @@ -18,12 +20,22 @@ | ||
| 18 | - (void)viewDidLoad { | 20 | - (void)viewDidLoad { |
| 19 | [super viewDidLoad]; | 21 | [super viewDidLoad]; |
| 20 | // Do any additional setup after loading the view. | 22 | // Do any additional setup after loading the view. |
| 21 | - | 23 | + self.automaticallyAdjustsScrollViewInsets = NO; |
| 24 | +} | ||
| 25 | + | ||
| 26 | +- (void)bindView | ||
| 27 | +{ | ||
| 28 | + [self.view addSubview:self.liveBaseView]; | ||
| 22 | } | 29 | } |
| 23 | 30 | ||
| 24 | -- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event | 31 | +- (LiveBaseView *)liveBaseView |
| 25 | { | 32 | { |
| 26 | - [LVCGiftManager giftType:GiftTypeFighter toView:self.view]; | 33 | + if (!_liveBaseView) |
| 34 | + { | ||
| 35 | + _liveBaseView = [[LiveBaseView alloc] initWithFrame:SCREEN_RECT]; | ||
| 36 | + _liveBaseView.backgroundColor = [UIColor greenColor]; | ||
| 37 | + } | ||
| 38 | + return _liveBaseView; | ||
| 27 | } | 39 | } |
| 28 | 40 | ||
| 29 | - (void)didReceiveMemoryWarning { | 41 | - (void)didReceiveMemoryWarning { |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/LiveBaseView.h
0 → 100644
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/LiveBaseView.m
0 → 100644
| 1 | + | ||
| 2 | +// | ||
| 3 | +// LiveBaseView.m | ||
| 4 | +// LiveVideoCloud | ||
| 5 | +// | ||
| 6 | +// Created by 张旭 on 2017/3/14. | ||
| 7 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 8 | +// | ||
| 9 | + | ||
| 10 | +#import "LiveBaseView.h" | ||
| 11 | +#import "LVCGiftManager.h" | ||
| 12 | +#import "BottomToolView.h" | ||
| 13 | +#import "GiftListView.h" | ||
| 14 | + | ||
| 15 | +@interface LiveBaseView ()<bottomBtnDeledate> | ||
| 16 | + | ||
| 17 | +@property (nonatomic ,strong) UIScrollView * _Nullable scrollView; | ||
| 18 | +@property (nonatomic ,strong) BottomToolView* _Nullable bottomToolView; | ||
| 19 | +@property (nonatomic ,strong) UIButton * _Nullable closeBtn; | ||
| 20 | +@property (nonatomic ,strong) UIView * _Nullable currentPopView; | ||
| 21 | + | ||
| 22 | +@property (nonatomic ,strong) UIButton * _Nullable porschBtn; | ||
| 23 | +@property (nonatomic ,strong) UIButton * _Nullable fightBtn; | ||
| 24 | +@property (nonatomic ,strong) UIButton * _Nullable planeBtn; | ||
| 25 | + | ||
| 26 | +@end | ||
| 27 | + | ||
| 28 | +@implementation LiveBaseView | ||
| 29 | + | ||
| 30 | +- (instancetype)initWithFrame:(CGRect)frame | ||
| 31 | +{ | ||
| 32 | + if (self = [super initWithFrame:frame]) { | ||
| 33 | + | ||
| 34 | + [self addSubview:self.scrollView]; | ||
| 35 | + [self.scrollView addSubview:self.bottomToolView]; | ||
| 36 | + [self addSubview:self.closeBtn]; | ||
| 37 | + [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureClick)]]; | ||
| 38 | + | ||
| 39 | +// [self addSubview:self.porschBtn]; | ||
| 40 | +// [self addSubview:self.fightBtn]; | ||
| 41 | +// [self addSubview:self.planeBtn]; | ||
| 42 | + } | ||
| 43 | + return self; | ||
| 44 | +} | ||
| 45 | + | ||
| 46 | +#pragma mark - bottomBtnDelegate | ||
| 47 | +- (void)bottomActionWithType:(BtnClickType)btnType | ||
| 48 | +{ | ||
| 49 | + [self hiddenView:YES]; | ||
| 50 | + switch (btnType) { | ||
| 51 | + case BtnClickTypeChat: | ||
| 52 | + { | ||
| 53 | + | ||
| 54 | + } | ||
| 55 | + break; | ||
| 56 | + case BtnClickTypePriChat: | ||
| 57 | + { | ||
| 58 | + | ||
| 59 | + } | ||
| 60 | + break; | ||
| 61 | + case BtnClickTypeGift: | ||
| 62 | + { | ||
| 63 | + GiftListView *giftListView = [[GiftListView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT - 200, SCREEN_WIDTH, 200)]; | ||
| 64 | + giftListView.backgroundColor = [UIColor redColor]; | ||
| 65 | + [self addSubview:giftListView]; | ||
| 66 | + self.currentPopView = giftListView; | ||
| 67 | + | ||
| 68 | + | ||
| 69 | + | ||
| 70 | + | ||
| 71 | + } | ||
| 72 | + break; | ||
| 73 | + default: | ||
| 74 | + break; | ||
| 75 | + } | ||
| 76 | +} | ||
| 77 | + | ||
| 78 | +- (void)hiddenView:(BOOL)isHidden | ||
| 79 | +{ | ||
| 80 | + self.bottomToolView.hidden = isHidden; | ||
| 81 | + self.closeBtn.hidden = isHidden; | ||
| 82 | +} | ||
| 83 | + | ||
| 84 | +- (void)clearCurrentPopView | ||
| 85 | +{ | ||
| 86 | + [UIView animateWithDuration:0.25 animations:^{ | ||
| 87 | + | ||
| 88 | + self.currentPopView.frame = CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT); | ||
| 89 | + [self hiddenView:NO]; | ||
| 90 | + } completion:^(BOOL finished) { | ||
| 91 | + [self.currentPopView removeFromSuperview]; | ||
| 92 | + }]; | ||
| 93 | +} | ||
| 94 | + | ||
| 95 | +#pragma mark - buttonClick | ||
| 96 | +- (void)tapGestureClick | ||
| 97 | +{ | ||
| 98 | + [self clearCurrentPopView]; | ||
| 99 | +} | ||
| 100 | + | ||
| 101 | + | ||
| 102 | +- (void)porschAction | ||
| 103 | +{ | ||
| 104 | + [LVCGiftManager giftType:GiftTypePorsch toView:self]; | ||
| 105 | +} | ||
| 106 | + | ||
| 107 | +- (void)fightAction | ||
| 108 | +{ | ||
| 109 | + [LVCGiftManager giftType:GiftTypeFighter toView:self]; | ||
| 110 | +} | ||
| 111 | + | ||
| 112 | +- (void)planeAction | ||
| 113 | +{ | ||
| 114 | + [LVCGiftManager giftType:GiftTypePlane toView:self]; | ||
| 115 | +} | ||
| 116 | + | ||
| 117 | +- (void)closeAction | ||
| 118 | +{ | ||
| 119 | + | ||
| 120 | +} | ||
| 121 | + | ||
| 122 | +#pragma mark - getter | ||
| 123 | +- (UIScrollView *)scrollView | ||
| 124 | +{ | ||
| 125 | + if (!_scrollView) | ||
| 126 | + { | ||
| 127 | + _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; | ||
| 128 | + _scrollView.contentSize = CGSizeMake(SCREEN_WIDTH*2, SCREEN_HEIGHT); | ||
| 129 | + _scrollView.contentOffset = CGPointMake(SCREEN_WIDTH, 0); | ||
| 130 | + _scrollView.bounces = NO; | ||
| 131 | + _scrollView.pagingEnabled = YES; | ||
| 132 | + _scrollView.showsVerticalScrollIndicator = NO; | ||
| 133 | + _scrollView.showsHorizontalScrollIndicator = NO; | ||
| 134 | + _scrollView.backgroundColor = [UIColor clearColor]; | ||
| 135 | + } | ||
| 136 | + return _scrollView; | ||
| 137 | +} | ||
| 138 | + | ||
| 139 | +- (BottomToolView *)bottomToolView | ||
| 140 | +{ | ||
| 141 | + if (!_bottomToolView) | ||
| 142 | + { | ||
| 143 | + _bottomToolView = [[BottomToolView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH, SCREEN_HEIGHT - 60, SCREEN_WIDTH, 60)]; | ||
| 144 | + _bottomToolView.delegate = self; | ||
| 145 | + _bottomToolView.backgroundColor = [UIColor lightGrayColor]; | ||
| 146 | + _bottomToolView.alpha = 0.7; | ||
| 147 | + } | ||
| 148 | + return _bottomToolView; | ||
| 149 | +} | ||
| 150 | + | ||
| 151 | +- (UIButton *)closeBtn | ||
| 152 | +{ | ||
| 153 | + if (!_closeBtn) | ||
| 154 | + { | ||
| 155 | + UIButton *closeBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 156 | + closeBtn.frame = CGRectMake(SCREEN_WIDTH - 43,SCREEN_HEIGHT - self.bottomToolView.height + (self.bottomToolView.height - 33)*0.5, 33, 33); | ||
| 157 | + [closeBtn setBackgroundImage:[UIImage imageNamed:@"LiveCloseNormal"] forState:UIControlStateNormal]; | ||
| 158 | + [closeBtn setBackgroundImage:[UIImage imageNamed:@"LiveCloseTouch"] forState:UIControlStateHighlighted]; | ||
| 159 | + [closeBtn addTarget:self action:@selector(closeAction) forControlEvents:UIControlEventTouchUpInside]; | ||
| 160 | + _closeBtn = closeBtn; | ||
| 161 | + } | ||
| 162 | + return _closeBtn; | ||
| 163 | +} | ||
| 164 | + | ||
| 165 | +- (UIButton *)porschBtn | ||
| 166 | +{ | ||
| 167 | + if (!_porschBtn) | ||
| 168 | + { | ||
| 169 | + UIButton *porschBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 170 | + porschBtn.frame = CGRectMake(SCREEN_WIDTH - 80, 400, 80, 30); | ||
| 171 | + [porschBtn setTitle:@"保时捷" forState:UIControlStateNormal]; | ||
| 172 | + [porschBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; | ||
| 173 | + [porschBtn addTarget:self action:@selector(porschAction) forControlEvents:UIControlEventTouchUpInside]; | ||
| 174 | + _porschBtn = porschBtn; | ||
| 175 | + } | ||
| 176 | + return _porschBtn; | ||
| 177 | +} | ||
| 178 | + | ||
| 179 | +- (UIButton *)fightBtn | ||
| 180 | +{ | ||
| 181 | + if (!_fightBtn) | ||
| 182 | + { | ||
| 183 | + UIButton *fightBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 184 | + fightBtn.frame = CGRectMake(SCREEN_WIDTH - 80, 450, 80, 30); | ||
| 185 | + [fightBtn setTitle:@"歼灭机" forState:UIControlStateNormal]; | ||
| 186 | + [fightBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; | ||
| 187 | + [fightBtn addTarget:self action:@selector(fightAction) forControlEvents:UIControlEventTouchUpInside]; | ||
| 188 | + _fightBtn = fightBtn; | ||
| 189 | + } | ||
| 190 | + return _fightBtn; | ||
| 191 | +} | ||
| 192 | + | ||
| 193 | +- (UIButton *)planeBtn | ||
| 194 | +{ | ||
| 195 | + if (!_planeBtn) | ||
| 196 | + { | ||
| 197 | + UIButton *planeBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 198 | + planeBtn.frame = CGRectMake(SCREEN_WIDTH - 80, 500, 80, 30); | ||
| 199 | + [planeBtn setTitle:@"客机" forState:UIControlStateNormal]; | ||
| 200 | + [planeBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; | ||
| 201 | + [planeBtn addTarget:self action:@selector(planeAction) forControlEvents:UIControlEventTouchUpInside]; | ||
| 202 | + _planeBtn = planeBtn; | ||
| 203 | + } | ||
| 204 | + return _planeBtn; | ||
| 205 | +} | ||
| 206 | + | ||
| 207 | +/* | ||
| 208 | +// Only override drawRect: if you perform custom drawing. | ||
| 209 | +// An empty implementation adversely affects performance during animation. | ||
| 210 | +- (void)drawRect:(CGRect)rect { | ||
| 211 | + // Drawing code | ||
| 212 | +} | ||
| 213 | +*/ | ||
| 214 | + | ||
| 215 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/LiveSections/Controller/LVCLiveViewController.m
| @@ -7,42 +7,470 @@ | @@ -7,42 +7,470 @@ | ||
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | #import "LVCLiveViewController.h" | 9 | #import "LVCLiveViewController.h" |
| 10 | +#import <CNLivePlayerSDK/CNLiveGPUStreamerKit.h> | ||
| 11 | +#import <CNLivePlayerSDK/CNLiveWebcastManager.h> | ||
| 10 | 12 | ||
| 11 | -@interface LVCLiveViewController () | 13 | +#define KAppId @"60_irn9edco29" |
| 14 | +#define KAppKey @"69fe70bda67e059286ad509d9f5377f815955645b52f94" | ||
| 15 | + | ||
| 16 | +@interface LVCLiveViewController () { | ||
| 17 | + // 开始直播 | ||
| 18 | + UIButton *_startLiveBtn; | ||
| 19 | + // 缩放因子 | ||
| 20 | + CGFloat _currentPinchZoomFactor; | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +@property (nonatomic,strong) UIView *captureView; | ||
| 24 | + | ||
| 25 | +@property (nonatomic,strong) CNLiveGPUStreamerKit *kitCN; | ||
| 12 | 26 | ||
| 13 | @end | 27 | @end |
| 14 | 28 | ||
| 15 | @implementation LVCLiveViewController | 29 | @implementation LVCLiveViewController |
| 16 | 30 | ||
| 31 | +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { | ||
| 32 | + | ||
| 33 | + if (_kitCN) { | ||
| 34 | + return UIInterfaceOrientationMaskAllButUpsideDown; | ||
| 35 | + } else { | ||
| 36 | + return UIInterfaceOrientationMaskPortrait; | ||
| 37 | + } | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { | ||
| 41 | + | ||
| 42 | + UIInterfaceOrientation orie = [[UIApplication sharedApplication] statusBarOrientation]; | ||
| 43 | + [_kitCN rotatePreviewTo:orie]; | ||
| 44 | + | ||
| 45 | + if (_kitCN.streamerBase.isStreaming) { | ||
| 46 | + [_kitCN rotateStreamTo:orie]; | ||
| 47 | + } | ||
| 48 | +} | ||
| 49 | + | ||
| 17 | - (void)viewDidLoad { | 50 | - (void)viewDidLoad { |
| 18 | [super viewDidLoad]; | 51 | [super viewDidLoad]; |
| 19 | - // Do any additional setup after loading the view. | 52 | + |
| 20 | self.view.backgroundColor = [UIColor blueColor]; | 53 | self.view.backgroundColor = [UIColor blueColor]; |
| 21 | 54 | ||
| 55 | + [self.view addSubview:self.captureView]; | ||
| 56 | + | ||
| 22 | UIButton *closeBtn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH - 50, 30, 50, 30)]; | 57 | UIButton *closeBtn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH - 50, 30, 50, 30)]; |
| 23 | [closeBtn setTitle:@"关闭" forState:UIControlStateNormal]; | 58 | [closeBtn setTitle:@"关闭" forState:UIControlStateNormal]; |
| 24 | [closeBtn addTarget:self action:@selector(closeBtnClivk) forControlEvents:UIControlEventTouchUpInside]; | 59 | [closeBtn addTarget:self action:@selector(closeBtnClivk) forControlEvents:UIControlEventTouchUpInside]; |
| 25 | [self.view addSubview:closeBtn]; | 60 | [self.view addSubview:closeBtn]; |
| 61 | + | ||
| 62 | + // 活动Id | ||
| 63 | + NSString *activityId = [NSString stringWithFormat:@"%d%d%d%d%d",arc4random()%9,arc4random()%9,arc4random()%9,arc4random()%9,arc4random()%9]; | ||
| 64 | + // 初始化直播云 | ||
| 65 | + [[CNLiveWebcastManager manager] initWithAppId:KAppId appKey:KAppKey]; | ||
| 66 | + // 初始化推流 | ||
| 67 | + _kitCN = [[CNLiveGPUStreamerKit alloc] initWithDefaultConfigWithActivityId:activityId channelId:@"iOStest" isHorizontalScreen:@"0"]; | ||
| 68 | + | ||
| 69 | + // _kitCN.activityName = @"iOS test"; | ||
| 70 | + // _kitCN.coverImgUrl = @"djfiwooa"; | ||
| 71 | + | ||
| 72 | + [self setStreamerCfg]; | ||
| 73 | + [self addObservers]; | ||
| 74 | + | ||
| 75 | + _startLiveBtn = [self addButton:@"开始直播" frame:CGRectMake(100, 40, 80, 40) action:@selector(startCapture:)]; | ||
| 76 | + [_startLiveBtn setTitle:@"开始直播" forState:UIControlStateNormal]; | ||
| 77 | + [_startLiveBtn setTitle:@"停止直播" forState:UIControlStateSelected]; | ||
| 78 | + | ||
| 79 | + [self addButton:@"关闭预览" frame:CGRectMake(10, 40, 80, 40) action:@selector(startPreview:)]; | ||
| 80 | + [self addButton:@"退出" frame:CGRectMake(190, 40, 80, 40) action:@selector(quit)]; | ||
| 81 | + [self addButton:@"美颜" frame:CGRectMake(10, 100, 80, 40) action:@selector(openFilter:)]; | ||
| 82 | + [self addButton:@"摄像头" frame:CGRectMake(100, 100, 80, 40) action:@selector(changeCamera:)]; | ||
| 83 | + [self addButton:@"闪光灯" frame:CGRectMake(190, 100, 80, 40) action:@selector(openFlash)]; | ||
| 84 | + | ||
| 85 | + UITapGestureRecognizer * singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap:)]; | ||
| 86 | + singleRecognizer.delegate = self; | ||
| 87 | + [self.captureView addGestureRecognizer:singleRecognizer]; | ||
| 88 | + | ||
| 89 | + UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchDetected:)]; | ||
| 90 | + [self.view addGestureRecognizer:pinch]; | ||
| 26 | } | 91 | } |
| 27 | 92 | ||
| 28 | -- (void)closeBtnClivk | ||
| 29 | -{ | 93 | +#pragma mark - initialization Streamer |
| 94 | +- (void)setStreamerCfg { | ||
| 95 | + //采集配置 | ||
| 96 | + _kitCN.capPreset = AVCaptureSessionPreset640x480; | ||
| 97 | + _kitCN.previewDimension = CGSizeMake(360, 640); | ||
| 98 | + _kitCN.streamDimension = CGSizeMake(360, 640); | ||
| 99 | + _kitCN.videoFPS = 15; | ||
| 100 | + _kitCN.cameraPosition = AVCaptureDevicePositionFront; | ||
| 101 | + | ||
| 102 | + //推流配置 | ||
| 103 | + _kitCN.streamerBase.videoCodec = CNLiveVideoCodec_AUTO; | ||
| 104 | + _kitCN.streamerBase.videoInitBitrate = 900; | ||
| 105 | + _kitCN.streamerBase.videoMaxBitrate = 900; | ||
| 106 | + _kitCN.streamerBase.videoMinBitrate = 300; | ||
| 107 | + _kitCN.streamerBase.maxKeyInterval = 2; | ||
| 108 | + _kitCN.streamerBase.audiokBPS = 48; | ||
| 109 | + | ||
| 110 | + // 如果有耳机,麦克风 | ||
| 111 | + if ([CNLiveAudioCapture isHeadsetPluggedIn]) { | ||
| 112 | + // 音频采集器 自动播放采集声音 | ||
| 113 | + [_kitCN.audioCapture setBPlayCapturedAudio:YES]; | ||
| 114 | + } | ||
| 115 | + | ||
| 116 | + //设置画面朝向 | ||
| 117 | + [_kitCN setVideoOrientationBy:[[UIApplication sharedApplication] statusBarOrientation]]; | ||
| 118 | + | ||
| 119 | + // 启动预览 | ||
| 120 | + [_kitCN startPreview:self.captureView]; | ||
| 121 | + | ||
| 122 | + //水印图片 | ||
| 123 | + _kitCN.watermark.logoPic = [UIImage imageNamed:@"互动电视180x180"]; | ||
| 124 | + _kitCN.watermark.logoRect = CGRectMake(0.8, 0.8, 50, 50); | ||
| 125 | + _kitCN.watermark.logoAlpha = 0.6; | ||
| 126 | + | ||
| 127 | + //水印文字 | ||
| 128 | + _kitCN.watermark.textLabel = [[UILabel alloc] init]; | ||
| 129 | + _kitCN.watermark.textLabel.text = [NSString stringWithFormat:@"cnlive"]; | ||
| 130 | + _kitCN.watermark.textLabel.font = [UIFont systemFontOfSize:8]; | ||
| 131 | + _kitCN.watermark.textRect = CGRectMake(0.78, 0.88, 0.2, 0.04); | ||
| 132 | + [_kitCN.watermark updateTextLabel]; | ||
| 133 | + | ||
| 134 | +} | ||
| 135 | + | ||
| 136 | +#pragma mark - GetMethod !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| 137 | +// 拍摄视图 | ||
| 138 | +- (UIView *)captureView { | ||
| 139 | + | ||
| 140 | + if (!_captureView) { | ||
| 141 | + _captureView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; | ||
| 142 | + _captureView.backgroundColor = [UIColor blackColor]; | ||
| 143 | + } | ||
| 144 | + return _captureView; | ||
| 145 | +} | ||
| 146 | + | ||
| 147 | + | ||
| 148 | +#pragma mark - UIButton Action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| 149 | + | ||
| 150 | +// 开始推流 | ||
| 151 | +- (void)startCapture:(UIButton *)button { | ||
| 152 | + | ||
| 153 | + button.selected = !button.selected; | ||
| 154 | + | ||
| 155 | + if (button.selected) { | ||
| 156 | + [_kitCN startStream:^{ | ||
| 157 | + NSLog(@"开启推流成功 ------- success"); | ||
| 158 | + } failure:^(NSDictionary *errorDic) { | ||
| 159 | + [self toast:errorDic[@"errorMessage"]]; | ||
| 160 | + _startLiveBtn.selected = NO; | ||
| 161 | + }]; | ||
| 162 | + }else{ | ||
| 163 | +// _stateLab.text = nil; | ||
| 164 | + [_kitCN stopStream]; | ||
| 165 | + } | ||
| 166 | +} | ||
| 167 | + | ||
| 168 | +// 开始 / 关闭 预览 | ||
| 169 | +- (void)startPreview:(UIButton *)button { | ||
| 170 | + | ||
| 171 | + button.selected = !button.selected; | ||
| 172 | + if (button.selected) { | ||
| 173 | + _startLiveBtn.enabled = NO; | ||
| 174 | + [button setTitle:@"开启预览" forState:UIControlStateNormal]; | ||
| 175 | + if (_kitCN.streamState == CNLiveStreamStateConnected) { | ||
| 176 | + [_kitCN stopStream]; | ||
| 177 | + _startLiveBtn.selected = NO; | ||
| 178 | + } | ||
| 179 | + [_kitCN stopPreview]; | ||
| 180 | + }else{ | ||
| 181 | + [_kitCN startPreview:self.captureView]; | ||
| 182 | + [button setTitle:@"关闭预览" forState:UIControlStateNormal]; | ||
| 183 | + _startLiveBtn.enabled = YES; | ||
| 184 | + } | ||
| 185 | +} | ||
| 186 | + | ||
| 187 | +// 退出 | ||
| 188 | +- (void)closeBtnClivk { | ||
| 189 | + | ||
| 190 | + if (_kitCN.streamState == CNLiveStreamStateConnected) { | ||
| 191 | + [_kitCN stopStream]; | ||
| 192 | + } | ||
| 193 | + if (_kitCN.captureState == CNLiveCaptureStateCapturing) { | ||
| 194 | + [_kitCN stopPreview]; | ||
| 195 | + } | ||
| 196 | + | ||
| 30 | [self dismissViewControllerAnimated:YES completion:nil]; | 197 | [self dismissViewControllerAnimated:YES completion:nil]; |
| 31 | } | 198 | } |
| 32 | 199 | ||
| 33 | -- (void)didReceiveMemoryWarning { | ||
| 34 | - [super didReceiveMemoryWarning]; | ||
| 35 | - // Dispose of any resources that can be recreated. | 200 | + |
| 201 | +#pragma mark - UIGestureRecognizer Action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| 202 | +//对焦与曝光 | ||
| 203 | +- (void)onTap:(UIGestureRecognizer *)sender | ||
| 204 | +{ | ||
| 205 | + CGPoint current = [sender locationInView:self.view]; | ||
| 206 | + CGPoint point = [self convertToPointOfInterestFromViewCoordinates:current]; | ||
| 207 | + [_kitCN exposureAtPoint:point]; | ||
| 208 | + [_kitCN focusAtPoint:point]; | ||
| 209 | +} | ||
| 210 | + | ||
| 211 | +//缩放 | ||
| 212 | +- (void)pinchDetected:(UIPinchGestureRecognizer *)recognizer{ | ||
| 213 | + if (recognizer.state == UIGestureRecognizerStateBegan) { | ||
| 214 | + _currentPinchZoomFactor = _kitCN.pinchZoomFactor; | ||
| 215 | + } | ||
| 216 | + CGFloat zoomFactor = _currentPinchZoomFactor * recognizer.scale;//当前触摸缩放因子*坐标比例 | ||
| 217 | + [_kitCN setPinchZoomFactor:zoomFactor]; | ||
| 36 | } | 218 | } |
| 37 | 219 | ||
| 38 | -/* | ||
| 39 | -#pragma mark - Navigation | 220 | +#pragma mark - notification !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
| 221 | +// 进入后台 | ||
| 222 | +- (void)enterBg { | ||
| 223 | + | ||
| 224 | + [_kitCN appEnterBackground]; | ||
| 225 | +} | ||
| 226 | +// 回到前台 | ||
| 227 | +- (void)becameActive { | ||
| 228 | + | ||
| 229 | + [_kitCN appBecomeActive]; | ||
| 230 | +} | ||
| 231 | +// 拍摄状态改变 | ||
| 232 | +- (void)captureStateChange { | ||
| 233 | + | ||
| 234 | + if ( _kitCN.captureState == CNLiveCaptureStateIdle){ | ||
| 235 | + //初始化时状态为空闲 | ||
| 236 | +// _stateLab.text = @"CNLiveCaptureStateIdle"; | ||
| 237 | + | ||
| 238 | + return; | ||
| 239 | + } | ||
| 240 | + else if (_kitCN.captureState == CNLiveCaptureStateCapturing ) { | ||
| 241 | + //设备工作中 | ||
| 242 | +// _stateLab.text = @"CNLiveCaptureStateCapturing"; | ||
| 243 | + | ||
| 244 | + return; | ||
| 245 | + } | ||
| 246 | + else if (_kitCN.captureState == CNLiveCaptureStateClosingCapture ) { | ||
| 247 | + //关闭采集设备中 | ||
| 248 | +// _stateLab.text = @"CNLiveCaptureStateClosingCapture"; | ||
| 249 | + | ||
| 250 | + return; | ||
| 251 | + } | ||
| 252 | + else if (_kitCN.captureState == CNLiveCaptureStateDevAuthDenied ) { | ||
| 253 | + //设备授权被拒绝 | ||
| 254 | + NSLog(@"---------CNLiveCaptureStateDevAuthDenied"); | ||
| 255 | +// _stateLab.text = @"camera/mic Authorization Denied"; | ||
| 256 | + | ||
| 257 | + return; | ||
| 258 | + } | ||
| 259 | + else if (_kitCN.captureState == CNLiveCaptureStateParameterError ) { | ||
| 260 | + // 参数错误,无法打开 | ||
| 261 | + NSLog(@"---------CNLiveCaptureStateParameterError"); | ||
| 262 | +// _stateLab.text = @"capture devices ParameterError"; | ||
| 263 | + | ||
| 264 | + return; | ||
| 265 | + } | ||
| 266 | + else if (_kitCN.captureState == CNLiveCaptureStateDevBusy ) { | ||
| 267 | + //设备正忙,请稍后尝试 | ||
| 268 | + NSLog(@"---------CNLiveCaptureStateDevBusy"); | ||
| 269 | +// _stateLab.text = @"device busy, try later"; | ||
| 270 | + | ||
| 271 | + } | ||
| 272 | +} | ||
| 273 | +// 推流状态改变 | ||
| 274 | +- (void)streamStateChange { | ||
| 275 | + | ||
| 276 | + if (_kitCN.streamState == CNLiveStreamStateIdle) { | ||
| 277 | + | ||
| 278 | + NSLog(@"---------CNLiveStreamStateIdle"); | ||
| 279 | +// _stateLab.text = @"CNLiveStreamStateIdle"; | ||
| 280 | + } | ||
| 281 | + | ||
| 282 | + if (_kitCN.streamState == CNLiveStreamStateConnected) { | ||
| 283 | + | ||
| 284 | + NSLog(@"---------CNLiveStreamStateConnected"); | ||
| 285 | +// _stateLab.text = [NSString stringWithFormat:@"CNLiveStreamStateConnected------%@",_hostURL]; | ||
| 286 | + } | ||
| 287 | + | ||
| 288 | + if (_kitCN.streamState == CNLiveStreamStateConnecting) { | ||
| 289 | + | ||
| 290 | + NSLog(@"---------CNLiveStreamStateConnecting"); | ||
| 291 | +// _stateLab.text = @"CNLiveStreamStateConnecting"; | ||
| 292 | + } | ||
| 293 | + | ||
| 294 | + //推流出错 | ||
| 295 | + if (_kitCN.streamState == CNLiveStreamStateError) { | ||
| 296 | + | ||
| 297 | + NSLog(@"---------CNLiveStreamStateError"); | ||
| 298 | + [self onStreamError]; | ||
| 299 | + } | ||
| 300 | + | ||
| 301 | + //断开推流 | ||
| 302 | + if ( _kitCN.streamState == CNLiveStreamStateDisconnecting) { | ||
| 303 | + | ||
| 304 | + NSLog(@"---------CNLiveStreamStateDisconnecting"); | ||
| 305 | +// _stateLab.text = @"CNLiveStreamStateDisconnecting"; | ||
| 306 | + } | ||
| 307 | + | ||
| 308 | + //结束推流成功 | ||
| 309 | + if ( _kitCN.streamState == CNLiveStopStreamSuccess) { | ||
| 310 | + | ||
| 311 | + NSLog(@"---------CNLiveStopStreamSuccess"); | ||
| 312 | +// _stateLab.text = @"CNLiveStopStreamSuccess"; | ||
| 313 | + } | ||
| 314 | +} | ||
| 315 | +// 推流失败 | ||
| 316 | +- (void)onStreamError { | ||
| 317 | + | ||
| 318 | + CNLiveStreamErrorCode err = _kitCN.streamErrorCode; | ||
| 319 | + | ||
| 320 | + NSLog(@"onErr: %lu ", (unsigned long) err); | ||
| 321 | + | ||
| 322 | + if ( CNLiveStreamErrorCode_CNLiveAUTHFAILED == err ) { | ||
| 323 | +// _stateLab.text = @"SDK auth failed, \npls check ak/sk"; | ||
| 324 | + } | ||
| 325 | + else if ( CNLiveStreamErrorCode_CODEC_OPEN_FAILED == err) { | ||
| 326 | +// _stateLab.text = @"Selected Codec not supported \n in this version"; | ||
| 327 | + } | ||
| 328 | + else if ( CNLiveStreamErrorCode_CONNECT_FAILED == err) { | ||
| 329 | +// _stateLab.text = @"Connecting error, pls check host url \nor network"; | ||
| 330 | + } | ||
| 331 | + else if ( CNLiveStreamErrorCode_CONNECT_BREAK == err) { | ||
| 332 | +// _stateLab.text = @"Connection break"; | ||
| 333 | + } | ||
| 334 | + else if ( CNLiveStreamErrorCode_ABNORMAL == err) { | ||
| 335 | +// _stateLab.text = @"CNLiveStreamErrorCode_ABNORMAL"; | ||
| 336 | + [self toast:@"推流异常中断~~"]; | ||
| 337 | + _startLiveBtn.selected = NO; | ||
| 338 | + | ||
| 339 | + } else if (err == CNLiveStreamErrorCode_CODEC_OPEN_FAILED) { | ||
| 340 | + NSLog(@"video codec open failed, try software codec"); | ||
| 341 | + // 换个编码类型重新尝试 | ||
| 342 | + _kitCN.streamerBase.videoCodec = CNLiveVideoCodec_VT264; | ||
| 343 | + [self tryReconnect]; | ||
| 344 | + } | ||
| 345 | + else { | ||
| 346 | + | ||
| 347 | + } | ||
| 348 | + | ||
| 349 | + // 断网重连 | ||
| 350 | + if (err == CNLiveStreamErrorCode_CONNECT_BREAK || err == CNLiveStreamErrorCode_AV_SYNC_ERROR) { | ||
| 351 | + [self tryReconnect]; | ||
| 352 | + } | ||
| 353 | + | ||
| 354 | +} | ||
| 40 | 355 | ||
| 41 | -// In a storyboard-based application, you will often want to do a little preparation before navigation | ||
| 42 | -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | ||
| 43 | - // Get the new view controller using [segue destinationViewController]. | ||
| 44 | - // Pass the selected object to the new view controller. | 356 | +// 重试 |
| 357 | +- (void) tryReconnect { | ||
| 358 | + | ||
| 359 | + dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)); | ||
| 360 | + dispatch_after(delay, dispatch_get_main_queue(), ^{ | ||
| 361 | + | ||
| 362 | + NSLog(@"try again"); | ||
| 363 | + | ||
| 364 | + [_kitCN stopStream]; | ||
| 365 | + | ||
| 366 | + [_kitCN startStream:^{ | ||
| 367 | + NSLog(@"开启推流成功 ------- success"); | ||
| 368 | + _startLiveBtn.selected = YES; | ||
| 369 | + | ||
| 370 | + } failure:^(NSDictionary *errorDic) { | ||
| 371 | + [self toast:errorDic[@"errorMessage"]]; | ||
| 372 | + _startLiveBtn.selected = NO; | ||
| 373 | + }]; | ||
| 374 | + | ||
| 375 | + }); | ||
| 376 | +} | ||
| 377 | + | ||
| 378 | +// 提示框 | ||
| 379 | +- (void)toast:(NSString*)message | ||
| 380 | +{ | ||
| 381 | + | ||
| 382 | + UIAlertView *toast = [[UIAlertView alloc] initWithTitle:nil | ||
| 383 | + message:message | ||
| 384 | + delegate:nil | ||
| 385 | + cancelButtonTitle:nil | ||
| 386 | + otherButtonTitles:nil, nil]; | ||
| 387 | + [toast show]; | ||
| 388 | + double duration = 2.5; | ||
| 389 | + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | ||
| 390 | + [toast dismissWithClickedButtonIndex:0 animated:NO]; | ||
| 391 | + }); | ||
| 392 | +} | ||
| 393 | + | ||
| 394 | + | ||
| 395 | +// 将UI的坐标转换成相机坐标 | ||
| 396 | +- (CGPoint)convertToPointOfInterestFromViewCoordinates:(CGPoint)viewCoordinates | ||
| 397 | +{ | ||
| 398 | + CGPoint pointOfInterest = CGPointMake(.5f, .5f); | ||
| 399 | + CGSize frameSize = self.view.frame.size; | ||
| 400 | + CGSize apertureSize = [_kitCN captureDimension]; | ||
| 401 | + CGPoint point = viewCoordinates; | ||
| 402 | + CGFloat apertureRatio = apertureSize.height / apertureSize.width; | ||
| 403 | + CGFloat viewRatio = frameSize.width / frameSize.height; | ||
| 404 | + CGFloat xc = .5f; | ||
| 405 | + CGFloat yc = .5f; | ||
| 406 | + | ||
| 407 | + if (viewRatio > apertureRatio) { | ||
| 408 | + CGFloat y2 = frameSize.height; | ||
| 409 | + CGFloat x2 = frameSize.height * apertureRatio; | ||
| 410 | + CGFloat x1 = frameSize.width; | ||
| 411 | + CGFloat blackBar = (x1 - x2) / 2; | ||
| 412 | + if (point.x >= blackBar && point.x <= blackBar + x2) { | ||
| 413 | + xc = point.y / y2; | ||
| 414 | + yc = 1.f - ((point.x - blackBar) / x2); | ||
| 415 | + } | ||
| 416 | + }else { | ||
| 417 | + CGFloat y2 = frameSize.width / apertureRatio; | ||
| 418 | + CGFloat y1 = frameSize.height; | ||
| 419 | + CGFloat x2 = frameSize.width; | ||
| 420 | + CGFloat blackBar = (y1 - y2) / 2; | ||
| 421 | + if (point.y >= blackBar && point.y <= blackBar + y2) { | ||
| 422 | + xc = ((point.y - blackBar) / y2); | ||
| 423 | + yc = 1.f - (point.x / x2); | ||
| 424 | + } | ||
| 425 | + } | ||
| 426 | + pointOfInterest = CGPointMake(xc, yc); | ||
| 427 | + return pointOfInterest; | ||
| 428 | +} | ||
| 429 | + | ||
| 430 | +#pragma mark - Action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| 431 | + | ||
| 432 | +- (void)addObservers { | ||
| 433 | + | ||
| 434 | + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(captureStateChange) name:CNLiveCaptureStateDidChangeNotification object:nil]; | ||
| 435 | + | ||
| 436 | + [[NSNotificationCenter defaultCenter] addObserver:self | ||
| 437 | + selector:@selector(streamStateChange) | ||
| 438 | + name:CNLiveStreamStateDidChangeNotification | ||
| 439 | + object:nil]; | ||
| 440 | + | ||
| 441 | + [[NSNotificationCenter defaultCenter] addObserver:self | ||
| 442 | + selector:@selector(enterBg) | ||
| 443 | + name:UIApplicationDidEnterBackgroundNotification | ||
| 444 | + object:nil]; | ||
| 445 | + | ||
| 446 | + [[NSNotificationCenter defaultCenter] addObserver:self | ||
| 447 | + selector:@selector(becameActive) | ||
| 448 | + name:UIApplicationDidBecomeActiveNotification | ||
| 449 | + object:nil]; | ||
| 450 | +} | ||
| 451 | + | ||
| 452 | +- (UIButton *)addButton:(NSString*)title | ||
| 453 | + frame:(CGRect)frame | ||
| 454 | + action:(SEL)action { | ||
| 455 | + UIButton * button; | ||
| 456 | + button = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 457 | + button.frame = frame; | ||
| 458 | + [button setTitle: title forState: UIControlStateNormal]; | ||
| 459 | + [button addTarget:self action:action forControlEvents:UIControlEventTouchUpInside]; | ||
| 460 | + button.titleLabel.font = [UIFont systemFontOfSize:15]; | ||
| 461 | + [button setTitleColor:[UIColor colorWithRed:23/255.0 green:110/255.0 blue:254/255.0 alpha:1] forState:UIControlStateNormal]; | ||
| 462 | + button.layer.cornerRadius = 10; | ||
| 463 | + button.layer.masksToBounds = YES; | ||
| 464 | + button.layer.borderColor = [UIColor blackColor].CGColor; | ||
| 465 | + button.layer.borderWidth = 1; | ||
| 466 | + [self.captureView addSubview:button]; | ||
| 467 | + return button; | ||
| 468 | + | ||
| 469 | +} | ||
| 470 | + | ||
| 471 | +- (void)didReceiveMemoryWarning { | ||
| 472 | + [super didReceiveMemoryWarning]; | ||
| 473 | + // Dispose of any resources that can be recreated. | ||
| 45 | } | 474 | } |
| 46 | -*/ | ||
| 47 | 475 | ||
| 48 | @end | 476 | @end |
LiveVideoCloud/LiveVideoCloud/UtilKits/DeviceInfo/ZXDeviceInfo.h
| @@ -17,6 +17,10 @@ | @@ -17,6 +17,10 @@ | ||
| 17 | #define SCREEN_HEIGHT [ZXDeviceInfo mainScreenHeight] | 17 | #define SCREEN_HEIGHT [ZXDeviceInfo mainScreenHeight] |
| 18 | #endif | 18 | #endif |
| 19 | 19 | ||
| 20 | +#ifndef SCREEN_RECT | ||
| 21 | +#define SCREEN_RECT CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) | ||
| 22 | +#endif | ||
| 23 | + | ||
| 20 | @interface ZXDeviceInfo : NSObject | 24 | @interface ZXDeviceInfo : NSObject |
| 21 | 25 | ||
| 22 | /** | 26 | /** |
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/AppIcon.appiconset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/AppIcon.appiconset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_bluepig.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_bluepig.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_bluepig.imageset/ic_menu_bluepig.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_bluepig.imageset/ic_menu_bluepig.png
26.1 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_bluepig2.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_bluepig2.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_bluepig2.imageset/ic_menu_bluepig2.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_bluepig2.imageset/ic_menu_bluepig2.png
24.2 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_greenpig.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_greenpig.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_greenpig.imageset/ic_menu_greenpig.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_greenpig.imageset/ic_menu_greenpig.png
26.9 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_greenpig2.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_greenpig2.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_greenpig2.imageset/ic_menu_greenpig2.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_greenpig2.imageset/ic_menu_greenpig2.png
24.5 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_pinkpig.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_pinkpig.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_pinkpig.imageset/ic_menu_pinkpig.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_pinkpig.imageset/ic_menu_pinkpig.png
24.3 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_pinkpig2.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_pinkpig2.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_pinkpig2.imageset/ic_menu_pinkpig2.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_pinkpig2.imageset/ic_menu_pinkpig2.png
26.1 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_purplepig.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_purplepig.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_purplepig.imageset/ic_menu_purplepig.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_purplepig.imageset/ic_menu_purplepig.png
26.3 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_purplepig2.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_purplepig2.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_purplepig2.imageset/ic_menu_purplepig2.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_purplepig2.imageset/ic_menu_purplepig2.png
24.4 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_yellowpig.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_yellowpig.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_yellowpig.imageset/ic_menu_yellowpig.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_yellowpig.imageset/ic_menu_yellowpig.png
26.2 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_yellowpig2.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_yellowpig2.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/ic_menu_yellowpig2.imageset/ic_menu_yellowpig2.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/ic_menu_yellowpig2.imageset/ic_menu_yellowpig2.png
24.4 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/love.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/love.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/love.imageset/love@2x.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/love.imageset/love@2x.png
1.9 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/Interaction/love.imageset/love@3x.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Animation/love.imageset/love@3x.png
2.99 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Click on the comment.imageset/Click on the comment.png
0 → 100644
5.72 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Click on the comment.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 | + "scale" : "3x" | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "idiom" : "iphone", | ||
| 17 | + "scale" : "1x" | ||
| 18 | + }, | ||
| 19 | + { | ||
| 20 | + "idiom" : "iphone", | ||
| 21 | + "scale" : "2x" | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "idiom" : "iphone", | ||
| 25 | + "filename" : "Click on the comment.png", | ||
| 26 | + "scale" : "3x" | ||
| 27 | + } | ||
| 28 | + ], | ||
| 29 | + "info" : { | ||
| 30 | + "version" : 1, | ||
| 31 | + "author" : "xcode" | ||
| 32 | + } | ||
| 33 | +} | ||
| 0 | \ No newline at end of file | 34 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Close the open.imageset/Close the open.png
0 → 100644
1.59 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Close the open.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" : "Close the open.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/Assets.xcassets/tabBar/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Contents.json
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveChatGiftNormal.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 | + "scale" : "3x" | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "idiom" : "iphone", | ||
| 17 | + "scale" : "1x" | ||
| 18 | + }, | ||
| 19 | + { | ||
| 20 | + "idiom" : "iphone", | ||
| 21 | + "scale" : "2x" | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "idiom" : "iphone", | ||
| 25 | + "filename" : "LiveChatGiftNormal.png", | ||
| 26 | + "scale" : "3x" | ||
| 27 | + } | ||
| 28 | + ], | ||
| 29 | + "info" : { | ||
| 30 | + "version" : 1, | ||
| 31 | + "author" : "xcode" | ||
| 32 | + } | ||
| 33 | +} | ||
| 0 | \ No newline at end of file | 34 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveChatGiftNormal.imageset/LiveChatGiftNormal.png
0 → 100644
5.07 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveChatGiftTouch.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 | + "scale" : "3x" | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "idiom" : "iphone", | ||
| 17 | + "scale" : "1x" | ||
| 18 | + }, | ||
| 19 | + { | ||
| 20 | + "idiom" : "iphone", | ||
| 21 | + "scale" : "2x" | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "idiom" : "iphone", | ||
| 25 | + "filename" : "LiveChatGiftTouch.png", | ||
| 26 | + "scale" : "3x" | ||
| 27 | + } | ||
| 28 | + ], | ||
| 29 | + "info" : { | ||
| 30 | + "version" : 1, | ||
| 31 | + "author" : "xcode" | ||
| 32 | + } | ||
| 33 | +} | ||
| 0 | \ No newline at end of file | 34 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveChatGiftTouch.imageset/LiveChatGiftTouch.png
0 → 100644
5.23 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveChatNormal.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 | + "scale" : "3x" | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "idiom" : "iphone", | ||
| 17 | + "scale" : "1x" | ||
| 18 | + }, | ||
| 19 | + { | ||
| 20 | + "idiom" : "iphone", | ||
| 21 | + "scale" : "2x" | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "idiom" : "iphone", | ||
| 25 | + "filename" : "LiveChatNormal.png", | ||
| 26 | + "scale" : "3x" | ||
| 27 | + } | ||
| 28 | + ], | ||
| 29 | + "info" : { | ||
| 30 | + "version" : 1, | ||
| 31 | + "author" : "xcode" | ||
| 32 | + } | ||
| 33 | +} | ||
| 0 | \ No newline at end of file | 34 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveChatNormal.imageset/LiveChatNormal.png
0 → 100644
6.08 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveChatTouch.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 | + "scale" : "3x" | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "idiom" : "iphone", | ||
| 17 | + "scale" : "1x" | ||
| 18 | + }, | ||
| 19 | + { | ||
| 20 | + "idiom" : "iphone", | ||
| 21 | + "scale" : "2x" | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "idiom" : "iphone", | ||
| 25 | + "filename" : "LiveChatTouch.png", | ||
| 26 | + "scale" : "3x" | ||
| 27 | + } | ||
| 28 | + ], | ||
| 29 | + "info" : { | ||
| 30 | + "version" : 1, | ||
| 31 | + "author" : "xcode" | ||
| 32 | + } | ||
| 33 | +} | ||
| 0 | \ No newline at end of file | 34 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveChatTouch.imageset/LiveChatTouch.png
0 → 100644
6.19 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveCloseNormal.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 | + "scale" : "3x" | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "idiom" : "iphone", | ||
| 17 | + "scale" : "1x" | ||
| 18 | + }, | ||
| 19 | + { | ||
| 20 | + "idiom" : "iphone", | ||
| 21 | + "scale" : "2x" | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "idiom" : "iphone", | ||
| 25 | + "filename" : "LiveCloseNormal.png", | ||
| 26 | + "scale" : "3x" | ||
| 27 | + } | ||
| 28 | + ], | ||
| 29 | + "info" : { | ||
| 30 | + "version" : 1, | ||
| 31 | + "author" : "xcode" | ||
| 32 | + } | ||
| 33 | +} | ||
| 0 | \ No newline at end of file | 34 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveCloseNormal.imageset/LiveCloseNormal.png
0 → 100644
5.67 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveCloseTouch.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 | + "scale" : "3x" | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "idiom" : "iphone", | ||
| 17 | + "scale" : "1x" | ||
| 18 | + }, | ||
| 19 | + { | ||
| 20 | + "idiom" : "iphone", | ||
| 21 | + "scale" : "2x" | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "idiom" : "iphone", | ||
| 25 | + "filename" : "LiveCloseTouch.png", | ||
| 26 | + "scale" : "3x" | ||
| 27 | + } | ||
| 28 | + ], | ||
| 29 | + "info" : { | ||
| 30 | + "version" : 1, | ||
| 31 | + "author" : "xcode" | ||
| 32 | + } | ||
| 33 | +} | ||
| 0 | \ No newline at end of file | 34 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/LiveCloseTouch.imageset/LiveCloseTouch.png
0 → 100644
5.62 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/comments.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 | + "scale" : "3x" | ||
| 14 | + }, | ||
| 15 | + { | ||
| 16 | + "idiom" : "iphone", | ||
| 17 | + "scale" : "1x" | ||
| 18 | + }, | ||
| 19 | + { | ||
| 20 | + "idiom" : "iphone", | ||
| 21 | + "scale" : "2x" | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "idiom" : "iphone", | ||
| 25 | + "filename" : "comments.png", | ||
| 26 | + "scale" : "3x" | ||
| 27 | + } | ||
| 28 | + ], | ||
| 29 | + "info" : { | ||
| 30 | + "version" : 1, | ||
| 31 | + "author" : "xcode" | ||
| 32 | + } | ||
| 33 | +} | ||
| 0 | \ No newline at end of file | 34 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/comments.imageset/comments.png
0 → 100644
5.88 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/private chat.imageset/1 2.png
0 → 100644
7.63 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/private chat.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "1 2.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/bottom_shadow.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "bottom_shadow.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/bottom_shadow.imageset/bottom_shadow.png
0 → 100644
1.12 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/dot.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" : "dot@3x.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/dot.imageset/dot@3x.png
0 → 100644
335 Bytes
LiveVideoCloud/LiveVideoCloud/animation.xcassets/fullscreen.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" : "fullscreen@3x.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/fullscreen.imageset/fullscreen@3x.png
0 → 100644
1.18 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/nonfullscreen.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" : "nonfullscreen@3x.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/nonfullscreen.imageset/nonfullscreen@3x.png
0 → 100644
1.19 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/pause.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" : "pause@3x.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/pause.imageset/pause@3x.png
0 → 100644
188 Bytes
LiveVideoCloud/LiveVideoCloud/animation.xcassets/play.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" : "play@3x.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/play.imageset/play@3x.png
0 → 100644
660 Bytes
LiveVideoCloud/LiveVideoCloud/animation.xcassets/play_back.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "play_back.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/play_back.imageset/play_back.png
0 → 100644
1.47 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/tabBar/Begin to live.imageset/Begin to live.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/Begin to live.imageset/Begin to live.png
11.6 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/tabBar/Begin to live.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/Begin to live.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/Contents.json
0 → 100644
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/tabBar/home page-click on.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/home page-click on.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/tabBar/home page-click on.imageset/home page-click on.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/home page-click on.imageset/home page-click on.png
2.93 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/tabBar/home page.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/home page.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/tabBar/home page.imageset/home page.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/home page.imageset/home page.png
2.68 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/tabBar/my-click on.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/my-click on.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/tabBar/my-click on.imageset/my-click on.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/my-click on.imageset/my-click on.png
3.01 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/tabBar/my.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/my.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/tabBar/my.imageset/my.png renamed to LiveVideoCloud/LiveVideoCloud/animation.xcassets/tabBar/my.imageset/my.png
2.89 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/top_shadow.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "top_shadow.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/top_shadow.imageset/top_shadow.png
0 → 100644
2.95 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/返回.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" : "返回@3x.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/返回.imageset/返回@3x.png
0 → 100644
1.35 KB