Commit f015ec56bbbd0eaa81a70ab7483c93bcf5d9d40a

Authored by 朱林
2 parents be2ab2b8 7b964133

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 29 81FB5B031E7A251300F98E1D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81FB5B021E7A251300F98E1D /* Assets.xcassets */; };
30 30 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */; };
31 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 34 D2029B941E6EAAA50027CD92 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2029B921E6EAAA50027CD92 /* LaunchScreen.storyboard */; };
33 35 D2029B9F1E6EAAA50027CD92 /* LiveVideoCloudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B9E1E6EAAA50027CD92 /* LiveVideoCloudTests.m */; };
34 36 D2029BAA1E6EAAA50027CD92 /* LiveVideoCloudUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029BA91E6EAAA50027CD92 /* LiveVideoCloudUITests.m */; };
... ... @@ -125,6 +127,11 @@
125 127 D2029D091E6EAE2E0027CD92 /* Foundation+Log.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029CF21E6EAE2E0027CD92 /* Foundation+Log.m */; };
126 128 D2029D0A1E6EAE2E0027CD92 /* ZXServerUrl.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029CFE1E6EAE2E0027CD92 /* ZXServerUrl.m */; };
127 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 135 D2575C461E76857100E3A8FC /* LVCAnimationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C451E76857100E3A8FC /* LVCAnimationManager.m */; };
129 136 D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C481E7685DE00E3A8FC /* UIView+Bubbling.m */; };
130 137 D2575C671E76A25400E3A8FC /* LVCInteractionController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C661E76A25400E3A8FC /* LVCInteractionController.m */; };
... ... @@ -217,6 +224,8 @@
217 224 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SevenSwitch.m; sourceTree = "<group>"; };
218 225 D2029B811E6EAAA50027CD92 /* LiveVideoCloud.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LiveVideoCloud.app; sourceTree = BUILT_PRODUCTS_DIR; };
219 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 229 D2029B931E6EAAA50027CD92 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
221 230 D2029B951E6EAAA50027CD92 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
222 231 D2029B9A1E6EAAA50027CD92 /* LiveVideoCloudTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LiveVideoCloudTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
... ... @@ -425,6 +434,16 @@
425 434 D2029CFF1E6EAE2E0027CD92 /* UtilKits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UtilKits.h; sourceTree = "<group>"; };
426 435 D2029D121E6EAF8D0027CD92 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
427 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 447 D2575C441E76857100E3A8FC /* LVCAnimationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCAnimationManager.h; sourceTree = "<group>"; };
429 448 D2575C451E76857100E3A8FC /* LVCAnimationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCAnimationManager.m; sourceTree = "<group>"; };
430 449 D2575C481E7685DE00E3A8FC /* UIView+Bubbling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+Bubbling.m"; sourceTree = "<group>"; };
... ... @@ -574,6 +593,7 @@
574 593 D2029BD01E6EADE10027CD92 /* Classes */,
575 594 D2029CD11E6EADE70027CD92 /* HttpService */,
576 595 D2029CD71E6EAE140027CD92 /* Resource */,
  596 + D2029B901E6EAAA50027CD92 /* animation.xcassets */,
