Commit be2ab2b8100b84b913b83ef2055eb914b6824bf9
1 parent
69c75123
直播页
Showing
44 changed files
with
1461 additions
and
165 deletions
LiveVideoCloud/LiveVideoCloud.xcodeproj/project.pbxproj
| ... | ... | @@ -19,14 +19,16 @@ |
| 19 | 19 | 810B65051E779B1F00133E15 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 810B64F81E779B1F00133E15 /* NSLayoutConstraint+MASDebugAdditions.m */; }; |
| 20 | 20 | 810B65061E779B1F00133E15 /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 810B64FA1E779B1F00133E15 /* View+MASAdditions.m */; }; |
| 21 | 21 | 810B65071E779B1F00133E15 /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 810B64FD1E779B1F00133E15 /* ViewController+MASAdditions.m */; }; |
| 22 | + 810B650A1E77B39D00133E15 /* LVCFullScreenPlayerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */; }; | |
| 23 | + 8112D4311E7927A5002E00F6 /* LVCPlayerLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */; }; | |
| 22 | 24 | 812E50531E7699DC004F5FCD /* CNLivePlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */; }; |
| 23 | 25 | 812E50541E7699DC004F5FCD /* KSYGPUResource.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 812E50511E7699DC004F5FCD /* KSYGPUResource.bundle */; }; |
| 24 | 26 | 812E50551E7699E9004F5FCD /* CNLiveMsgTools.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 812E504F1E7699DC004F5FCD /* CNLiveMsgTools.framework */; }; |
| 25 | 27 | 812E50561E7699E9004F5FCD /* CNLiveMsgTools.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 812E504F1E7699DC004F5FCD /* CNLiveMsgTools.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; |
| 26 | 28 | 812E50581E7699E9004F5FCD /* CNLivePlayerSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; |
| 29 | + 81FB5B031E7A251300F98E1D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 81FB5B021E7A251300F98E1D /* Assets.xcassets */; }; | |
| 30 | + 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */; }; | |
| 27 | 31 | D2029B861E6EAAA50027CD92 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B851E6EAAA50027CD92 /* main.m */; }; |
| 28 | - D2029B8F1E6EAAA50027CD92 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2029B8D1E6EAAA50027CD92 /* Main.storyboard */; }; | |
| 29 | - D2029B911E6EAAA50027CD92 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2029B901E6EAAA50027CD92 /* Assets.xcassets */; }; | |
| 30 | 32 | D2029B941E6EAAA50027CD92 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D2029B921E6EAAA50027CD92 /* LaunchScreen.storyboard */; }; |
| 31 | 33 | D2029B9F1E6EAAA50027CD92 /* LiveVideoCloudTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B9E1E6EAAA50027CD92 /* LiveVideoCloudTests.m */; }; |
| 32 | 34 | D2029BAA1E6EAAA50027CD92 /* LiveVideoCloudUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029BA91E6EAAA50027CD92 /* LiveVideoCloudUITests.m */; }; |
| ... | ... | @@ -203,13 +205,18 @@ |
| 203 | 205 | 810B64FB1E779B1F00133E15 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "View+MASShorthandAdditions.h"; sourceTree = "<group>"; }; |
| 204 | 206 | 810B64FC1E779B1F00133E15 /* ViewController+MASAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ViewController+MASAdditions.h"; sourceTree = "<group>"; }; |
| 205 | 207 | 810B64FD1E779B1F00133E15 /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ViewController+MASAdditions.m"; sourceTree = "<group>"; }; |
| 208 | + 810B65081E77B39D00133E15 /* LVCFullScreenPlayerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCFullScreenPlayerController.h; sourceTree = "<group>"; }; | |
| 209 | + 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCFullScreenPlayerController.m; sourceTree = "<group>"; }; | |
| 210 | + 8112D42F1E7927A5002E00F6 /* LVCPlayerLoadingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCPlayerLoadingView.h; sourceTree = "<group>"; }; | |
| 211 | + 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCPlayerLoadingView.m; sourceTree = "<group>"; }; | |
| 206 | 212 | 812E504F1E7699DC004F5FCD /* CNLiveMsgTools.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveMsgTools.framework; sourceTree = "<group>"; }; |
| 207 | 213 | 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLivePlayerSDK.framework; sourceTree = "<group>"; }; |
| 208 | 214 | 812E50511E7699DC004F5FCD /* KSYGPUResource.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = KSYGPUResource.bundle; sourceTree = "<group>"; }; |
| 215 | + 81FB5B021E7A251300F98E1D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; | |
| 216 | + 81FB5B3A1E7A6FFC00F98E1D /* SevenSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SevenSwitch.h; sourceTree = "<group>"; }; | |
| 217 | + 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SevenSwitch.m; sourceTree = "<group>"; }; | |
| 209 | 218 | D2029B811E6EAAA50027CD92 /* LiveVideoCloud.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LiveVideoCloud.app; sourceTree = BUILT_PRODUCTS_DIR; }; |
| 210 | 219 | D2029B851E6EAAA50027CD92 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; |
| 211 | - D2029B8E1E6EAAA50027CD92 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | |
| 212 | - D2029B901E6EAAA50027CD92 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; | |
| 213 | 220 | D2029B931E6EAAA50027CD92 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; |
| 214 | 221 | D2029B951E6EAAA50027CD92 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; |
| 215 | 222 | D2029B9A1E6EAAA50027CD92 /* LiveVideoCloudTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LiveVideoCloudTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; |
| ... | ... | @@ -529,6 +536,15 @@ |
| 529 | 536 | path = CNLiveSDK; |
| 530 | 537 | sourceTree = "<group>"; |
| 531 | 538 | }; |
| 539 | + 81FB5B391E7A6FFC00F98E1D /* SevenSwitch */ = { | |
| 540 | + isa = PBXGroup; | |
| 541 | + children = ( | |
| 542 | + 81FB5B3A1E7A6FFC00F98E1D /* SevenSwitch.h */, | |
| 543 | + 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */, | |
| 544 | + ); | |
| 545 | + path = SevenSwitch; | |
| 546 | + sourceTree = "<group>"; | |
| 547 | + }; | |
| 532 | 548 | D2029B781E6EAAA50027CD92 = { |
| 533 | 549 | isa = PBXGroup; |
| 534 | 550 | children = ( |
| ... | ... | @@ -558,7 +574,6 @@ |
| 558 | 574 | D2029BD01E6EADE10027CD92 /* Classes */, |
| 559 | 575 | D2029CD11E6EADE70027CD92 /* HttpService */, |
| 560 | 576 | D2029CD71E6EAE140027CD92 /* Resource */, |
| 561 | - D2029B901E6EAAA50027CD92 /* Assets.xcassets */, | |
| 562 | 577 | D2029CD61E6EADFB0027CD92 /* PrefixHeader.pch */, |
| 563 | 578 | D2029B841E6EAAA50027CD92 /* Supporting Files */, |
| 564 | 579 | ); |
| ... | ... | @@ -568,8 +583,8 @@ |
| 568 | 583 | D2029B841E6EAAA50027CD92 /* Supporting Files */ = { |
| 569 | 584 | isa = PBXGroup; |
| 570 | 585 | children = ( |
| 586 | + 81FB5B021E7A251300F98E1D /* Assets.xcassets */, | |
| 571 | 587 | D2029B921E6EAAA50027CD92 /* LaunchScreen.storyboard */, |
| 572 | - D2029B8D1E6EAAA50027CD92 /* Main.storyboard */, | |
| 573 | 588 | D2029B851E6EAAA50027CD92 /* main.m */, |
| 574 | 589 | D2029B951E6EAAA50027CD92 /* Info.plist */, |
| 575 | 590 | ); |
| ... | ... | @@ -654,6 +669,7 @@ |
| 654 | 669 | D2029BD41E6EADE10027CD92 /* SDK */ = { |
| 655 | 670 | isa = PBXGroup; |
| 656 | 671 | children = ( |
| 672 | + 81FB5B391E7A6FFC00F98E1D /* SevenSwitch */, | |
| 657 | 673 | 810B64E41E779B1F00133E15 /* Masonry */, |
| 658 | 674 | D2029BD51E6EADE10027CD92 /* AFNetworking */, |
| 659 | 675 | D2029BF81E6EADE10027CD92 /* MBProgressHUD */, |
| ... | ... | @@ -1254,6 +1270,8 @@ |
| 1254 | 1270 | D2888DB31E6EC154003A77C8 /* HomeViewController.m */, |
| 1255 | 1271 | 810B64E11E779AFE00133E15 /* LVCLivePlayerController.h */, |
| 1256 | 1272 | 810B64E21E779AFE00133E15 /* LVCLivePlayerController.m */, |
| 1273 | + 810B65081E77B39D00133E15 /* LVCFullScreenPlayerController.h */, | |
| 1274 | + 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */, | |
| 1257 | 1275 | ); |
| 1258 | 1276 | path = Controller; |
| 1259 | 1277 | sourceTree = "<group>"; |
| ... | ... | @@ -1270,6 +1288,8 @@ |
| 1270 | 1288 | children = ( |
| 1271 | 1289 | 810B64DE1E779AE900133E15 /* LVCPlayer.h */, |
| 1272 | 1290 | 810B64DF1E779AE900133E15 /* LVCPlayer.m */, |
| 1291 | + 8112D42F1E7927A5002E00F6 /* LVCPlayerLoadingView.h */, | |
| 1292 | + 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */, | |
| 1273 | 1293 | ); |
| 1274 | 1294 | path = View; |
| 1275 | 1295 | sourceTree = "<group>"; |
| ... | ... | @@ -1418,15 +1438,14 @@ |
| 1418 | 1438 | files = ( |
| 1419 | 1439 | D2029C971E6EADE10027CD92 /* Info.plist in Resources */, |
| 1420 | 1440 | D2575C7F1E76A4F300E3A8FC /* NHPlaneViews.xib in Resources */, |
| 1441 | + 81FB5B031E7A251300F98E1D /* Assets.xcassets in Resources */, | |
| 1421 | 1442 | D2575C7B1E76A4F300E3A8FC /* NHCarViews.xib in Resources */, |
| 1422 | 1443 | D2029CC91E6EADE10027CD92 /* SVProgressHUD.bundle in Resources */, |
| 1423 | 1444 | D2575C801E76A4F300E3A8FC /* resource.bundle in Resources */, |
| 1424 | 1445 | D2029B941E6EAAA50027CD92 /* LaunchScreen.storyboard in Resources */, |
| 1425 | - D2029B911E6EAAA50027CD92 /* Assets.xcassets in Resources */, | |
| 1426 | 1446 | D2029CB01E6EADE10027CD92 /* MJRefresh.bundle in Resources */, |
| 1427 | 1447 | D2575C7C1E76A4F300E3A8FC /* NHFighterView.nib in Resources */, |
| 1428 | 1448 | 812E50541E7699DC004F5FCD /* KSYGPUResource.bundle in Resources */, |
| 1429 | - D2029B8F1E6EAAA50027CD92 /* Main.storyboard in Resources */, | |
| 1430 | 1449 | ); |
| 1431 | 1450 | runOnlyForDeploymentPostprocessing = 0; |
| 1432 | 1451 | }; |
| ... | ... | @@ -1543,6 +1562,7 @@ |
| 1543 | 1562 | D2029CA81E6EADE10027CD92 /* MJRefreshAutoNormalFooter.m in Sources */, |
| 1544 | 1563 | D2029C891E6EADE10027CD92 /* AFSecurityPolicy.m in Sources */, |
| 1545 | 1564 | D2029CBA1E6EADE10027CD92 /* SDWebImageDecoder.m in Sources */, |
| 1565 | + 8112D4311E7927A5002E00F6 /* LVCPlayerLoadingView.m in Sources */, | |
| 1546 | 1566 | D2029D081E6EAE2E0027CD92 /* ZXDeviceInfo.m in Sources */, |
| 1547 | 1567 | D2029CC21E6EADE10027CD92 /* UIImage+WebP.m in Sources */, |
| 1548 | 1568 | D2029BCD1E6EADD70027CD92 /* BaseViewController.m in Sources */, |
| ... | ... | @@ -1551,9 +1571,11 @@ |
| 1551 | 1571 | D2029D001E6EAE2E0027CD92 /* NSNumber+ScaleHeight.m in Sources */, |
| 1552 | 1572 | D2888D9E1E6EBF1B003A77C8 /* LVCLiveViewController.m in Sources */, |
| 1553 | 1573 | D2029C951E6EADE10027CD92 /* UIWebView+AFNetworking.m in Sources */, |
| 1574 | + 810B650A1E77B39D00133E15 /* LVCFullScreenPlayerController.m in Sources */, | |
| 1554 | 1575 | D2575C6B1E76A45400E3A8FC /* LVCGiftManager.m in Sources */, |
| 1555 | 1576 | D2029CBD1E6EADE10027CD92 /* SDWebImageManager.m in Sources */, |
| 1556 | 1577 | D2029CB41E6EADE10027CD92 /* UIView+MJExtension.m in Sources */, |
| 1578 | + 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */, | |
| 1557 | 1579 | D2029CA91E6EADE10027CD92 /* MJRefreshAutoStateFooter.m in Sources */, |
| 1558 | 1580 | D2029D061E6EAE2E0027CD92 /* UIView+Extension.m in Sources */, |
| 1559 | 1581 | D2029C9D1E6EADE10027CD92 /* NSObject+MJClass.m in Sources */, |
| ... | ... | @@ -1600,14 +1622,6 @@ |
| 1600 | 1622 | /* End PBXTargetDependency section */ |
| 1601 | 1623 | |
| 1602 | 1624 | /* Begin PBXVariantGroup section */ |
| 1603 | - D2029B8D1E6EAAA50027CD92 /* Main.storyboard */ = { | |
| 1604 | - isa = PBXVariantGroup; | |
| 1605 | - children = ( | |
| 1606 | - D2029B8E1E6EAAA50027CD92 /* Base */, | |
| 1607 | - ); | |
| 1608 | - name = Main.storyboard; | |
| 1609 | - sourceTree = "<group>"; | |
| 1610 | - }; | |
| 1611 | 1625 | D2029B921E6EAAA50027CD92 /* LaunchScreen.storyboard */ = { |
| 1612 | 1626 | isa = PBXVariantGroup; |
| 1613 | 1627 | children = ( |
| ... | ... | @@ -1726,7 +1740,7 @@ |
| 1726 | 1740 | "$(inherited)", |
| 1727 | 1741 | "$(PROJECT_DIR)/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftResource", |
| 1728 | 1742 | ); |
| 1729 | - PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.zhangxu.LiveVideoCloud; | |
| 1743 | + PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.video; | |
| 1730 | 1744 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 1731 | 1745 | }; |
| 1732 | 1746 | name = Debug; |
| ... | ... | @@ -1748,7 +1762,7 @@ |
| 1748 | 1762 | "$(inherited)", |
| 1749 | 1763 | "$(PROJECT_DIR)/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftResource", |
| 1750 | 1764 | ); |
| 1751 | - PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.zhangxu.LiveVideoCloud; | |
| 1765 | + PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.video; | |
| 1752 | 1766 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 1753 | 1767 | }; |
| 1754 | 1768 | name = Release; | ... | ... |
LiveVideoCloud/LiveVideoCloud/AppCustoms/Main/ZXTabBarController.m
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/Barrage input.imageset/Barrage input.png
0 → 100644
3.78 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/Barrage input.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "filename" : "Barrage input.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/Assets.xcassets/player/Contents.json
0 → 100644
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/bottom_shadow.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/bottom_shadow.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/bottom_shadow.imageset/bottom_shadow.png renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/bottom_shadow.imageset/bottom_shadow.png
1.12 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/dot.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/dot.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/dot.imageset/dot@3x.png renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/dot.imageset/dot@3x.png
335 Bytes
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/fullscreen.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/fullscreen.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/fullscreen.imageset/fullscreen@3x.png renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/fullscreen.imageset/fullscreen@3x.png
1.18 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/nonfullscreen.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/nonfullscreen.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/nonfullscreen.imageset/nonfullscreen@3x.png renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/nonfullscreen.imageset/nonfullscreen@3x.png
1.19 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/pause.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/pause.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/pause.imageset/pause@3x.png renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/pause.imageset/pause@3x.png
188 Bytes
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/placeholderImage.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "filename" : "load_03.png", | |
| 6 | + "scale" : "1x" | |
| 7 | + }, | |
| 8 | + { | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "idiom" : "universal", | |
| 14 | + "scale" : "3x" | |
| 15 | + } | |
| 16 | + ], | |
| 17 | + "info" : { | |
| 18 | + "version" : 1, | |
| 19 | + "author" : "xcode" | |
| 20 | + } | |
| 21 | +} | |
| 0 | 22 | \ No newline at end of file | ... | ... |
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/placeholderImage.imageset/load_03.png
0 → 100644
3.63 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/play.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/play.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/play.imageset/play@3x.png renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/play.imageset/play@3x.png
660 Bytes
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/play_back.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/play_back.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/play_back.imageset/play_back.png renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/play_back.imageset/play_back.png
1.47 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/top_shadow.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/top_shadow.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/top_shadow.imageset/top_shadow.png renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/top_shadow.imageset/top_shadow.png
2.95 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/全屏加载图.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "filename" : "全屏加载图.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/Assets.xcassets/player/全屏加载图.imageset/全屏加载图.png
0 → 100644
23.1 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/弹off.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "filename" : "弹off.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/Assets.xcassets/player/弹off.imageset/弹off.png
0 → 100644
1.49 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/弹on.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "filename" : "弹on.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/Assets.xcassets/player/弹on.imageset/弹on.png
0 → 100644
1.26 KB
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/返回.imageset/Contents.json renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/返回.imageset/Contents.json
LiveVideoCloud/LiveVideoCloud/Assets.xcassets/返回.imageset/返回@3x.png renamed to LiveVideoCloud/LiveVideoCloud/Assets.xcassets/player/返回.imageset/返回@3x.png
1.35 KB
LiveVideoCloud/LiveVideoCloud/Base.lproj/Main.storyboard deleted
100644 → 0
| 1 | -<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |
| 2 | -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11134" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r"> | |
| 3 | - <dependencies> | |
| 4 | - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11106"/> | |
| 5 | - <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
| 6 | - </dependencies> | |
| 7 | - <scenes> | |
| 8 | - <!--View Controller--> | |
| 9 | - <scene sceneID="tne-QT-ifu"> | |
| 10 | - <objects> | |
| 11 | - <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController"> | |
| 12 | - <layoutGuides> | |
| 13 | - <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> | |
| 14 | - <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> | |
| 15 | - </layoutGuides> | |
| 16 | - <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> | |
| 17 | - <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | |
| 18 | - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |
| 19 | - <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
| 20 | - </view> | |
| 21 | - </viewController> | |
| 22 | - <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> | |
| 23 | - </objects> | |
| 24 | - </scene> | |
| 25 | - </scenes> | |
| 26 | -</document> |
LiveVideoCloud/LiveVideoCloud/Classes/SDK/SevenSwitch/SevenSwitch.h
0 → 100755
| 1 | +// | |
| 2 | +// SevenSwitch | |
| 3 | +// | |
| 4 | +// Created by Benjamin Vogelzang on 6/10/13. | |
| 5 | +// Copyright (c) 2013 Ben Vogelzang. All rights reserved. | |
| 6 | +// | |
| 7 | +// Permission is hereby granted, free of charge, to any person obtaining a copy | |
| 8 | +// of this software and associated documentation files (the "Software"), to deal | |
| 9 | +// in the Software without restriction, including without limitation the rights | |
| 10 | +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| 11 | +// copies of the Software, and to permit persons to whom the Software is | |
| 12 | +// furnished to do so, subject to the following conditions: | |
| 13 | +// | |
| 14 | +// The above copyright notice and this permission notice shall be included in | |
| 15 | +// all copies or substantial portions of the Software. | |
| 16 | +// | |
| 17 | +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| 18 | +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| 19 | +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| 20 | +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| 21 | +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| 22 | +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
| 23 | +// THE SOFTWARE. | |
| 24 | + | |
| 25 | +#import <UIKit/UIKit.h> | |
| 26 | + | |
| 27 | +@protocol SevenSwitchDelegate <NSObject> | |
| 28 | + | |
| 29 | +- (void)sevenSwitchChanged:(BOOL)change; | |
| 30 | + | |
| 31 | +@end | |
| 32 | + | |
| 33 | +@interface SevenSwitch : UIControl | |
| 34 | + | |
| 35 | +@property (nonatomic, weak) id<SevenSwitchDelegate> delegate; | |
| 36 | + | |
| 37 | +/* | |
| 38 | + * Set (without animation) whether the switch is on or off | |
| 39 | + */ | |
| 40 | +@property (nonatomic, assign) BOOL on; | |
| 41 | + | |
| 42 | + | |
| 43 | +/* | |
| 44 | + * Sets the background color when the switch is off. | |
| 45 | + * Defaults to clear color. | |
| 46 | + */ | |
| 47 | +@property (nonatomic, strong) UIColor *inactiveColor; | |
| 48 | + | |
| 49 | +/* | |
| 50 | + * Sets the background color that shows when the switch off and actively being touched. | |
| 51 | + * Defaults to light gray. | |
| 52 | + */ | |
| 53 | +@property (nonatomic, strong) UIColor *activeColor; | |
| 54 | + | |
| 55 | +/* | |
| 56 | + * Sets the background color that shows when the switch is on. | |
| 57 | + * Defaults to green. | |
| 58 | + */ | |
| 59 | +@property (nonatomic, strong) UIColor *onColor; | |
| 60 | + | |
| 61 | +/* | |
| 62 | + * Sets the border color that shows when the switch is off. Defaults to light gray. | |
| 63 | + */ | |
| 64 | +@property (nonatomic, strong) UIColor *borderColor; | |
| 65 | + | |
| 66 | +/* | |
| 67 | + * Sets the knob color. Defaults to white. | |
| 68 | + */ | |
| 69 | +@property (nonatomic, strong) UIColor *knobColor; | |
| 70 | + | |
| 71 | +@property (nonatomic, strong) UIImage *knobOnImage; | |
| 72 | +@property (nonatomic, strong) UIImage *knobOffImage; | |
| 73 | +@property (nonatomic, strong) UIColor *knobOnColor; | |
| 74 | +@property (nonatomic, strong) UIColor *knobOffColor; | |
| 75 | + | |
| 76 | +/* | |
| 77 | + * Sets the shadow color of the knob. Defaults to gray. | |
| 78 | + */ | |
| 79 | +@property (nonatomic, strong) UIColor *shadowColor; | |
| 80 | + | |
| 81 | + | |
| 82 | +/* | |
| 83 | + * Sets whether or not the switch edges are rounded. | |
| 84 | + * Set to NO to get a stylish square switch. | |
| 85 | + * Defaults to YES. | |
| 86 | + */ | |
| 87 | +@property (nonatomic, assign) BOOL isRounded; | |
| 88 | + | |
| 89 | +@property (nonatomic, assign) CGFloat cornerRadius; | |
| 90 | + | |
| 91 | + | |
| 92 | +/* | |
| 93 | + * Sets the image that shows when the switch is on. | |
| 94 | + * The image is centered in the area not covered by the knob. | |
| 95 | + * Make sure to size your images appropriately. | |
| 96 | + */ | |
| 97 | +@property (nonatomic, strong) UIImage *onImage; | |
| 98 | + | |
| 99 | +/* | |
| 100 | + * Sets the image that shows when the switch is off. | |
| 101 | + * The image is centered in the area not covered by the knob. | |
| 102 | + * Make sure to size your images appropriately. | |
| 103 | + */ | |
| 104 | +@property (nonatomic, strong) UIImage *offImage; | |
| 105 | + | |
| 106 | + | |
| 107 | +/* | |
| 108 | + * Set whether the switch is on or off. Optionally animate the change | |
| 109 | + */ | |
| 110 | +- (void)setOn:(BOOL)on animated:(BOOL)animated; | |
| 111 | + | |
| 112 | +/* | |
| 113 | + * Detects whether the switch is on or off | |
| 114 | + * | |
| 115 | + * @return BOOL YES if switch is on. NO if switch is off | |
| 116 | + */ | |
| 117 | +- (BOOL)isOn; | |
| 118 | + | |
| 119 | +@end | ... | ... |
LiveVideoCloud/LiveVideoCloud/Classes/SDK/SevenSwitch/SevenSwitch.m
0 → 100755
| 1 | +// | |
| 2 | +// SevenSwitch | |
| 3 | +// | |
| 4 | +// Created by Benjamin Vogelzang on 6/10/13. | |
| 5 | +// Copyright (c) 2013 Ben Vogelzang. All rights reserved. | |
| 6 | +// | |
| 7 | +// Permission is hereby granted, free of charge, to any person obtaining a copy | |
| 8 | +// of this software and associated documentation files (the "Software"), to deal | |
| 9 | +// in the Software without restriction, including without limitation the rights | |
| 10 | +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| 11 | +// copies of the Software, and to permit persons to whom the Software is | |
| 12 | +// furnished to do so, subject to the following conditions: | |
| 13 | +// | |
| 14 | +// The above copyright notice and this permission notice shall be included in | |
| 15 | +// all copies or substantial portions of the Software. | |
| 16 | +// | |
| 17 | +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| 18 | +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| 19 | +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| 20 | +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| 21 | +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| 22 | +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
| 23 | +// THE SOFTWARE. | |
| 24 | + | |
| 25 | +#import "SevenSwitch.h" | |
| 26 | +#import <QuartzCore/QuartzCore.h> | |
| 27 | + | |
| 28 | +@interface SevenSwitch () { | |
| 29 | + UIView *background; | |
| 30 | + UIImageView *knob; | |
| 31 | + UIImageView *onImageView; | |
| 32 | + UIImageView *offImageView; | |
| 33 | + double startTime; | |
| 34 | + BOOL isAnimating; | |
| 35 | +} | |
| 36 | + | |
| 37 | +- (void)showOn:(BOOL)animated; | |
| 38 | +- (void)showOff:(BOOL)animated; | |
| 39 | +- (void)setup; | |
| 40 | + | |
| 41 | +@end | |
| 42 | + | |
| 43 | + | |
| 44 | +@implementation SevenSwitch | |
| 45 | + | |
| 46 | +@synthesize inactiveColor, activeColor, onColor, borderColor, knobColor, shadowColor; | |
| 47 | +@synthesize onImage, offImage; | |
| 48 | +@synthesize isRounded; | |
| 49 | +@synthesize on; | |
| 50 | + | |
| 51 | + | |
| 52 | +#pragma mark init Methods | |
| 53 | + | |
| 54 | +- (id)init { | |
| 55 | + self = [super initWithFrame:CGRectMake(0, 0, 50, 30)]; | |
| 56 | + if (self) { | |
| 57 | + [self setup]; | |
| 58 | + } | |
| 59 | + return self; | |
| 60 | +} | |
| 61 | + | |
| 62 | +- (id)initWithCoder:(NSCoder *)aDecoder { | |
| 63 | + self = [super initWithCoder:aDecoder]; | |
| 64 | + if (self) { | |
| 65 | + [self setup]; | |
| 66 | + } | |
| 67 | + return self; | |
| 68 | +} | |
| 69 | + | |
| 70 | +- (id)initWithFrame:(CGRect)frame | |
| 71 | +{ | |
| 72 | + // use the default values if CGRectZero frame is set | |
| 73 | + CGRect initialFrame; | |
| 74 | + if (CGRectIsEmpty(frame)) { | |
| 75 | + initialFrame = CGRectMake(0, 0, 50, 30); | |
| 76 | + } | |
| 77 | + else { | |
| 78 | + initialFrame = frame; | |
| 79 | + } | |
| 80 | + self = [super initWithFrame:initialFrame]; | |
| 81 | + if (self) { | |
| 82 | + [self setup]; | |
| 83 | + } | |
| 84 | + return self; | |
| 85 | +} | |
| 86 | + | |
| 87 | + | |
| 88 | +/** | |
| 89 | + * Setup the individual elements of the switch and set default values | |
| 90 | + */ | |
| 91 | +- (void)setup { | |
| 92 | + | |
| 93 | + // default values | |
| 94 | + self.on = NO; | |
| 95 | + self.isRounded = YES; | |
| 96 | + self.inactiveColor = [UIColor clearColor]; | |
| 97 | + self.activeColor = [UIColor colorWithRed:0.89f green:0.89f blue:0.89f alpha:1.00f]; | |
| 98 | + self.onColor = [UIColor colorWithRed:0.30f green:0.85f blue:0.39f alpha:1.00f]; | |
| 99 | + self.borderColor = [UIColor colorWithRed:0.89f green:0.89f blue:0.91f alpha:1.00f]; | |
| 100 | + self.knobColor = [UIColor whiteColor]; | |
| 101 | + self.shadowColor = [UIColor grayColor]; | |
| 102 | + self.cornerRadius = 2; | |
| 103 | + | |
| 104 | + // background | |
| 105 | + background = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; | |
| 106 | + background.backgroundColor = [UIColor clearColor]; | |
| 107 | + background.layer.cornerRadius = self.frame.size.height * 0.5; | |
| 108 | +// background.layer.borderColor = self.borderColor.CGColor; | |
| 109 | +// background.layer.borderWidth = 1.0; | |
| 110 | + background.userInteractionEnabled = NO; | |
| 111 | + [self addSubview:background]; | |
| 112 | + | |
| 113 | + // images | |
| 114 | + onImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width - self.frame.size.height, self.frame.size.height)]; | |
| 115 | + onImageView.alpha = 0; | |
| 116 | + onImageView.contentMode = UIViewContentModeCenter; | |
| 117 | + [self addSubview:onImageView]; | |
| 118 | + | |
| 119 | + offImageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.frame.size.height, 0, self.frame.size.width - self.frame.size.height, self.frame.size.height)]; | |
| 120 | + offImageView.alpha = 1.0; | |
| 121 | + offImageView.contentMode = UIViewContentModeCenter; | |
| 122 | + [self addSubview:offImageView]; | |
| 123 | + | |
| 124 | + // knob | |
| 125 | + knob = [[UIImageView alloc] initWithFrame:CGRectMake(1, 1, self.frame.size.height - 2, self.frame.size.height - 2)]; | |
| 126 | + knob.backgroundColor = self.knobColor; | |
| 127 | + knob.layer.cornerRadius = (self.frame.size.height * 0.5) - 1; | |
| 128 | + knob.layer.shadowColor = self.shadowColor.CGColor; | |
| 129 | + knob.layer.shadowRadius = 2.0; | |
| 130 | + knob.layer.shadowOpacity = 0.5; | |
| 131 | + knob.layer.shadowOffset = CGSizeMake(0, 3); | |
| 132 | + knob.layer.masksToBounds = NO; | |
| 133 | + knob.userInteractionEnabled = NO; | |
| 134 | + [self addSubview:knob]; | |
| 135 | + | |
| 136 | + isAnimating = NO; | |
| 137 | +} | |
| 138 | + | |
| 139 | + | |
| 140 | +#pragma mark Touch Tracking | |
| 141 | + | |
| 142 | +- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { | |
| 143 | + [super beginTrackingWithTouch:touch withEvent:event]; | |
| 144 | + | |
| 145 | + // start timer to detect tap later in endTrackingWithTouch:withEvent: | |
| 146 | + startTime = [[NSDate date] timeIntervalSince1970]; | |
| 147 | + | |
| 148 | + // make the knob larger and animate to the correct color | |
| 149 | + CGFloat activeKnobWidth = self.bounds.size.height - 2 + 5; | |
| 150 | + isAnimating = YES; | |
| 151 | + [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState animations:^{ | |
| 152 | + if (self.on) { | |
| 153 | + knob.frame = CGRectMake(self.bounds.size.width - (activeKnobWidth + 1), knob.frame.origin.y, activeKnobWidth, knob.frame.size.height); | |
| 154 | + background.backgroundColor = self.onColor; | |
| 155 | + knob.image = self.knobOnImage; | |
| 156 | + knob.backgroundColor = self.knobOnColor; | |
| 157 | + } | |
| 158 | + else { | |
| 159 | + knob.frame = CGRectMake(knob.frame.origin.x, knob.frame.origin.y, activeKnobWidth, knob.frame.size.height); | |
| 160 | + background.backgroundColor = self.activeColor; | |
| 161 | + knob.image = self.knobOffImage; | |
| 162 | + knob.backgroundColor = self.knobOffColor; | |
| 163 | + } | |
| 164 | + } completion:^(BOOL finished) { | |
| 165 | + isAnimating = NO; | |
| 166 | + }]; | |
| 167 | + | |
| 168 | + return YES; | |
| 169 | +} | |
| 170 | + | |
| 171 | +- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { | |
| 172 | + [super continueTrackingWithTouch:touch withEvent:event]; | |
| 173 | + | |
| 174 | + // Get touch location | |
| 175 | + CGPoint lastPoint = [touch locationInView:self]; | |
| 176 | + | |
| 177 | + // update the switch to the correct visuals depending on if | |
| 178 | + // they moved their touch to the right or left side of the switch | |
| 179 | + if (lastPoint.x > self.bounds.size.width * 0.5) | |
| 180 | + [self showOn:YES]; | |
| 181 | + else | |
| 182 | + [self showOff:YES]; | |
| 183 | + | |
| 184 | + return YES; | |
| 185 | +} | |
| 186 | + | |
| 187 | +- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { | |
| 188 | + [super endTrackingWithTouch:touch withEvent:event]; | |
| 189 | + | |
| 190 | + // capture time to see if this was a tap action | |
| 191 | + double endTime = [[NSDate date] timeIntervalSince1970]; | |
| 192 | + double difference = endTime - startTime; | |
| 193 | + BOOL previousValue = self.on; | |
| 194 | + | |
| 195 | + // determine if the user tapped the switch or has held it for longer | |
| 196 | + if (difference <= 0.2) { | |
| 197 | + CGFloat normalKnobWidth = self.bounds.size.height - 2; | |
| 198 | + knob.frame = CGRectMake(knob.frame.origin.x, knob.frame.origin.y, normalKnobWidth, knob.frame.size.height); | |
| 199 | + knob.image = self.knobOffImage; | |
| 200 | + knob.backgroundColor = self.knobOffColor; | |
| 201 | + | |
| 202 | + [self setOn:!self.on animated:YES]; | |
| 203 | + } | |
| 204 | + else { | |
| 205 | + // Get touch location | |
| 206 | + CGPoint lastPoint = [touch locationInView:self]; | |
| 207 | + | |
| 208 | + // update the switch to the correct value depending on if | |
| 209 | + // their touch finished on the right or left side of the switch | |
| 210 | + if (lastPoint.x > self.bounds.size.width * 0.5) | |
| 211 | + [self setOn:YES animated:YES]; | |
| 212 | + else | |
| 213 | + [self setOn:NO animated:YES]; | |
| 214 | + } | |
| 215 | + | |
| 216 | + if (previousValue != self.on) | |
| 217 | + [self sendActionsForControlEvents:UIControlEventValueChanged]; | |
| 218 | +} | |
| 219 | + | |
| 220 | +- (void)cancelTrackingWithEvent:(UIEvent *)event { | |
| 221 | + [super cancelTrackingWithEvent:event]; | |
| 222 | + | |
| 223 | + // just animate back to the original value | |
| 224 | + if (self.on) | |
| 225 | + [self showOn:YES]; | |
| 226 | + else | |
| 227 | + [self showOff:YES]; | |
| 228 | +} | |
| 229 | + | |
| 230 | + | |
| 231 | +- (void)layoutSubviews { | |
| 232 | + [super layoutSubviews]; | |
| 233 | + | |
| 234 | + if (!isAnimating) { | |
| 235 | + CGRect frame = self.frame; | |
| 236 | + | |
| 237 | + // background | |
| 238 | + background.frame = CGRectMake(0, 0, frame.size.width, frame.size.height); | |
| 239 | + background.layer.cornerRadius = self.isRounded ? frame.size.height * 0.5 : self.cornerRadius; | |
| 240 | + | |
| 241 | + // images | |
| 242 | + onImageView.frame = CGRectMake(0, 0, frame.size.width - frame.size.height, frame.size.height); | |
| 243 | + offImageView.frame = CGRectMake(frame.size.height, 0, frame.size.width - frame.size.height, frame.size.height); | |
| 244 | + | |
| 245 | + // knob | |
| 246 | + CGFloat normalKnobWidth = frame.size.height - 2; | |
| 247 | + if (self.on) | |
| 248 | + { | |
| 249 | + knob.frame = CGRectMake(frame.size.width - (normalKnobWidth + 1), 1, frame.size.height - 2, normalKnobWidth); | |
| 250 | + knob.image = self.knobOnImage; | |
| 251 | + knob.backgroundColor = self.knobOnColor; | |
| 252 | + } | |
| 253 | + else | |
| 254 | + { | |
| 255 | + knob.frame = CGRectMake(1, 1, normalKnobWidth, normalKnobWidth); | |
| 256 | + knob.image = self.knobOffImage; | |
| 257 | + knob.backgroundColor = self.knobOffColor; | |
| 258 | + } | |
| 259 | + | |
| 260 | + knob.layer.cornerRadius = self.isRounded ? (frame.size.height * 0.5) - 1 : 2; | |
| 261 | + } | |
| 262 | +} | |
| 263 | + | |
| 264 | + | |
| 265 | +#pragma mark Setters | |
| 266 | + | |
| 267 | +/* | |
| 268 | + * Sets the background color when the switch is off. | |
| 269 | + * Defaults to clear color. | |
| 270 | + */ | |
| 271 | +- (void)setInactiveColor:(UIColor *)color { | |
| 272 | + inactiveColor = color; | |
| 273 | + if (!self.on && !self.isTracking) | |
| 274 | + background.backgroundColor = color; | |
| 275 | +} | |
| 276 | + | |
| 277 | +/* | |
| 278 | + * Sets the background color that shows when the switch is on. | |
| 279 | + * Defaults to green. | |
| 280 | + */ | |
| 281 | +- (void)setOnColor:(UIColor *)color { | |
| 282 | + onColor = color; | |
| 283 | + if (self.on && !self.isTracking) { | |
| 284 | + background.backgroundColor = color; | |
| 285 | +// background.layer.borderColor = color.CGColor; | |
| 286 | + } | |
| 287 | +} | |
| 288 | + | |
| 289 | +/* | |
| 290 | + * Sets the border color that shows when the switch is off. Defaults to light gray. | |
| 291 | + */ | |
| 292 | +- (void)setBorderColor:(UIColor *)color { | |
| 293 | + borderColor = color; | |
| 294 | +// if (!self.on) | |
| 295 | +// background.layer.borderColor = color.CGColor; | |
| 296 | +} | |
| 297 | + | |
| 298 | +/* | |
| 299 | + * Sets the knob color. Defaults to white. | |
| 300 | + */ | |
| 301 | +- (void)setKnobColor:(UIColor *)color { | |
| 302 | + knobColor = color; | |
| 303 | + knob.backgroundColor = color; | |
| 304 | +} | |
| 305 | + | |
| 306 | +/* | |
| 307 | + * Sets the shadow color of the knob. Defaults to gray. | |
| 308 | + */ | |
| 309 | +- (void)setShadowColor:(UIColor *)color { | |
| 310 | + shadowColor = color; | |
| 311 | + knob.layer.shadowColor = color.CGColor; | |
| 312 | +} | |
| 313 | + | |
| 314 | + | |
| 315 | +/* | |
| 316 | + * Sets the image that shows when the switch is on. | |
| 317 | + * The image is centered in the area not covered by the knob. | |
| 318 | + * Make sure to size your images appropriately. | |
| 319 | + */ | |
| 320 | +- (void)setOnImage:(UIImage *)image { | |
| 321 | + onImage = image; | |
| 322 | + onImageView.image = image; | |
| 323 | +} | |
| 324 | + | |
| 325 | +/* | |
| 326 | + * Sets the image that shows when the switch is off. | |
| 327 | + * The image is centered in the area not covered by the knob. | |
| 328 | + * Make sure to size your images appropriately. | |
| 329 | + */ | |
| 330 | +- (void)setOffImage:(UIImage *)image { | |
| 331 | + offImage = image; | |
| 332 | + offImageView.image = image; | |
| 333 | +} | |
| 334 | + | |
| 335 | + | |
| 336 | +/* | |
| 337 | + * Sets whether or not the switch edges are rounded. | |
| 338 | + * Set to NO to get a stylish square switch. | |
| 339 | + * Defaults to YES. | |
| 340 | + */ | |
| 341 | +- (void)setIsRounded:(BOOL)rounded { | |
| 342 | + isRounded = rounded; | |
| 343 | + | |
| 344 | + if (rounded) { | |
| 345 | + background.layer.cornerRadius = self.frame.size.height * 0.5; | |
| 346 | + knob.layer.cornerRadius = (self.frame.size.height * 0.5) - 1; | |
| 347 | + } | |
| 348 | + else { | |
| 349 | + background.layer.cornerRadius = self.cornerRadius; | |
| 350 | + knob.layer.cornerRadius = 2; | |
| 351 | + } | |
| 352 | +} | |
| 353 | + | |
| 354 | + | |
| 355 | +/* | |
| 356 | + * Set (without animation) whether the switch is on or off | |
| 357 | + */ | |
| 358 | +- (void)setOn:(BOOL)isOn { | |
| 359 | + [self setOn:isOn animated:NO]; | |
| 360 | +} | |
| 361 | + | |
| 362 | + | |
| 363 | +/* | |
| 364 | + * Set the state of the switch to on or off, optionally animating the transition. | |
| 365 | + */ | |
| 366 | +- (void)setOn:(BOOL)isOn animated:(BOOL)animated { | |
| 367 | + on = isOn; | |
| 368 | + | |
| 369 | + if ([self.delegate respondsToSelector:@selector(sevenSwitchChanged:)]) { | |
| 370 | + [self.delegate sevenSwitchChanged:isOn]; | |
| 371 | + } | |
| 372 | + | |
| 373 | + if (isOn) { | |
| 374 | + [self showOn:animated]; | |
| 375 | + } | |
| 376 | + else { | |
| 377 | + [self showOff:animated]; | |
| 378 | + } | |
| 379 | +} | |
| 380 | + | |
| 381 | + | |
| 382 | +#pragma mark Getters | |
| 383 | + | |
| 384 | +/* | |
| 385 | + * Detects whether the switch is on or off | |
| 386 | + * | |
| 387 | + * @return BOOL YES if switch is on. NO if switch is off | |
| 388 | + */ | |
| 389 | +- (BOOL)isOn { | |
| 390 | + return self.on; | |
| 391 | +} | |
| 392 | + | |
| 393 | + | |
| 394 | +#pragma mark State Changes | |
| 395 | + | |
| 396 | + | |
| 397 | +/* | |
| 398 | + * update the looks of the switch to be in the on position | |
| 399 | + * optionally make it animated | |
| 400 | + */ | |
| 401 | +- (void)showOn:(BOOL)animated { | |
| 402 | + CGFloat normalKnobWidth = self.bounds.size.height - 2; | |
| 403 | + CGFloat activeKnobWidth = normalKnobWidth + 5; | |
| 404 | + if (animated) { | |
| 405 | + isAnimating = YES; | |
| 406 | + [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState animations:^{ | |
| 407 | + if (self.tracking) | |
| 408 | + { | |
| 409 | + knob.frame = CGRectMake(self.bounds.size.width - (activeKnobWidth + 1), knob.frame.origin.y, activeKnobWidth, knob.frame.size.height); | |
| 410 | + } | |
| 411 | + else | |
| 412 | + { | |
| 413 | + knob.frame = CGRectMake(self.bounds.size.width - (normalKnobWidth + 1), knob.frame.origin.y, normalKnobWidth, knob.frame.size.height); | |
| 414 | + } | |
| 415 | + knob.image = self.knobOnImage; | |
| 416 | + knob.backgroundColor = self.knobOnColor; | |
| 417 | + background.backgroundColor = self.onColor; | |
| 418 | +// background.layer.borderColor = self.onColor.CGColor; | |
| 419 | + onImageView.alpha = 1.0; | |
| 420 | + offImageView.alpha = 0; | |
| 421 | + } completion:^(BOOL finished) { | |
| 422 | + isAnimating = NO; | |
| 423 | + }]; | |
| 424 | + } | |
| 425 | + else { | |
| 426 | + if (self.tracking) | |
| 427 | + { | |
| 428 | + knob.frame = CGRectMake(self.bounds.size.width - (activeKnobWidth + 1), knob.frame.origin.y, activeKnobWidth, knob.frame.size.height); | |
| 429 | + } | |
| 430 | + else | |
| 431 | + { | |
| 432 | + knob.frame = CGRectMake(self.bounds.size.width - (normalKnobWidth + 1), knob.frame.origin.y, normalKnobWidth, knob.frame.size.height); | |
| 433 | + } | |
| 434 | + knob.image = self.knobOnImage; | |
| 435 | + knob.backgroundColor = self.knobOnColor; | |
| 436 | + background.backgroundColor = self.onColor; | |
| 437 | +// background.layer.borderColor = self.onColor.CGColor; | |
| 438 | + onImageView.alpha = 1.0; | |
| 439 | + offImageView.alpha = 0; | |
| 440 | + } | |
| 441 | +} | |
| 442 | + | |
| 443 | + | |
| 444 | +/* | |
| 445 | + * update the looks of the switch to be in the off position | |
| 446 | + * optionally make it animated | |
| 447 | + */ | |
| 448 | +- (void)showOff:(BOOL)animated { | |
| 449 | + CGFloat normalKnobWidth = self.bounds.size.height - 2; | |
| 450 | + CGFloat activeKnobWidth = normalKnobWidth + 5; | |
| 451 | + if (animated) { | |
| 452 | + isAnimating = YES; | |
| 453 | + [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState animations:^{ | |
| 454 | + if (self.tracking) { | |
| 455 | + knob.frame = CGRectMake(1, knob.frame.origin.y, activeKnobWidth, knob.frame.size.height); | |
| 456 | + background.backgroundColor = self.activeColor; | |
| 457 | + } | |
| 458 | + else { | |
| 459 | + knob.frame = CGRectMake(1, knob.frame.origin.y, normalKnobWidth, knob.frame.size.height); | |
| 460 | + background.backgroundColor = self.inactiveColor; | |
| 461 | + } | |
| 462 | + knob.image = self.knobOffImage; | |
| 463 | + knob.backgroundColor = self.knobOffColor; | |
| 464 | +// background.layer.borderColor = self.borderColor.CGColor; | |
| 465 | + onImageView.alpha = 0; | |
| 466 | + offImageView.alpha = 1.0; | |
| 467 | + } completion:^(BOOL finished) { | |
| 468 | + isAnimating = NO; | |
| 469 | + }]; | |
| 470 | + } | |
| 471 | + else { | |
| 472 | + if (self.tracking) { | |
| 473 | + knob.frame = CGRectMake(1, knob.frame.origin.y, activeKnobWidth, knob.frame.size.height); | |
| 474 | + background.backgroundColor = self.activeColor; | |
| 475 | + } | |
| 476 | + else { | |
| 477 | + knob.frame = CGRectMake(1, knob.frame.origin.y, normalKnobWidth, knob.frame.size.height); | |
| 478 | + background.backgroundColor = self.inactiveColor; | |
| 479 | + } | |
| 480 | + knob.image = self.knobOffImage; | |
| 481 | + knob.backgroundColor = self.knobOffColor; | |
| 482 | +// background.layer.borderColor = self.borderColor.CGColor; | |
| 483 | + onImageView.alpha = 0; | |
| 484 | + offImageView.alpha = 1.0; | |
| 485 | + } | |
| 486 | +} | |
| 487 | + | |
| 488 | +@end | ... | ... |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/HomeViewController.m
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCFullScreenPlayerController.h
0 → 100644
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCFullScreenPlayerController.m
0 → 100644
| 1 | +// | |
| 2 | +// LVCFullScreenPlayerController.m | |
| 3 | +// LiveVideoCloud | |
| 4 | +// | |
| 5 | +// Created by iOS on 17/3/14. | |
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "LVCFullScreenPlayerController.h" | |
| 10 | + | |
| 11 | +@interface LVCFullScreenPlayerController () | |
| 12 | + | |
| 13 | +@end | |
| 14 | + | |
| 15 | +@implementation LVCFullScreenPlayerController | |
| 16 | + | |
| 17 | +- (UIInterfaceOrientationMask)supportedInterfaceOrientations { | |
| 18 | + return UIInterfaceOrientationMaskLandscape; | |
| 19 | +} | |
| 20 | + | |
| 21 | +- (BOOL)shouldAutorotate { | |
| 22 | + return YES; | |
| 23 | +} | |
| 24 | + | |
| 25 | +- (void)viewWillAppear:(BOOL)animated | |
| 26 | +{ | |
| 27 | + [super viewWillAppear:animated]; | |
| 28 | + | |
| 29 | + [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; | |
| 30 | + [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; | |
| 31 | +} | |
| 32 | + | |
| 33 | +- (void)viewDidLoad { | |
| 34 | + [super viewDidLoad]; | |
| 35 | + self.view.backgroundColor = [UIColor blackColor]; | |
| 36 | + | |
| 37 | +} | |
| 38 | + | |
| 39 | +- (void)didReceiveMemoryWarning { | |
| 40 | + [super didReceiveMemoryWarning]; | |
| 41 | + // Dispose of any resources that can be recreated. | |
| 42 | +} | |
| 43 | + | |
| 44 | +/* | |
| 45 | +#pragma mark - Navigation | |
| 46 | + | |
| 47 | +// In a storyboard-based application, you will often want to do a little preparation before navigation | |
| 48 | +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { | |
| 49 | + // Get the new view controller using [segue destinationViewController]. | |
| 50 | + // Pass the selected object to the new view controller. | |
| 51 | +} | |
| 52 | +*/ | |
| 53 | + | |
| 54 | +@end | ... | ... |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCLivePlayerController.m
| ... | ... | @@ -8,28 +8,50 @@ |
| 8 | 8 | |
| 9 | 9 | #import "LVCLivePlayerController.h" |
| 10 | 10 | #import "LVCPlayer.h" |
| 11 | +#import "LVCFullScreenPlayerController.h" | |
| 12 | + | |
| 13 | +#define WIDTH_SCREEN [UIScreen mainScreen].bounds.size.width | |
| 14 | +#define HEIGHT_SCREEN [UIScreen mainScreen].bounds.size.height | |
| 11 | 15 | |
| 12 | 16 | @interface LVCLivePlayerController ()<LVCPlayerDelegate> |
| 13 | 17 | { |
| 14 | - BOOL isHiddenStatusBar;//记录状态的隐藏显示 | |
| 15 | - CGRect playerFrame; | |
| 18 | + BOOL isHiddenStatusBar; //记录状态的隐藏显示 | |
| 19 | + CGRect playerFrame; // | |
| 20 | + NSInteger _originalDirection; //记录原始方向 | |
| 16 | 21 | |
| 17 | 22 | |
| 18 | 23 | } |
| 19 | 24 | @property (nonatomic, strong) LVCPlayer *player; |
| 25 | +@property (nonatomic, strong) LVCFullScreenPlayerController *fullVC; | |
| 20 | 26 | |
| 21 | 27 | @end |
| 22 | 28 | |
| 23 | 29 | @implementation LVCLivePlayerController |
| 24 | 30 | |
| 31 | +- (void)viewWillAppear:(BOOL)animated | |
| 32 | +{ | |
| 33 | + [super viewWillAppear:animated]; | |
| 34 | + [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; | |
| 35 | +} | |
| 36 | + | |
| 37 | +- (void)viewWillDisappear:(BOOL)animated | |
| 38 | +{ | |
| 39 | + [super viewWillDisappear:animated]; | |
| 40 | + [[UIApplication sharedApplication] setStatusBarHidden: NO withAnimation:UIStatusBarAnimationNone]; | |
| 41 | + [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; | |
| 42 | +} | |
| 43 | + | |
| 25 | 44 | - (void)viewDidLoad { |
| 26 | 45 | [super viewDidLoad]; |
| 27 | 46 | |
| 47 | + self.view.backgroundColor = [UIColor whiteColor]; | |
| 48 | + | |
| 49 | + playerFrame = CGRectMake(0, 0,WIDTH_SCREEN, WIDTH_SCREEN*9/16); | |
| 50 | + _originalDirection = 0; | |
| 51 | + | |
| 52 | + //注册通知 | |
| 28 | 53 | [self addObservers]; |
| 29 | 54 | |
| 30 | - playerFrame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, ([UIScreen mainScreen].bounds.size.width)* 9 / 16); | |
| 31 | - | |
| 32 | - self.view.backgroundColor = [UIColor whiteColor]; | |
| 33 | 55 | [self.view addSubview:self.player]; |
| 34 | 56 | |
| 35 | 57 | [self makeConstraints]; |
| ... | ... | @@ -42,93 +64,84 @@ |
| 42 | 64 | name:UIDeviceOrientationDidChangeNotification |
| 43 | 65 | object:nil]; |
| 44 | 66 | |
| 67 | + | |
| 45 | 68 | } |
| 46 | 69 | |
| 47 | 70 | #pragma mark - |
| 48 | 71 | #pragma mark - Notification |
| 49 | -- (void)onDeviceOrientationChange:(NSNotification *)notification{ | |
| 50 | - | |
| 51 | - if (_player==nil||_player.superview==nil){ | |
| 52 | - return; | |
| 53 | - } | |
| 72 | +- (void)onDeviceOrientationChange:(NSNotification *)notification | |
| 73 | +{ | |
| 74 | + if (_player == nil|| _player.superview == nil) return; | |
| 54 | 75 | |
| 55 | - UIDeviceOrientation orientation = [UIDevice currentDevice].orientation; | |
| 56 | - UIInterfaceOrientation interfaceOrientation = (UIInterfaceOrientation)orientation; | |
| 57 | - switch (interfaceOrientation) { | |
| 58 | - case UIInterfaceOrientationPortraitUpsideDown:{ | |
| 59 | - _player.isFullScreen = NO; | |
| 60 | - } | |
| 61 | - break; | |
| 62 | - case UIInterfaceOrientationPortrait:{ | |
| 63 | - [self toOrientation:UIInterfaceOrientationPortrait]; | |
| 76 | + UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; | |
| 77 | + | |
| 78 | + switch (orientation) { | |
| 79 | + case UIDeviceOrientationPortrait: | |
| 80 | + { | |
| 81 | + if (_originalDirection == 1) { | |
| 82 | + [self toHalfScreenWithrotationAngle:M_PI_2]; | |
| 83 | + } else if (_originalDirection == 2){ | |
| 84 | + [self toHalfScreenWithrotationAngle:-M_PI_2]; | |
| 85 | + } | |
| 86 | + _originalDirection = 0; | |
| 64 | 87 | _player.isFullScreen = NO; |
| 65 | 88 | } |
| 66 | 89 | break; |
| 67 | - case UIInterfaceOrientationLandscapeLeft:{ | |
| 68 | - [self toOrientation:UIInterfaceOrientationLandscapeLeft]; | |
| 69 | - _player.isFullScreen = YES; | |
| 90 | + | |
| 91 | + case UIDeviceOrientationLandscapeLeft: | |
| 92 | + { | |
| 93 | + if (_originalDirection == 0 ) { | |
| 94 | + [self toFullWithrotationAngle:-M_PI_2]; | |
| 95 | + } | |
| 96 | + _originalDirection = 1; | |
| 70 | 97 | } |
| 71 | 98 | break; |
| 72 | - case UIInterfaceOrientationLandscapeRight:{ | |
| 73 | - [self toOrientation:UIInterfaceOrientationLandscapeRight]; | |
| 74 | - _player.isFullScreen = YES; | |
| 99 | + | |
| 100 | + case UIDeviceOrientationLandscapeRight: | |
| 101 | + { | |
| 102 | + if (_originalDirection == 0 ) { | |
| 103 | + [self toFullWithrotationAngle:M_PI_2]; | |
| 104 | + } | |
| 105 | + _originalDirection = 2; | |
| 75 | 106 | } |
| 76 | 107 | break; |
| 108 | + | |
| 77 | 109 | default: |
| 78 | 110 | break; |
| 79 | 111 | } |
| 80 | 112 | } |
| 81 | 113 | |
| 82 | -#pragma mark - | |
| 83 | -#pragma mark - 屏幕旋转 | |
| 84 | --(void)toOrientation:(UIInterfaceOrientation)orientation{ | |
| 85 | - //获取到当前状态条的方向 | |
| 86 | - UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation; | |
| 87 | - //判断如果当前方向和要旋转的方向一致,那么不做任何操作 | |
| 88 | - if (currentOrientation == orientation) { | |
| 89 | - return; | |
| 90 | - } | |
| 114 | +//旋转至全屏 | |
| 115 | +- (void)toFullWithrotationAngle:(CGFloat)angle | |
| 116 | +{ | |
| 117 | + if (self.player.isFullScreen) return; | |
| 91 | 118 | |
| 92 | - //根据要旋转的方向,使用Masonry重新修改限制 | |
| 93 | - if (orientation ==UIInterfaceOrientationPortrait) {// | |
| 94 | - [_player mas_remakeConstraints:^(MASConstraintMaker *make) { | |
| 95 | - make.top.left.right.mas_equalTo(0); | |
| 96 | - make.height.equalTo(@(playerFrame.size.height)); | |
| 119 | + [self presentViewController:self.fullVC animated:NO completion:^{ | |
| 120 | + [_player removeFromSuperview]; | |
| 121 | + [self.fullVC.view addSubview:self.player]; | |
| 122 | + [self makePlayerViewConstraints:YES]; | |
| 123 | + self.player.transform = CGAffineTransformMakeRotation(angle); | |
| 124 | + [UIView animateWithDuration:0.3 animations:^{ | |
| 125 | + self.player.transform = CGAffineTransformMakeRotation(0); | |
| 97 | 126 | }]; |
| 98 | - }else{ | |
| 99 | - | |
| 100 | - if (currentOrientation ==UIInterfaceOrientationPortrait) { | |
| 101 | - [_player mas_remakeConstraints:^(MASConstraintMaker *make) { | |
| 102 | - make.width.equalTo(@([UIScreen mainScreen].bounds.size.height)); | |
| 103 | - make.height.equalTo(@([UIScreen mainScreen].bounds.size.width)); | |
| 104 | - make.center.equalTo(_player.superview); | |
| 105 | - }]; | |
| 106 | - } | |
| 107 | - } | |
| 127 | + }]; | |
| 108 | 128 | |
| 109 | - //设置状态栏方向 | |
| 110 | - [[UIApplication sharedApplication] setStatusBarOrientation:orientation animated:NO]; | |
| 129 | + self.player.isFullScreen = YES; | |
| 111 | 130 | |
| 112 | - //旋转屏幕 | |
| 113 | - [UIView beginAnimations:nil context:nil]; | |
| 114 | - _player.transform = CGAffineTransformIdentity; | |
| 115 | - _player.transform = [self getCurrentDeviceOrientation]; | |
| 116 | - [UIView setAnimationDuration:2.0]; | |
| 117 | - [UIView commitAnimations]; | |
| 118 | -} | |
| 119 | - | |
| 120 | -//获取旋转方向 | |
| 121 | -- (CGAffineTransform)getCurrentDeviceOrientation{ | |
| 122 | - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; | |
| 123 | - //根据要进行旋转的方向来计算旋转的角度 | |
| 124 | - if (orientation ==UIInterfaceOrientationPortrait) { | |
| 125 | - return CGAffineTransformIdentity; | |
| 126 | - }else if (orientation ==UIInterfaceOrientationLandscapeLeft){ | |
| 127 | - return CGAffineTransformMakeRotation(-M_PI_2); | |
| 128 | - }else if(orientation ==UIInterfaceOrientationLandscapeRight){ | |
| 129 | - return CGAffineTransformMakeRotation(M_PI_2); | |
| 130 | - } | |
| 131 | - return CGAffineTransformIdentity; | |
| 131 | +} | |
| 132 | + | |
| 133 | +//旋转至半屏 | |
| 134 | +- (void)toHalfScreenWithrotationAngle:(CGFloat)angle | |
| 135 | +{ | |
| 136 | + [_fullVC dismissViewControllerAnimated:NO completion:^{ | |
| 137 | + [_player removeFromSuperview]; | |
| 138 | + [self.view addSubview:self.player]; | |
| 139 | + [self makePlayerViewConstraints:NO]; | |
| 140 | + self.player.transform = CGAffineTransformMakeRotation(angle); | |
| 141 | + [UIView animateWithDuration:0.3 animations:^{ | |
| 142 | + self.player.transform = CGAffineTransformMakeRotation(0); | |
| 143 | + }]; | |
| 144 | + }]; | |
| 132 | 145 | } |
| 133 | 146 | |
| 134 | 147 | #pragma mark - |
| ... | ... | @@ -136,32 +149,32 @@ |
| 136 | 149 | - (void)lvcPlayer:(LVCPlayer *)player clickedBackBtn:(UIButton *)backBtn |
| 137 | 150 | { |
| 138 | 151 | //如果是全屏返回半屏,如果是半屏直接退出 |
| 139 | - if (player.isFullScreen) { | |
| 140 | - [self toOrientation:UIInterfaceOrientationPortrait]; | |
| 141 | - player.isFullScreen = NO; | |
| 152 | + if (self.player.isFullScreen) { | |
| 153 | + [self toHalfScreenWithrotationAngle:M_PI_2]; | |
| 154 | + self.player.isFullScreen = NO; | |
| 142 | 155 | } else { |
| 156 | + [_player stopPlaying]; | |
| 143 | 157 | self.navigationController.navigationBar.hidden = NO; |
| 144 | 158 | [self.navigationController popViewControllerAnimated:YES]; |
| 145 | 159 | } |
| 146 | 160 | } |
| 147 | 161 | |
| 148 | -- (void)lvcPlayer:(LVCPlayer *)player clickedPlayOrPauseBtn:(UIButton *)playOrPauseBtn | |
| 149 | -{ | |
| 150 | - | |
| 151 | -} | |
| 152 | - | |
| 153 | 162 | - (void)lvcPlayer:(LVCPlayer *)player clickedFullScreenBtn:(UIButton *)fullScreenBtn |
| 154 | 163 | { |
| 155 | - if (player.isFullScreen == YES) {//全屏 | |
| 156 | - [self toOrientation:UIInterfaceOrientationPortrait]; | |
| 157 | - player.isFullScreen = NO; | |
| 164 | + if (self.player.isFullScreen == YES) {//全屏 | |
| 165 | + [self toHalfScreenWithrotationAngle:M_PI_2]; | |
| 166 | + self.player.isFullScreen = NO; | |
| 158 | 167 | |
| 159 | 168 | }else{//非全屏 |
| 160 | - [self toOrientation:UIInterfaceOrientationLandscapeRight]; | |
| 161 | - player.isFullScreen = YES; | |
| 169 | + [self toFullWithrotationAngle:-M_PI_2]; | |
| 162 | 170 | } |
| 163 | 171 | } |
| 164 | 172 | |
| 173 | +- (void)lvcPlayer:(LVCPlayer *)player clickedEditBtn:(UIButton *)editBtn | |
| 174 | +{ | |
| 175 | + NSLog(@"开始编辑~~~~"); | |
| 176 | +} | |
| 177 | + | |
| 165 | 178 | #pragma mark - |
| 166 | 179 | #pragma mark - makeConstraints |
| 167 | 180 | - (void)makeConstraints |
| ... | ... | @@ -172,6 +185,21 @@ |
| 172 | 185 | }]; |
| 173 | 186 | } |
| 174 | 187 | |
| 188 | +- (void)makePlayerViewConstraints:(BOOL)fullScreen | |
| 189 | +{ | |
| 190 | + if (fullScreen) { | |
| 191 | + [self.player mas_remakeConstraints:^(MASConstraintMaker *make) { | |
| 192 | + make.top.left.right.bottom.mas_equalTo(0); | |
| 193 | + }]; | |
| 194 | + | |
| 195 | + } else { | |
| 196 | + [self.player mas_remakeConstraints:^(MASConstraintMaker *make) { | |
| 197 | + make.top.left.right.mas_equalTo(0); | |
| 198 | + make.height.equalTo(@(playerFrame.size.height)); | |
| 199 | + }]; | |
| 200 | + } | |
| 201 | +} | |
| 202 | + | |
| 175 | 203 | #pragma mark - |
| 176 | 204 | #pragma mark - gatter |
| 177 | 205 | - (LVCPlayer *)player |
| ... | ... | @@ -183,6 +211,13 @@ |
| 183 | 211 | return _player; |
| 184 | 212 | } |
| 185 | 213 | |
| 214 | +- (LVCFullScreenPlayerController *)fullVC | |
| 215 | +{ | |
| 216 | + if (!_fullVC) { | |
| 217 | + _fullVC = [[LVCFullScreenPlayerController alloc] init]; | |
| 218 | + } | |
| 219 | + return _fullVC; | |
| 220 | +} | |
| 186 | 221 | - (void)didReceiveMemoryWarning { |
| 187 | 222 | [super didReceiveMemoryWarning]; |
| 188 | 223 | // Dispose of any resources that can be recreated. | ... | ... |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCPlayer.h
| ... | ... | @@ -15,8 +15,8 @@ |
| 15 | 15 | @optional |
| 16 | 16 | |
| 17 | 17 | - (void)lvcPlayer:(LVCPlayer *)player clickedBackBtn:(UIButton *)backBtn; //返回 |
| 18 | -- (void)lvcPlayer:(LVCPlayer *)player clickedPlayOrPauseBtn:(UIButton *)playOrPauseBtn; //播放或暂停 | |
| 19 | 18 | - (void)lvcPlayer:(LVCPlayer *)player clickedFullScreenBtn:(UIButton *)fullScreenBtn; //全屏 |
| 19 | +- (void)lvcPlayer:(LVCPlayer *)player clickedEditBtn:(UIButton *)editBtn; //全屏编辑按钮 | |
| 20 | 20 | |
| 21 | 21 | @end |
| 22 | 22 | |
| ... | ... | @@ -25,9 +25,10 @@ |
| 25 | 25 | |
| 26 | 26 | @property (nonatomic, assign) id<LVCPlayerDelegate> delegate; |
| 27 | 27 | |
| 28 | -@property (nonatomic, strong) UIView *contentView; //所有空间统一管理在这个view中 | |
| 28 | +@property (nonatomic, strong) UIImageView *contentView; //所有空间统一管理在这个view中 | |
| 29 | 29 | @property (nonatomic, strong) UIButton *backBtn; //返回 |
| 30 | +@property (nonatomic, assign) BOOL isFullScreen; //是否是全屏 | |
| 30 | 31 | |
| 31 | -@property (nonatomic, assign) BOOL isFullScreen; //是否是全屏 | |
| 32 | +- (void)stopPlaying; | |
| 32 | 33 | |
| 33 | 34 | @end | ... | ... |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCPlayer.m
| ... | ... | @@ -7,16 +7,27 @@ |
| 7 | 7 | // |
| 8 | 8 | |
| 9 | 9 | #import "LVCPlayer.h" |
| 10 | +#import "LVCPlayerLoadingView.h" | |
| 11 | +#import "SevenSwitch.h" | |
| 10 | 12 | |
| 11 | -@interface LVCPlayer () | |
| 13 | +#define kAppId @"60_irn9edco29" | |
| 14 | +#define kAppKey @"69fe70bda67e059286ad509d9f5377f815955645b52f94" | |
| 15 | +#define kbundleId @"com.cnlive.zhangxu.LiveVideoCloud" | |
| 12 | 16 | |
| 17 | +@interface LVCPlayer () | |
| 18 | +{ | |
| 19 | + BOOL _isFull; | |
| 20 | +} | |
| 13 | 21 | @property (nonatomic, strong) UIImageView *topBgView; //顶部蒙版 |
| 14 | 22 | @property (nonatomic, strong) UIImageView *bottomBgView; //底部蒙版 |
| 15 | 23 | @property (nonatomic, strong) UIButton *playOrPauseBtn; //播放/暂停 |
| 16 | 24 | @property (nonatomic, strong) UILabel *titleLab; //标题 |
| 17 | 25 | @property (nonatomic, strong) UIButton *fullScreenBtn; //控制全屏按钮 |
| 18 | -@property (nonatomic, strong) UIGestureRecognizer *singleTap; //单击手势 | |
| 19 | -@property (nonatomic, strong) UIActivityIndicatorView *loadingView; //加载图 | |
| 26 | +@property (nonatomic, strong) UITapGestureRecognizer *singleTap; //单击手势 | |
| 27 | +@property (nonatomic, strong) LVCPlayerLoadingView *loadingView; //加载图 | |
| 28 | +@property (nonatomic, strong) CNLiveMoviePlayerController *player; | |
| 29 | +@property (nonatomic, strong) SevenSwitch *barrageSwitch; //弹幕开关 | |
| 30 | +@property (nonatomic, strong) UIButton *editBtn; //全屏编辑按钮 | |
| 20 | 31 | @end |
| 21 | 32 | |
| 22 | 33 | @implementation LVCPlayer |
| ... | ... | @@ -26,27 +37,62 @@ |
| 26 | 37 | self = [super initWithFrame:frame]; |
| 27 | 38 | if (self) { |
| 28 | 39 | |
| 40 | + [self initPlayer]; | |
| 41 | + | |
| 29 | 42 | [self addSubview:self.contentView]; |
| 30 | 43 | [self.contentView addSubview:self.bottomBgView]; |
| 31 | 44 | [self.contentView addSubview:self.topBgView]; |
| 32 | 45 | [self.bottomBgView addSubview:self.playOrPauseBtn]; |
| 33 | 46 | [self.bottomBgView addSubview:self.fullScreenBtn]; |
| 34 | 47 | [self.topBgView addSubview:self.titleLab]; |
| 35 | - [self.topBgView addSubview:self.backBtn]; | |
| 48 | + [self.topBgView addSubview:self.barrageSwitch]; | |
| 49 | + [self addSubview:self.backBtn]; | |
| 36 | 50 | [self.contentView addSubview:self.loadingView]; |
| 51 | + [self.contentView addSubview:self.editBtn]; | |
| 52 | + [self.contentView addGestureRecognizer:self.singleTap]; | |
| 53 | + | |
| 37 | 54 | [self makeSubViewsConstraints]; |
| 38 | 55 | |
| 39 | 56 | } |
| 40 | 57 | return self; |
| 41 | 58 | } |
| 59 | +#pragma mark - | |
| 60 | +#pragma mark - initPlayer | |
| 61 | +- (void)initPlayer | |
| 62 | +{ | |
| 63 | + [[CNLiveWebcastManager manager] initWithAppId:kAppId appKey:kAppKey]; | |
| 64 | + //点播播放 | |
| 65 | + _player = [[CNLiveMoviePlayerController alloc] initVodPlayWithVId:@"aaa123" | |
| 66 | + authSuccess:^{ | |
| 67 | + | |
| 68 | + [self addObservers]; | |
| 69 | + _player.videoDecoderMode = CNLiveMovieVideoDecoderMode_AUTO; | |
| 70 | + _player.shouldAutoplay = YES; | |
| 71 | + [_player prepareToPlay]; | |
| 72 | + [self.contentView addSubview:_player.view]; | |
| 73 | + [self.contentView sendSubviewToBack:_player.view]; | |
| 74 | + | |
| 75 | + [self makePlayerConstraint]; | |
| 76 | + | |
| 77 | + | |
| 78 | + } authFailed:^(NSDictionary *errorInfo) { | |
| 79 | + NSLog(@"初始化点播播放器失败%@", errorInfo); | |
| 80 | + | |
| 81 | + }]; | |
| 82 | +} | |
| 42 | 83 | |
| 43 | 84 | #pragma mark - |
| 44 | 85 | #pragma mark - action |
| 45 | 86 | - (void)playOrPauseBtnAction:(UIButton *)btn |
| 46 | 87 | { |
| 47 | - if (self.delegate && [self.delegate respondsToSelector:@selector(lvcPlayer:clickedPlayOrPauseBtn:)]) { | |
| 48 | - [self.delegate lvcPlayer:self clickedPlayOrPauseBtn:btn]; | |
| 88 | + if (btn.selected) { | |
| 89 | + [_player pause]; | |
| 90 | + } else { | |
| 91 | + [_player play]; | |
| 49 | 92 | } |
| 93 | + | |
| 94 | + btn.selected =! btn.selected; | |
| 95 | + | |
| 50 | 96 | } |
| 51 | 97 | |
| 52 | 98 | - (void)backBtnAction:(UIButton *)btn |
| ... | ... | @@ -64,24 +110,238 @@ |
| 64 | 110 | |
| 65 | 111 | } |
| 66 | 112 | |
| 113 | +- (void)singleTapView | |
| 114 | +{ | |
| 115 | + [UIView animateWithDuration:0.25 animations:^{ | |
| 116 | + self.topBgView.alpha = self.topBgView.alpha == 0 ? 1 : 0; | |
| 117 | + self.bottomBgView.alpha = self.bottomBgView.alpha == 0 ? 1 : 0; | |
| 118 | + self.editBtn.alpha = self.editBtn.alpha == 0 ? 1 : 0; | |
| 119 | + }]; | |
| 120 | + [[UIApplication sharedApplication] setStatusBarHidden:self.topBgView.alpha == 0 ? YES : NO withAnimation:UIStatusBarAnimationFade]; | |
| 121 | + | |
| 122 | +} | |
| 123 | + | |
| 124 | +- (void)barrageSwitchAction | |
| 125 | +{ | |
| 126 | + NSString *string = self.barrageSwitch.on ? @"已开启弹幕" : @"已关闭弹幕"; | |
| 127 | + | |
| 128 | + NSLog(@"%@",string); | |
| 129 | +} | |
| 130 | + | |
| 131 | +- (void)editBtnAction:(UIButton *)btn | |
| 132 | +{ | |
| 133 | + if (self.delegate && [self.delegate respondsToSelector:@selector(lvcPlayer:clickedEditBtn:)]) { | |
| 134 | + [self.delegate lvcPlayer:self clickedEditBtn:btn]; | |
| 135 | + } | |
| 136 | +} | |
| 137 | + | |
| 67 | 138 | #pragma mark - |
| 68 | -#pragma mark - setter | |
| 139 | +#pragma mark - Notification | |
| 140 | +- (void)addObservers | |
| 141 | +{ | |
| 142 | + //视频加载状态改变 | |
| 143 | + [[NSNotificationCenter defaultCenter] addObserver:self | |
| 144 | + selector:@selector(loadStateDidChange:) | |
| 145 | + name:MPMoviePlayerLoadStateDidChangeNotification | |
| 146 | + object:nil]; | |
| 147 | + | |
| 148 | + //视频播放错误及结束原因 | |
| 149 | + [[NSNotificationCenter defaultCenter] addObserver:self | |
| 150 | + selector:@selector(moviePlayBackDidFinish:) | |
| 151 | + name:MPMoviePlayerPlaybackDidFinishNotification | |
| 152 | + object:nil]; | |
| 153 | + | |
| 154 | + //视频缓冲至可播放状态 | |
| 155 | + [[NSNotificationCenter defaultCenter] addObserver:self | |
| 156 | + selector:@selector(mediaIsPreparedToPlayDidChange:) | |
| 157 | + name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification | |
| 158 | + object:nil]; | |
| 159 | + | |
| 160 | + //视频播放状态改变 | |
| 161 | + [[NSNotificationCenter defaultCenter] addObserver:self | |
| 162 | + selector:@selector(moviePlayBackStateDidChange:) | |
| 163 | + name:MPMoviePlayerPlaybackStateDidChangeNotification | |
| 164 | + object:nil]; | |
| 165 | + | |
| 166 | + [[NSNotificationCenter defaultCenter] addObserver:self | |
| 167 | + selector:@selector(appResignActive:) | |
| 168 | + name:UIApplicationWillResignActiveNotification | |
| 169 | + object:nil]; | |
| 170 | + | |
| 171 | + [[NSNotificationCenter defaultCenter] addObserver:self | |
| 172 | + selector:@selector(appBecomeActive:) | |
| 173 | + name:UIApplicationDidBecomeActiveNotification | |
| 174 | + object:nil]; | |
| 175 | +} | |
| 176 | + | |
| 177 | +- (void)loadStateDidChange:(NSNotification *)notification | |
| 178 | +{ | |
| 179 | + if (_player) { | |
| 180 | + MPMovieLoadState loadState = _player.loadState; | |
| 181 | + if ((loadState & MPMovieLoadStatePlaythroughOK) != 0) { | |
| 182 | + NSLog(@"loadStateDidChange: MPMovieLoadStatePlaythroughOK: %d\n", (int)loadState); | |
| 183 | + | |
| 184 | + } else if ((loadState & MPMovieLoadStateStalled) != 0) { | |
| 185 | + NSLog(@"loadStateDidChange: MPMovieLoadStateStalled: %d\n", (int)loadState); | |
| 186 | + | |
| 187 | + } else { | |
| 188 | + NSLog(@"loadStateDidChange: ???: %d\n", (int)loadState); | |
| 189 | + } | |
| 190 | + } | |
| 191 | +} | |
| 192 | + | |
| 193 | +- (void)moviePlayBackDidFinish:(NSNotification *)notification | |
| 194 | +{ | |
| 195 | + if (_player) { | |
| 196 | + int reason = [[[notification userInfo] valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue]; | |
| 197 | + if (MPMovieFinishReasonPlaybackError == reason) { | |
| 198 | + } else { | |
| 199 | +// _loadingView.retryBtn.hidden = YES; | |
| 200 | + } | |
| 201 | + | |
| 202 | + switch (reason) | |
| 203 | + { | |
| 204 | + case MPMovieFinishReasonPlaybackEnded: | |
| 205 | + NSLog(@"playbackStateDidChange: MPMovieFinishReasonPlaybackEnded: %d\n", reason); | |
| 206 | + break; | |
| 207 | + | |
| 208 | + case MPMovieFinishReasonUserExited: | |
| 209 | + NSLog(@"playbackStateDidChange: MPMovieFinishReasonUserExited: %d\n", reason); | |
| 210 | + break; | |
| 211 | + | |
| 212 | + case MPMovieFinishReasonPlaybackError: | |
| 213 | + NSLog(@"playbackStateDidChange: MPMovieFinishReasonPlaybackError: %d\n", reason); | |
| 214 | + break; | |
| 215 | + | |
| 216 | + default: | |
| 217 | + NSLog(@"playbackPlayBackDidFinish: ???: %d\n", reason); | |
| 218 | + break; | |
| 219 | + } | |
| 220 | + } | |
| 221 | +} | |
| 222 | + | |
| 223 | +- (void)mediaIsPreparedToPlayDidChange:(NSNotification *)notification | |
| 224 | +{ | |
| 225 | + if (_player) { | |
| 226 | + NSLog(@"isPreparedToPlay"); | |
| 227 | + } | |
| 228 | +} | |
| 229 | + | |
| 230 | +- (void)moviePlayBackStateDidChange:(NSNotification *)notification | |
| 231 | +{ | |
| 232 | + if (_player) { | |
| 233 | + | |
| 234 | + if (_player.playbackState == MPMoviePlaybackStatePlaying) { | |
| 235 | + _playOrPauseBtn.selected = YES; | |
| 236 | + [self.loadingView retry]; | |
| 237 | + } else { | |
| 238 | + _playOrPauseBtn.selected = NO; | |
| 239 | + } | |
| 240 | + | |
| 241 | + NSLog(@"moviePlayBackStateDidChange : %ld",(long)_player.playbackState); | |
| 242 | + | |
| 243 | + /* | |
| 244 | + switch (_player.playbackState) { | |
| 245 | + case MPMoviePlaybackStateStopped: { | |
| 246 | + | |
| 247 | + [self changePlayBtnStatus:NO]; | |
| 248 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateStopped"); | |
| 249 | + break; | |
| 250 | + } | |
| 251 | + case MPMoviePlaybackStatePlaying: { | |
| 252 | + [self changePlayBtnStatus:YES]; | |
| 253 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStatePlaying"); | |
| 254 | + break; | |
| 255 | + } | |
| 256 | + case MPMoviePlaybackStatePaused: | |
| 257 | + [self changePlayBtnStatus:NO]; | |
| 258 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStatePaused"); | |
| 259 | + break; | |
| 260 | + case MPMoviePlaybackStateInterrupted: | |
| 261 | + [self changePlayBtnStatus:NO]; | |
| 262 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateInterrupted"); | |
| 263 | + break; | |
| 264 | + case MPMoviePlaybackStateSeekingForward: | |
| 265 | + [self changePlayBtnStatus:NO]; | |
| 266 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateSeekingForward"); | |
| 267 | + break; | |
| 268 | + case MPMoviePlaybackStateSeekingBackward: | |
| 269 | + [self changePlayBtnStatus:NO]; | |
| 270 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateSeekingBackward"); | |
| 271 | + break; | |
| 272 | + default: | |
| 273 | + [self changePlayBtnStatus:NO]; | |
| 274 | + NSLog(@"moviePlayBackStateDidChange : %ld", _player.playbackState); | |
| 275 | + break; | |
| 276 | + } | |
| 277 | + */ | |
| 278 | + } | |
| 279 | +} | |
| 280 | + | |
| 281 | +- (void)appResignActive:(NSNotification *)noti | |
| 282 | +{ | |
| 283 | + [_player pause]; | |
| 284 | +} | |
| 285 | + | |
| 286 | +- (void)appBecomeActive:(NSNotification *)noti | |
| 287 | +{ | |
| 288 | + [_player play]; | |
| 289 | +} | |
| 69 | 290 | |
| 291 | +#pragma mark - | |
| 292 | +#pragma mark - public | |
| 293 | +- (void)stopPlaying | |
| 294 | +{ | |
| 295 | + if (_player.isPlaying) { | |
| 296 | + [_player stop]; | |
| 297 | + } | |
| 298 | + _player = nil; | |
| 299 | + [self removeMovieNotificationObservers]; | |
| 300 | +} | |
| 301 | + | |
| 302 | +- (void)removeMovieNotificationObservers | |
| 303 | +{ | |
| 304 | + [[NSNotificationCenter defaultCenter]removeObserver:self | |
| 305 | + name:MPMoviePlayerLoadStateDidChangeNotification | |
| 306 | + object:nil]; | |
| 307 | + [[NSNotificationCenter defaultCenter]removeObserver:self | |
| 308 | + name:MPMoviePlayerPlaybackDidFinishNotification | |
| 309 | + object:nil]; | |
| 310 | + [[NSNotificationCenter defaultCenter]removeObserver:self | |
| 311 | + name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification | |
| 312 | + object:nil]; | |
| 313 | + [[NSNotificationCenter defaultCenter]removeObserver:self | |
| 314 | + name:MPMoviePlayerPlaybackStateDidChangeNotification | |
| 315 | + object:nil]; | |
| 316 | +} | |
| 317 | + | |
| 318 | +#pragma mark - | |
| 319 | +#pragma mark - makeConstraints | |
| 320 | +- (void)makePlayerConstraint | |
| 321 | +{ | |
| 322 | + [self.player.view mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 323 | + make.width.equalTo(self.contentView); | |
| 324 | + make.height.equalTo(self.contentView); | |
| 325 | + make.center.equalTo(self.contentView); | |
| 326 | + }]; | |
| 327 | +} | |
| 70 | 328 | |
| 71 | 329 | - (void)makeSubViewsConstraints |
| 72 | 330 | { |
| 331 | + | |
| 73 | 332 | [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) { |
| 74 | 333 | make.top.left.right.bottom.mas_equalTo(0); |
| 75 | 334 | }]; |
| 76 | 335 | |
| 77 | 336 | [self.loadingView mas_makeConstraints:^(MASConstraintMaker *make) { |
| 78 | 337 | make.center.equalTo(self.contentView); |
| 338 | + make.width.mas_equalTo(100); | |
| 339 | + make.height.mas_equalTo(80); | |
| 79 | 340 | }]; |
| 80 | - | |
| 341 | + | |
| 81 | 342 | [self.backBtn mas_makeConstraints:^(MASConstraintMaker *make) { |
| 82 | 343 | make.left.equalTo(self.topBgView).with.offset(5); |
| 83 | - make.height.mas_equalTo(30); | |
| 84 | - make.width.mas_equalTo(30); | |
| 344 | + make.width.height.mas_equalTo(30); | |
| 85 | 345 | make.top.equalTo(self.topBgView).with.offset(20); |
| 86 | 346 | }]; |
| 87 | 347 | |
| ... | ... | @@ -90,41 +350,55 @@ |
| 90 | 350 | make.height.mas_equalTo(70); |
| 91 | 351 | }]; |
| 92 | 352 | |
| 353 | + [self.barrageSwitch mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 354 | + make.width.mas_equalTo(35); | |
| 355 | + make.height.mas_equalTo(20); | |
| 356 | + make.top.mas_equalTo(20); | |
| 357 | + make.right.equalTo(self.topBgView).offset(-60); | |
| 358 | + }]; | |
| 359 | + | |
| 93 | 360 | [self.bottomBgView mas_makeConstraints:^(MASConstraintMaker *make) { |
| 94 | 361 | make.bottom.left.right.equalTo(self.contentView).with.offset(0); |
| 95 | 362 | make.height.mas_equalTo(50); |
| 96 | 363 | }]; |
| 97 | 364 | |
| 98 | 365 | [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) { |
| 99 | - make.leading.trailing.bottom.mas_equalTo(0); | |
| 100 | - make.height.mas_equalTo(40); | |
| 366 | + make.left.equalTo(self.backBtn).offset(40); | |
| 367 | + make.top.trailing.bottom.mas_equalTo(0); | |
| 101 | 368 | }]; |
| 102 | 369 | |
| 103 | 370 | [self.playOrPauseBtn mas_makeConstraints:^(MASConstraintMaker *make) { |
| 104 | - make.left.equalTo(self.bottomBgView).with.offset(0); | |
| 105 | - make.height.mas_equalTo(50); | |
| 106 | - make.bottom.equalTo(self.bottomBgView).with.offset(0); | |
| 107 | - make.width.mas_equalTo(50); | |
| 371 | + make.left.bottom.equalTo(self.bottomBgView).with.offset(0); | |
| 372 | + make.width.height.mas_equalTo(50); | |
| 108 | 373 | }]; |
| 109 | 374 | |
| 110 | 375 | [self.fullScreenBtn mas_makeConstraints:^(MASConstraintMaker *make) { |
| 111 | - make.right.equalTo(self.bottomBgView).with.offset(0); | |
| 112 | - make.height.mas_equalTo(50); | |
| 113 | - make.bottom.equalTo(self.bottomBgView).with.offset(0); | |
| 114 | - make.width.mas_equalTo(50); | |
| 115 | - | |
| 376 | + make.right.bottom.equalTo(self.bottomBgView).with.offset(0); | |
| 377 | + make.width.height.mas_equalTo(50); | |
| 378 | + }]; | |
| 379 | + | |
| 380 | + [self.editBtn mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 381 | + make.width.height.mas_equalTo(40); | |
| 382 | + make.centerY.equalTo(self.contentView); | |
| 383 | + make.right.equalTo(self.contentView).with.offset(-20); | |
| 116 | 384 | }]; |
| 117 | 385 | |
| 118 | 386 | } |
| 119 | 387 | |
| 120 | 388 | #pragma mark - |
| 389 | +#pragma mark - setter | |
| 390 | + | |
| 391 | + | |
| 392 | +#pragma mark - | |
| 121 | 393 | #pragma mark - getter |
| 122 | 394 | |
| 123 | -- (UIView *)contentView | |
| 395 | +- (UIImageView *)contentView | |
| 124 | 396 | { |
| 125 | 397 | if (!_contentView) { |
| 126 | - _contentView = [[UIView alloc] init]; | |
| 127 | - _contentView.backgroundColor = [UIColor blueColor]; | |
| 398 | + _contentView = [[UIImageView alloc] init]; | |
| 399 | + _contentView.image = [UIImage imageNamed:@""]; | |
| 400 | + _contentView.backgroundColor = [UIColor lightGrayColor]; | |
| 401 | + _contentView.userInteractionEnabled = YES; | |
| 128 | 402 | } |
| 129 | 403 | return _contentView; |
| 130 | 404 | } |
| ... | ... | @@ -153,8 +427,8 @@ |
| 153 | 427 | { |
| 154 | 428 | if (!_playOrPauseBtn) { |
| 155 | 429 | _playOrPauseBtn = [UIButton buttonWithType:UIButtonTypeCustom]; |
| 156 | - [_playOrPauseBtn setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal]; | |
| 157 | - [_playOrPauseBtn setImage:[UIImage imageNamed:@"play"] forState:UIControlStateSelected]; | |
| 430 | + [_playOrPauseBtn setImage:[UIImage imageNamed:@"play"] forState:UIControlStateNormal]; | |
| 431 | + [_playOrPauseBtn setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateSelected]; | |
| 158 | 432 | [_playOrPauseBtn addTarget:self action:@selector(playOrPauseBtnAction:) forControlEvents:UIControlEventTouchUpInside]; |
| 159 | 433 | } |
| 160 | 434 | return _playOrPauseBtn; |
| ... | ... | @@ -164,8 +438,9 @@ |
| 164 | 438 | { |
| 165 | 439 | if (!_titleLab) { |
| 166 | 440 | _titleLab = [[UILabel alloc] init]; |
| 441 | + _titleLab.text = @"我是标题~~"; | |
| 167 | 442 | _titleLab.textColor = [UIColor whiteColor]; |
| 168 | - _titleLab.font = [UIFont systemFontOfSize:15]; | |
| 443 | + _titleLab.font = [UIFont systemFontOfSize:17]; | |
| 169 | 444 | } |
| 170 | 445 | return _titleLab; |
| 171 | 446 | } |
| ... | ... | @@ -185,21 +460,53 @@ |
| 185 | 460 | { |
| 186 | 461 | if (!_backBtn) { |
| 187 | 462 | _backBtn = [UIButton buttonWithType:UIButtonTypeCustom]; |
| 188 | - [_backBtn setImage:[UIImage imageNamed:@"返回"] forState:UIControlStateNormal]; | |
| 463 | + [_backBtn setImage:[UIImage imageNamed:@"play_back"] forState:UIControlStateNormal]; | |
| 189 | 464 | [_backBtn addTarget:self action:@selector(backBtnAction:) forControlEvents:UIControlEventTouchUpInside]; |
| 190 | 465 | } |
| 191 | 466 | return _backBtn; |
| 192 | 467 | } |
| 193 | 468 | |
| 194 | -- (UIActivityIndicatorView *)loadingView | |
| 469 | +- (LVCPlayerLoadingView *)loadingView | |
| 195 | 470 | { |
| 196 | 471 | if (!_loadingView) { |
| 197 | - _loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; | |
| 198 | - [_loadingView startAnimating]; | |
| 472 | + _loadingView = [[LVCPlayerLoadingView alloc] init]; | |
| 199 | 473 | } |
| 200 | 474 | return _loadingView; |
| 201 | 475 | } |
| 202 | 476 | |
| 477 | +- (UITapGestureRecognizer *)singleTap | |
| 478 | +{ | |
| 479 | + if (!_singleTap) { | |
| 480 | + _singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapView)]; | |
| 481 | + } | |
| 482 | + return _singleTap; | |
| 483 | +} | |
| 484 | + | |
| 485 | +- (SevenSwitch *)barrageSwitch { //弹幕开关 | |
| 486 | + if (!_barrageSwitch) { | |
| 487 | + _barrageSwitch = [[SevenSwitch alloc] init]; | |
| 488 | + _barrageSwitch.knobOnImage = [UIImage imageNamed:@"弹off"]; | |
| 489 | + _barrageSwitch.knobOffImage = [UIImage imageNamed:@"弹off"]; | |
| 490 | + _barrageSwitch.onColor = [UIColor yellowColorZX]; | |
| 491 | + _barrageSwitch.borderColor = [UIColor blackColor]; | |
| 492 | + _barrageSwitch.activeColor = [UIColor blackColor]; | |
| 493 | + _barrageSwitch.inactiveColor = [UIColor blackColor]; | |
| 494 | + _barrageSwitch.on = YES; | |
| 495 | +// _barrageSwitch.hidden = YES; | |
| 496 | + [_barrageSwitch addTarget:self action:@selector(barrageSwitchAction) forControlEvents:UIControlEventValueChanged]; | |
| 497 | + } | |
| 498 | + return _barrageSwitch; | |
| 499 | +} | |
| 500 | + | |
| 501 | +- (UIButton *)editBtn | |
| 502 | +{ | |
| 503 | + if (!_editBtn) { | |
| 504 | + _editBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | |
| 505 | + [_editBtn setImage:[UIImage imageNamed:@"Barrage input"] forState:UIControlStateNormal]; | |
| 506 | + [_editBtn addTarget:self action:@selector(editBtnAction:) forControlEvents:UIControlEventTouchUpInside]; | |
| 507 | + } | |
| 508 | + return _editBtn; | |
| 509 | +} | |
| 203 | 510 | |
| 204 | 511 | /* |
| 205 | 512 | // Only override drawRect: if you perform custom drawing. | ... | ... |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCPlayerLoadingView.h
0 → 100644
| 1 | +// | |
| 2 | +// LVCPlayerLoadingView.h | |
| 3 | +// LiveVideoCloud | |
| 4 | +// | |
| 5 | +// Created by iOS on 17/3/15. | |
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <UIKit/UIKit.h> | |
| 10 | + | |
| 11 | +@protocol LVCPlayerLoadingViewDelegate <NSObject> | |
| 12 | + | |
| 13 | +- (void)retryBtnClick; //点击重试 | |
| 14 | + | |
| 15 | +@end | |
| 16 | + | |
| 17 | +@interface LVCPlayerLoadingView : UIView | |
| 18 | + | |
| 19 | +@property (nonatomic, assign) id<LVCPlayerLoadingViewDelegate> delegate; | |
| 20 | + | |
| 21 | +- (void)startLoading; //开始加载 | |
| 22 | + | |
| 23 | +- (void)stopLoading; //停止加载 | |
| 24 | + | |
| 25 | +- (void)retry; | |
| 26 | + | |
| 27 | +@end | ... | ... |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCPlayerLoadingView.m
0 → 100644
| 1 | +// | |
| 2 | +// LVCPlayerLoadingView.m | |
| 3 | +// LiveVideoCloud | |
| 4 | +// | |
| 5 | +// Created by iOS on 17/3/15. | |
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "LVCPlayerLoadingView.h" | |
| 10 | + | |
| 11 | +@interface LVCPlayerLoadingView () | |
| 12 | + | |
| 13 | +@property (nonatomic, strong) UIActivityIndicatorView *loadingView; | |
| 14 | +@property (nonatomic, strong) UILabel *loadingLab; | |
| 15 | +@property (nonatomic, strong) UIButton *retryBtn; | |
| 16 | + | |
| 17 | +@end | |
| 18 | + | |
| 19 | +@implementation LVCPlayerLoadingView | |
| 20 | + | |
| 21 | +- (instancetype)initWithFrame:(CGRect)frame | |
| 22 | +{ | |
| 23 | + self = [super initWithFrame:frame]; | |
| 24 | + if (self) { | |
| 25 | + [self addSubview:self.loadingView]; | |
| 26 | + [self addSubview:self.loadingLab]; | |
| 27 | + [self addSubview:self.retryBtn]; | |
| 28 | + | |
| 29 | + [self makeSubViewsConstraints]; | |
| 30 | + [self.loadingView startAnimating]; | |
| 31 | + | |
| 32 | + } | |
| 33 | + return self; | |
| 34 | +} | |
| 35 | + | |
| 36 | +#pragma mark - | |
| 37 | +#pragma mark - public methods | |
| 38 | + | |
| 39 | +- (void)startLoading | |
| 40 | +{ | |
| 41 | + [self.loadingView startAnimating]; | |
| 42 | + _loadingLab.hidden = NO; | |
| 43 | + self.retryBtn.hidden = YES; | |
| 44 | + self.hidden = NO; | |
| 45 | +} | |
| 46 | + | |
| 47 | +- (void)stopLoading | |
| 48 | +{ | |
| 49 | + [self.loadingView stopAnimating]; | |
| 50 | + self.hidden = YES; | |
| 51 | +} | |
| 52 | + | |
| 53 | +- (void)retry | |
| 54 | +{ | |
| 55 | + _retryBtn.hidden = NO; | |
| 56 | + [_loadingView stopAnimating]; | |
| 57 | + _loadingLab.hidden = YES; | |
| 58 | +} | |
| 59 | + | |
| 60 | +#pragma mark - | |
| 61 | +#pragma mark - action | |
| 62 | +- (void)retryBtnAction | |
| 63 | +{ | |
| 64 | + [self startLoading]; | |
| 65 | + if (self.delegate && [self.delegate respondsToSelector:@selector(retryBtnClick)]) { | |
| 66 | + [self.delegate retryBtnClick]; | |
| 67 | + } | |
| 68 | +} | |
| 69 | + | |
| 70 | +#pragma mark - | |
| 71 | +#pragma mark - makeSubViewsConstraints | |
| 72 | +- (void)makeSubViewsConstraints | |
| 73 | +{ | |
| 74 | + | |
| 75 | + [self.loadingView mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 76 | + make.centerX.mas_equalTo(self.width/2); | |
| 77 | + make.top.mas_equalTo(0); | |
| 78 | + }]; | |
| 79 | + | |
| 80 | + [self.loadingLab mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 81 | + make.left.mas_equalTo(0); | |
| 82 | + make.top.mas_equalTo(40); | |
| 83 | + make.width.equalTo(self); | |
| 84 | + make.height.mas_equalTo(40); | |
| 85 | + }]; | |
| 86 | + | |
| 87 | + [self.retryBtn mas_makeConstraints:^(MASConstraintMaker *make) { | |
| 88 | + make.width.mas_equalTo(70); | |
| 89 | + make.height.mas_equalTo(40); | |
| 90 | + make.center.equalTo(self); | |
| 91 | + }]; | |
| 92 | + | |
| 93 | +} | |
| 94 | + | |
| 95 | +#pragma mark - | |
| 96 | +#pragma mark - getter | |
| 97 | + | |
| 98 | +- (UIActivityIndicatorView *)loadingView | |
| 99 | +{ | |
| 100 | + if (!_loadingView) { | |
| 101 | + _loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; | |
| 102 | + } | |
| 103 | + return _loadingView; | |
| 104 | +} | |
| 105 | + | |
| 106 | +- (UILabel *)loadingLab | |
| 107 | +{ | |
| 108 | + if (!_loadingLab) { | |
| 109 | + _loadingLab = [[UILabel alloc] init]; | |
| 110 | + _loadingLab.text = @"努力加载中..."; | |
| 111 | + _loadingLab.textColor = [UIColor whiteColor]; | |
| 112 | + _loadingLab.textAlignment = NSTextAlignmentCenter; | |
| 113 | + } | |
| 114 | + return _loadingLab; | |
| 115 | +} | |
| 116 | + | |
| 117 | +- (UIButton *)retryBtn | |
| 118 | +{ | |
| 119 | + if (!_retryBtn) { | |
| 120 | + _retryBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | |
| 121 | + [_retryBtn setTitle:@"重试" forState:UIControlStateNormal]; | |
| 122 | + [_retryBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; | |
| 123 | + _retryBtn.hidden = YES; | |
| 124 | + _retryBtn.layer.cornerRadius = 10; | |
| 125 | + _retryBtn.layer.masksToBounds = YES; | |
| 126 | + _retryBtn.layer.borderColor = [UIColor blackColor].CGColor; | |
| 127 | + _retryBtn.layer.borderWidth = 1; | |
| 128 | + [_retryBtn addTarget:self action:@selector(retryBtnAction) forControlEvents:UIControlEventTouchUpInside]; | |
| 129 | + } | |
| 130 | + return _retryBtn; | |
| 131 | +} | |
| 132 | + | |
| 133 | +/* | |
| 134 | +// Only override drawRect: if you perform custom drawing. | |
| 135 | +// An empty implementation adversely affects performance during animation. | |
| 136 | +- (void)drawRect:(CGRect)rect { | |
| 137 | + // Drawing code | |
| 138 | +} | |
| 139 | +*/ | |
| 140 | + | |
| 141 | +@end | ... | ... |
LiveVideoCloud/LiveVideoCloud/Info.plist
| ... | ... | @@ -2,6 +2,8 @@ |
| 2 | 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
| 3 | 3 | <plist version="1.0"> |
| 4 | 4 | <dict> |
| 5 | + <key>UIViewControllerBasedStatusBarAppearance</key> | |
| 6 | + <false/> | |
| 5 | 7 | <key>CFBundleDevelopmentRegion</key> |
| 6 | 8 | <string>en</string> |
| 7 | 9 | <key>CFBundleExecutable</key> |
| ... | ... | @@ -20,16 +22,25 @@ |
| 20 | 22 | <string>1</string> |
| 21 | 23 | <key>LSRequiresIPhoneOS</key> |
| 22 | 24 | <true/> |
| 25 | + <key>NSAppTransportSecurity</key> | |
| 26 | + <dict> | |
| 27 | + <key>NSAllowsArbitraryLoads</key> | |
| 28 | + <true/> | |
| 29 | + </dict> | |
| 30 | + <key>NSCameraUsageDescription</key> | |
| 31 | + <string></string> | |
| 32 | + <key>NSMicrophoneUsageDescription</key> | |
| 33 | + <string></string> | |
| 23 | 34 | <key>UILaunchStoryboardName</key> |
| 24 | 35 | <string>LaunchScreen</string> |
| 25 | - <key>UIMainStoryboardFile</key> | |
| 26 | - <string>Main</string> | |
| 27 | 36 | <key>UIRequiredDeviceCapabilities</key> |
| 28 | 37 | <array> |
| 29 | 38 | <string>armv7</string> |
| 30 | 39 | </array> |
| 31 | 40 | <key>UISupportedInterfaceOrientations</key> |
| 32 | 41 | <array> |
| 42 | + <string>UIInterfaceOrientationLandscapeLeft</string> | |
| 43 | + <string>UIInterfaceOrientationLandscapeRight</string> | |
| 33 | 44 | <string>UIInterfaceOrientationPortrait</string> |
| 34 | 45 | </array> |
| 35 | 46 | <key>UISupportedInterfaceOrientations~ipad</key> | ... | ... |