577 597 D2029CD61E6EADFB0027CD92 /* PrefixHeader.pch */,
578 598 D2029B841E6EAAA50027CD92 /* Supporting Files */,
579 599 );
... ... @@ -1159,9 +1179,65 @@
1159 1179 path = AppDelegate;
1160 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 1233 D2575C431E76846900E3A8FC /* InteractionSections */ = {
1163 1234 isa = PBXGroup;
1164 1235 children = (
  1236 + D22830F91E77C2D900627701 /* BottomToolView */,
  1237 + D22830F81E77C2A700627701 /* TopToolView */,
  1238 + D22830F61E77C26C00627701 /* Chat */,
  1239 + D22830EF1E778C0F00627701 /* LiveBaseView.h */,
  1240 + D22830F01E778C0F00627701 /* LiveBaseView.m */,
1165 1241 D2575C651E76A25400E3A8FC /* LVCInteractionController.h */,
1166 1242 D2575C661E76A25400E3A8FC /* LVCInteractionController.m */,
1167 1243 D2575C681E76A42B00E3A8FC /* Gift */,
... ... @@ -1186,7 +1262,9 @@
1186 1262 children = (
1187 1263 D2575C691E76A45400E3A8FC /* LVCGiftManager.h */,
1188 1264 D2575C6A1E76A45400E3A8FC /* LVCGiftManager.m */,
  1265 + D22830F51E77C24900627701 /* GiftViews */,
1189 1266 D2575C6C1E76A4F300E3A8FC /* GiftResource */,
  1267 + D22831061E77D8D500627701 /* GiftModel */,
1190 1268 );
1191 1269 path = Gift;
1192 1270 sourceTree = "<group>";
... ... @@ -1443,6 +1521,7 @@
1443 1521 D2029CC91E6EADE10027CD92 /* SVProgressHUD.bundle in Resources */,
1444 1522 D2575C801E76A4F300E3A8FC /* resource.bundle in Resources */,
1445 1523 D2029B941E6EAAA50027CD92 /* LaunchScreen.storyboard in Resources */,
  1524 + D2029B911E6EAAA50027CD92 /* animation.xcassets in Resources */,
1446 1525 D2029CB01E6EADE10027CD92 /* MJRefresh.bundle in Resources */,
1447 1526 D2575C7C1E76A4F300E3A8FC /* NHFighterView.nib in Resources */,
1448 1527 812E50541E7699DC004F5FCD /* KSYGPUResource.bundle in Resources */,
... ... @@ -1471,6 +1550,7 @@
1471 1550 buildActionMask = 2147483647;
1472 1551 files = (
1473 1552 D2029CC31E6EADE10027CD92 /* UIImageView+HighlightedWebCache.m in Sources */,
  1553 + D22830FF1E77C69E00627701 /* GiftListView.m in Sources */,
1474 1554 D2029CC01E6EADE10027CD92 /* UIImage+GIF.m in Sources */,
1475 1555 D2029BCF1E6EADD70027CD92 /* ZXTabBarController.m in Sources */,
1476 1556 D2029D071E6EAE2E0027CD92 /* ZXConst.m in Sources */,
... ... @@ -1482,6 +1562,7 @@
1482 1562 D2029CA01E6EADE10027CD92 /* NSObject+MJProperty.m in Sources */,
1483 1563 D2029CB51E6EADE10027CD92 /* SDiOSVersion.m in Sources */,
1484 1564 D2029C9C1E6EADE10027CD92 /* MJPropertyType.m in Sources */,
  1565 + D22831091E77D8D500627701 /* GiftModel.m in Sources */,
1485 1566 D2029CCD1E6EADE10027CD92 /* SearchModel.m in Sources */,
1486 1567 810B65051E779B1F00133E15 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */,
1487 1568 D2029CCB1E6EADE10027CD92 /* SVRadialGradientLayer.m in Sources */,
... ... @@ -1495,6 +1576,7 @@
1495 1576 D2575C7A1E76A4F300E3A8FC /* NHCarViews.m in Sources */,
1496 1577 D2029CBC1E6EADE10027CD92 /* SDWebImageDownloaderOperation.m in Sources */,
1497 1578 D2029CA51E6EADE10027CD92 /* MJRefreshFooter.m in Sources */,
  1579 + D22830FC1E77C2D900627701 /* BottomToolView.m in Sources */,
1498 1580 810B65061E779B1F00133E15 /* View+MASAdditions.m in Sources */,
1499 1581 D2029D161E6EB00D0027CD92 /* AppDelegate.m in Sources */,
1500 1582 D2029CB71E6EADE10027CD92 /* NSData+ImageContentType.m in Sources */,
... ... @@ -1519,6 +1601,7 @@
1519 1601 D2029CC71E6EADE10027CD92 /* SVIndefiniteAnimatedView.m in Sources */,
1520 1602 D2029CA31E6EADE10027CD92 /* MJRefreshBackFooter.m in Sources */,
1521 1603 D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */,
  1604 + D22831021E77D83C00627701 /* GiftModelView.m in Sources */,
1522 1605 D2029CA61E6EADE10027CD92 /* MJRefreshHeader.m in Sources */,
1523 1606 D2029CC41E6EADE10027CD92 /* UIImageView+WebCache.m in Sources */,
1524 1607 D2029CC81E6EADE10027CD92 /* SVProgressAnimatedView.m in Sources */,
... ... @@ -1561,6 +1644,7 @@
1561 1644 D2029CCA1E6EADE10027CD92 /* SVProgressHUD.m in Sources */,
1562 1645 D2029CA81E6EADE10027CD92 /* MJRefreshAutoNormalFooter.m in Sources */,
1563 1646 D2029C891E6EADE10027CD92 /* AFSecurityPolicy.m in Sources */,
  1647 + D22830F11E778C0F00627701 /* LiveBaseView.m in Sources */,
1564 1648 D2029CBA1E6EADE10027CD92 /* SDWebImageDecoder.m in Sources */,
1565 1649 8112D4311E7927A5002E00F6 /* LVCPlayerLoadingView.m in Sources */,
1566 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
  1 +//
  2 +// GiftModel.m
  3 +// LiveVideoCloud
  4 +//
  5 +// Created by 张旭 on 2017/3/14.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import "GiftModel.h"
  10 +
  11 +@implementation GiftModel
  12 +
  13 +@end
... ...
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftResource/NHPlaneViews.m
... ... @@ -39,7 +39,7 @@
39 39  
40 40 CGPathAddQuadCurveToPoint(path, NULL, endPoint.x, endPoint.y, endPoint.x, endPoint.y);
41 41 position.path = path;
42   - position.duration = 4.f;
  42 + position.duration = 5.f;
43 43 position.speed = 0.6;
44 44 position.removedOnCompletion = NO;
45 45 position.fillMode = kCAFillModeForwards;
... ...
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftViews/GiftListView.h 0 → 100644
  1 +//
  2 +// GiftListView.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 +@interface GiftListView : BaseView
  12 +
  13 +@end
... ...
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 23 //数组中放CGRect数据,CGRect的x和y分别作为控制点的x和y,CGRect的width和height作为结束点的x和y
24 24 //方法如下:数组内的每个元素代码一个控制点和结束点
25 25 NSMutableArray *pointArrs = [[NSMutableArray alloc] init];
26   - CGFloat width = [UIScreen mainScreen].bounds.size.width / 2;
  26 + CGFloat width = SCREEN_WIDTH / 2;
27 27 [pointArrs addObject:NSStringFromCGRect(CGRectMake(width, 300, width, 300))];
28 28 [pointArrs addObject:NSStringFromCGRect(CGRectMake(width, 300, width, 300))];
29 29 car.curveControlAndEndPoints = pointArrs;
... ... @@ -41,6 +41,10 @@
41 41 case GiftTypePlane:
42 42 {
43 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 48 [plane addAnimationsMoveToPoint:CGPointMake(SCREEN_WIDTH, 100) endPoint:CGPointMake(-500, 410)];
45 49 [toView addSubview:plane];
46 50 }
... ...
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/LVCInteractionController.m
... ... @@ -7,10 +7,12 @@
7 7 //
8 8  
9 9 #import "LVCInteractionController.h"
10   -#import "LVCGiftManager.h"
  10 +#import "LiveBaseView.h"
11 11  
12 12 @interface LVCInteractionController ()
13 13  
  14 +@property (nonatomic ,strong) LiveBaseView * _Nullable liveBaseView;
  15 +
14 16 @end
15 17  
16 18 @implementation LVCInteractionController
... ... @@ -18,12 +20,22 @@
18 20 - (void)viewDidLoad {
19 21 [super viewDidLoad];
20 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 41 - (void)didReceiveMemoryWarning {
... ...
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/LiveBaseView.h 0 → 100644
  1 +//
  2 +// LiveBaseView.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 +@interface LiveBaseView : BaseView
  12 +
  13 +@end
... ...
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 7 //
8 8  
9 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 27 @end
14 28  
15 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 50 - (void)viewDidLoad {
18 51 [super viewDidLoad];
19   - // Do any additional setup after loading the view.
  52 +
20 53 self.view.backgroundColor = [UIColor blueColor];
21 54  
  55 + [self.view addSubview:self.captureView];
  56 +
22 57 UIButton *closeBtn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH - 50, 30, 50, 30)];
23 58 [closeBtn setTitle:@"关闭" forState:UIControlStateNormal];
24 59 [closeBtn addTarget:self action:@selector(closeBtnClivk) forControlEvents:UIControlEventTouchUpInside];
25 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 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 476 @end
... ...
LiveVideoCloud/LiveVideoCloud/UtilKits/DeviceInfo/ZXDeviceInfo.h
... ... @@ -17,6 +17,10 @@
17 17 #define SCREEN_HEIGHT [ZXDeviceInfo mainScreenHeight]
18 18 #endif
19 19  
  20 +#ifndef SCREEN_RECT
  21 +#define SCREEN_RECT CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)
  22 +#endif
  23 +
20 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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
  1 +{
  2 + "info" : {
  3 + "version" : 1,
  4 + "author" : "xcode"
  5 + }
  6 +}
0 7 \ No newline at end of file
... ...
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 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 22 \ No newline at end of file
... ...
LiveVideoCloud/LiveVideoCloud/animation.xcassets/返回.imageset/返回@3x.png 0 → 100644

1.35 KB