Commit 05954dd78a79ea245db768c75ed3737fb47afb79
Merge branch 'master' of bj.gitlab.cnlive.com:ios-team/LiveVideoCloud
Showing
80 changed files
with
2604 additions
and
452 deletions
LiveVideoCloud/LiveVideoCloud.xcodeproj/project.pbxproj
| @@ -122,15 +122,21 @@ | @@ -122,15 +122,21 @@ | ||
| 122 | D2029D091E6EAE2E0027CD92 /* Foundation+Log.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029CF21E6EAE2E0027CD92 /* Foundation+Log.m */; }; | 122 | D2029D091E6EAE2E0027CD92 /* Foundation+Log.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029CF21E6EAE2E0027CD92 /* Foundation+Log.m */; }; |
| 123 | D2029D0A1E6EAE2E0027CD92 /* ZXServerUrl.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029CFE1E6EAE2E0027CD92 /* ZXServerUrl.m */; }; | 123 | D2029D0A1E6EAE2E0027CD92 /* ZXServerUrl.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029CFE1E6EAE2E0027CD92 /* ZXServerUrl.m */; }; |
| 124 | D2029D161E6EB00D0027CD92 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029D151E6EB00D0027CD92 /* AppDelegate.m */; }; | 124 | D2029D161E6EB00D0027CD92 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029D151E6EB00D0027CD92 /* AppDelegate.m */; }; |
| 125 | + D217A24A1E7B76C7003B44CB /* PresentView.m in Sources */ = {isa = PBXBuildFile; fileRef = D217A2471E7B76C7003B44CB /* PresentView.m */; }; | ||
| 126 | + D217A24B1E7B76C7003B44CB /* PresentViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D217A2491E7B76C7003B44CB /* PresentViewCell.m */; }; | ||
| 127 | + D217A24E1E7B77C7003B44CB /* ComboCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D217A24D1E7B77C7003B44CB /* ComboCell.m */; }; | ||
| 125 | D22830F11E778C0F00627701 /* LiveBaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22830F01E778C0F00627701 /* LiveBaseView.m */; }; | 128 | D22830F11E778C0F00627701 /* LiveBaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22830F01E778C0F00627701 /* LiveBaseView.m */; }; |
| 126 | D22830FC1E77C2D900627701 /* BottomToolView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22830FB1E77C2D900627701 /* BottomToolView.m */; }; | 129 | D22830FC1E77C2D900627701 /* BottomToolView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22830FB1E77C2D900627701 /* BottomToolView.m */; }; |
| 127 | D22830FF1E77C69E00627701 /* GiftListView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22830FE1E77C69E00627701 /* GiftListView.m */; }; | 130 | D22830FF1E77C69E00627701 /* GiftListView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22830FE1E77C69E00627701 /* GiftListView.m */; }; |
| 128 | - D22831021E77D83C00627701 /* GiftModelView.m in Sources */ = {isa = PBXBuildFile; fileRef = D22831011E77D83C00627701 /* GiftModelView.m */; }; | ||
| 129 | D22831091E77D8D500627701 /* GiftModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D22831081E77D8D500627701 /* GiftModel.m */; }; | 131 | D22831091E77D8D500627701 /* GiftModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D22831081E77D8D500627701 /* GiftModel.m */; }; |
| 132 | + D236967E1E7F9E4100E4BF71 /* GiftPayButton.m in Sources */ = {isa = PBXBuildFile; fileRef = D236967D1E7F9E4100E4BF71 /* GiftPayButton.m */; }; | ||
| 133 | + D23696841E7FC6A900E4BF71 /* chatListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D23696831E7FC6A900E4BF71 /* chatListCell.m */; }; | ||
| 134 | + D236968D1E7FC7C200E4BF71 /* CNBarrageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D236968A1E7FC7C200E4BF71 /* CNBarrageManager.m */; }; | ||
| 135 | + D236968E1E7FC7C200E4BF71 /* CNBarrageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D236968C1E7FC7C200E4BF71 /* CNBarrageView.m */; }; | ||
| 136 | + D23696921E7FC83800E4BF71 /* chatMsgModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D23696911E7FC83800E4BF71 /* chatMsgModel.m */; }; | ||
| 130 | D25530001E7909AC00DF38A5 /* GiftAnimOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D2552FFF1E7909AC00DF38A5 /* GiftAnimOperation.m */; }; | 137 | D25530001E7909AC00DF38A5 /* GiftAnimOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D2552FFF1E7909AC00DF38A5 /* GiftAnimOperation.m */; }; |
| 131 | D25530031E79115100DF38A5 /* AnimQueueManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D25530021E79115100DF38A5 /* AnimQueueManager.m */; }; | 138 | D25530031E79115100DF38A5 /* AnimQueueManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D25530021E79115100DF38A5 /* AnimQueueManager.m */; }; |
| 132 | D25530061E7911A800DF38A5 /* GiftAnimationAction.m in Sources */ = {isa = PBXBuildFile; fileRef = D25530051E7911A800DF38A5 /* GiftAnimationAction.m */; }; | 139 | D25530061E7911A800DF38A5 /* GiftAnimationAction.m in Sources */ = {isa = PBXBuildFile; fileRef = D25530051E7911A800DF38A5 /* GiftAnimationAction.m */; }; |
| 133 | - D25530091E791A7100DF38A5 /* GiftComboView.m in Sources */ = {isa = PBXBuildFile; fileRef = D25530081E791A7100DF38A5 /* GiftComboView.m */; }; | ||
| 134 | D255300C1E793F8200DF38A5 /* NHFighterView+animDelegagte.m in Sources */ = {isa = PBXBuildFile; fileRef = D255300B1E793F8200DF38A5 /* NHFighterView+animDelegagte.m */; }; | 140 | D255300C1E793F8200DF38A5 /* NHFighterView+animDelegagte.m in Sources */ = {isa = PBXBuildFile; fileRef = D255300B1E793F8200DF38A5 /* NHFighterView+animDelegagte.m */; }; |
| 135 | D2575C461E76857100E3A8FC /* LVCAnimationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C451E76857100E3A8FC /* LVCAnimationManager.m */; }; | 141 | D2575C461E76857100E3A8FC /* LVCAnimationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C451E76857100E3A8FC /* LVCAnimationManager.m */; }; |
| 136 | D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C481E7685DE00E3A8FC /* UIView+Bubbling.m */; }; | 142 | D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */ = {isa = PBXBuildFile; fileRef = D2575C481E7685DE00E3A8FC /* UIView+Bubbling.m */; }; |
| @@ -443,24 +449,37 @@ | @@ -443,24 +449,37 @@ | ||
| 443 | D2029CFF1E6EAE2E0027CD92 /* UtilKits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UtilKits.h; sourceTree = "<group>"; }; | 449 | D2029CFF1E6EAE2E0027CD92 /* UtilKits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UtilKits.h; sourceTree = "<group>"; }; |
| 444 | D2029D121E6EAF8D0027CD92 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; }; | 450 | D2029D121E6EAF8D0027CD92 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; }; |
| 445 | D2029D151E6EB00D0027CD92 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; }; | 451 | D2029D151E6EB00D0027CD92 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; }; |
| 452 | + D217A2451E7B76C7003B44CB /* PresentModelAble.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PresentModelAble.h; sourceTree = "<group>"; }; | ||
| 453 | + D217A2461E7B76C7003B44CB /* PresentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PresentView.h; sourceTree = "<group>"; }; | ||
| 454 | + D217A2471E7B76C7003B44CB /* PresentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PresentView.m; sourceTree = "<group>"; }; | ||
| 455 | + D217A2481E7B76C7003B44CB /* PresentViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PresentViewCell.h; sourceTree = "<group>"; }; | ||
| 456 | + D217A2491E7B76C7003B44CB /* PresentViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PresentViewCell.m; sourceTree = "<group>"; }; | ||
| 457 | + D217A24C1E7B77C7003B44CB /* ComboCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ComboCell.h; path = Present/ComboCell.h; sourceTree = "<group>"; }; | ||
| 458 | + D217A24D1E7B77C7003B44CB /* ComboCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ComboCell.m; path = Present/ComboCell.m; sourceTree = "<group>"; }; | ||
| 446 | D22830EF1E778C0F00627701 /* LiveBaseView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiveBaseView.h; sourceTree = "<group>"; }; | 459 | D22830EF1E778C0F00627701 /* LiveBaseView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiveBaseView.h; sourceTree = "<group>"; }; |
| 447 | D22830F01E778C0F00627701 /* LiveBaseView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LiveBaseView.m; sourceTree = "<group>"; }; | 460 | D22830F01E778C0F00627701 /* LiveBaseView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LiveBaseView.m; sourceTree = "<group>"; }; |
| 448 | D22830FA1E77C2D900627701 /* BottomToolView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BottomToolView.h; sourceTree = "<group>"; }; | 461 | D22830FA1E77C2D900627701 /* BottomToolView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BottomToolView.h; sourceTree = "<group>"; }; |
| 449 | D22830FB1E77C2D900627701 /* BottomToolView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BottomToolView.m; sourceTree = "<group>"; }; | 462 | D22830FB1E77C2D900627701 /* BottomToolView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BottomToolView.m; sourceTree = "<group>"; }; |
| 450 | D22830FD1E77C69E00627701 /* GiftListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftListView.h; sourceTree = "<group>"; }; | 463 | D22830FD1E77C69E00627701 /* GiftListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftListView.h; sourceTree = "<group>"; }; |
| 451 | D22830FE1E77C69E00627701 /* GiftListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftListView.m; sourceTree = "<group>"; }; | 464 | D22830FE1E77C69E00627701 /* GiftListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftListView.m; sourceTree = "<group>"; }; |
| 452 | - D22831001E77D83C00627701 /* GiftModelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftModelView.h; sourceTree = "<group>"; }; | ||
| 453 | - D22831011E77D83C00627701 /* GiftModelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftModelView.m; sourceTree = "<group>"; }; | ||
| 454 | D22831071E77D8D500627701 /* GiftModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftModel.h; sourceTree = "<group>"; }; | 465 | D22831071E77D8D500627701 /* GiftModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftModel.h; sourceTree = "<group>"; }; |
| 455 | D22831081E77D8D500627701 /* GiftModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftModel.m; sourceTree = "<group>"; }; | 466 | D22831081E77D8D500627701 /* GiftModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftModel.m; sourceTree = "<group>"; }; |
| 467 | + D236967C1E7F9E4100E4BF71 /* GiftPayButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftPayButton.h; sourceTree = "<group>"; }; | ||
| 468 | + D236967D1E7F9E4100E4BF71 /* GiftPayButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftPayButton.m; sourceTree = "<group>"; }; | ||
| 469 | + D23696821E7FC6A900E4BF71 /* chatListCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chatListCell.h; sourceTree = "<group>"; }; | ||
| 470 | + D23696831E7FC6A900E4BF71 /* chatListCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = chatListCell.m; sourceTree = "<group>"; }; | ||
| 471 | + D23696891E7FC7C200E4BF71 /* CNBarrageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNBarrageManager.h; sourceTree = "<group>"; }; | ||
| 472 | + D236968A1E7FC7C200E4BF71 /* CNBarrageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CNBarrageManager.m; sourceTree = "<group>"; }; | ||
| 473 | + D236968B1E7FC7C200E4BF71 /* CNBarrageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNBarrageView.h; sourceTree = "<group>"; }; | ||
| 474 | + D236968C1E7FC7C200E4BF71 /* CNBarrageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CNBarrageView.m; sourceTree = "<group>"; }; | ||
| 475 | + D23696901E7FC83800E4BF71 /* chatMsgModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chatMsgModel.h; sourceTree = "<group>"; }; | ||
| 476 | + D23696911E7FC83800E4BF71 /* chatMsgModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = chatMsgModel.m; sourceTree = "<group>"; }; | ||
| 456 | D2552FFE1E7909AC00DF38A5 /* GiftAnimOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftAnimOperation.h; sourceTree = "<group>"; }; | 477 | D2552FFE1E7909AC00DF38A5 /* GiftAnimOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftAnimOperation.h; sourceTree = "<group>"; }; |
| 457 | D2552FFF1E7909AC00DF38A5 /* GiftAnimOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftAnimOperation.m; sourceTree = "<group>"; }; | 478 | D2552FFF1E7909AC00DF38A5 /* GiftAnimOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftAnimOperation.m; sourceTree = "<group>"; }; |
| 458 | D25530011E79115100DF38A5 /* AnimQueueManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimQueueManager.h; sourceTree = "<group>"; }; | 479 | D25530011E79115100DF38A5 /* AnimQueueManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimQueueManager.h; sourceTree = "<group>"; }; |
| 459 | D25530021E79115100DF38A5 /* AnimQueueManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnimQueueManager.m; sourceTree = "<group>"; }; | 480 | D25530021E79115100DF38A5 /* AnimQueueManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnimQueueManager.m; sourceTree = "<group>"; }; |
| 460 | D25530041E7911A800DF38A5 /* GiftAnimationAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftAnimationAction.h; sourceTree = "<group>"; }; | 481 | D25530041E7911A800DF38A5 /* GiftAnimationAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftAnimationAction.h; sourceTree = "<group>"; }; |
| 461 | D25530051E7911A800DF38A5 /* GiftAnimationAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftAnimationAction.m; sourceTree = "<group>"; }; | 482 | D25530051E7911A800DF38A5 /* GiftAnimationAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftAnimationAction.m; sourceTree = "<group>"; }; |
| 462 | - D25530071E791A7100DF38A5 /* GiftComboView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GiftComboView.h; sourceTree = "<group>"; }; | ||
| 463 | - D25530081E791A7100DF38A5 /* GiftComboView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GiftComboView.m; sourceTree = "<group>"; }; | ||
| 464 | D255300A1E793F8200DF38A5 /* NHFighterView+animDelegagte.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NHFighterView+animDelegagte.h"; sourceTree = "<group>"; }; | 483 | D255300A1E793F8200DF38A5 /* NHFighterView+animDelegagte.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NHFighterView+animDelegagte.h"; sourceTree = "<group>"; }; |
| 465 | D255300B1E793F8200DF38A5 /* NHFighterView+animDelegagte.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NHFighterView+animDelegagte.m"; sourceTree = "<group>"; }; | 484 | D255300B1E793F8200DF38A5 /* NHFighterView+animDelegagte.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NHFighterView+animDelegagte.m"; sourceTree = "<group>"; }; |
| 466 | D2575C441E76857100E3A8FC /* LVCAnimationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LVCAnimationManager.h; path = ../LVCAnimationManager.h; sourceTree = "<group>"; }; | 485 | D2575C441E76857100E3A8FC /* LVCAnimationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LVCAnimationManager.h; path = ../LVCAnimationManager.h; sourceTree = "<group>"; }; |
| @@ -1174,13 +1193,25 @@ | @@ -1174,13 +1193,25 @@ | ||
| 1174 | path = AppDelegate; | 1193 | path = AppDelegate; |
| 1175 | sourceTree = "<group>"; | 1194 | sourceTree = "<group>"; |
| 1176 | }; | 1195 | }; |
| 1196 | + D217A2441E7B76C7003B44CB /* Present */ = { | ||
| 1197 | + isa = PBXGroup; | ||
| 1198 | + children = ( | ||
| 1199 | + D217A2451E7B76C7003B44CB /* PresentModelAble.h */, | ||
| 1200 | + D217A2461E7B76C7003B44CB /* PresentView.h */, | ||
| 1201 | + D217A2471E7B76C7003B44CB /* PresentView.m */, | ||
| 1202 | + D217A2481E7B76C7003B44CB /* PresentViewCell.h */, | ||
| 1203 | + D217A2491E7B76C7003B44CB /* PresentViewCell.m */, | ||
| 1204 | + ); | ||
| 1205 | + path = Present; | ||
| 1206 | + sourceTree = "<group>"; | ||
| 1207 | + }; | ||
| 1177 | D22830F51E77C24900627701 /* GiftViews */ = { | 1208 | D22830F51E77C24900627701 /* GiftViews */ = { |
| 1178 | isa = PBXGroup; | 1209 | isa = PBXGroup; |
| 1179 | children = ( | 1210 | children = ( |
| 1180 | D22830FD1E77C69E00627701 /* GiftListView.h */, | 1211 | D22830FD1E77C69E00627701 /* GiftListView.h */, |
| 1181 | D22830FE1E77C69E00627701 /* GiftListView.m */, | 1212 | D22830FE1E77C69E00627701 /* GiftListView.m */, |
| 1182 | - D22831001E77D83C00627701 /* GiftModelView.h */, | ||
| 1183 | - D22831011E77D83C00627701 /* GiftModelView.m */, | 1213 | + D236967C1E7F9E4100E4BF71 /* GiftPayButton.h */, |
| 1214 | + D236967D1E7F9E4100E4BF71 /* GiftPayButton.m */, | ||
| 1184 | ); | 1215 | ); |
| 1185 | path = GiftViews; | 1216 | path = GiftViews; |
| 1186 | sourceTree = "<group>"; | 1217 | sourceTree = "<group>"; |
| @@ -1188,6 +1219,8 @@ | @@ -1188,6 +1219,8 @@ | ||
| 1188 | D22830F61E77C26C00627701 /* Chat */ = { | 1219 | D22830F61E77C26C00627701 /* Chat */ = { |
| 1189 | isa = PBXGroup; | 1220 | isa = PBXGroup; |
| 1190 | children = ( | 1221 | children = ( |
| 1222 | + D23696881E7FC7C200E4BF71 /* Barrage */, | ||
| 1223 | + D236968F1E7FC83800E4BF71 /* ChatMsgModel */, | ||
| 1191 | D22830F71E77C27A00627701 /* ChatViews */, | 1224 | D22830F71E77C27A00627701 /* ChatViews */, |
| 1192 | ); | 1225 | ); |
| 1193 | path = Chat; | 1226 | path = Chat; |
| @@ -1196,6 +1229,8 @@ | @@ -1196,6 +1229,8 @@ | ||
| 1196 | D22830F71E77C27A00627701 /* ChatViews */ = { | 1229 | D22830F71E77C27A00627701 /* ChatViews */ = { |
| 1197 | isa = PBXGroup; | 1230 | isa = PBXGroup; |
| 1198 | children = ( | 1231 | children = ( |
| 1232 | + D23696821E7FC6A900E4BF71 /* chatListCell.h */, | ||
| 1233 | + D23696831E7FC6A900E4BF71 /* chatListCell.m */, | ||
| 1199 | ); | 1234 | ); |
| 1200 | path = ChatViews; | 1235 | path = ChatViews; |
| 1201 | sourceTree = "<group>"; | 1236 | sourceTree = "<group>"; |
| @@ -1225,6 +1260,26 @@ | @@ -1225,6 +1260,26 @@ | ||
| 1225 | path = GiftModel; | 1260 | path = GiftModel; |
| 1226 | sourceTree = "<group>"; | 1261 | sourceTree = "<group>"; |
| 1227 | }; | 1262 | }; |
| 1263 | + D23696881E7FC7C200E4BF71 /* Barrage */ = { | ||
| 1264 | + isa = PBXGroup; | ||
| 1265 | + children = ( | ||
| 1266 | + D23696891E7FC7C200E4BF71 /* CNBarrageManager.h */, | ||
| 1267 | + D236968A1E7FC7C200E4BF71 /* CNBarrageManager.m */, | ||
| 1268 | + D236968B1E7FC7C200E4BF71 /* CNBarrageView.h */, | ||
| 1269 | + D236968C1E7FC7C200E4BF71 /* CNBarrageView.m */, | ||
| 1270 | + ); | ||
| 1271 | + path = Barrage; | ||
| 1272 | + sourceTree = "<group>"; | ||
| 1273 | + }; | ||
| 1274 | + D236968F1E7FC83800E4BF71 /* ChatMsgModel */ = { | ||
| 1275 | + isa = PBXGroup; | ||
| 1276 | + children = ( | ||
| 1277 | + D23696901E7FC83800E4BF71 /* chatMsgModel.h */, | ||
| 1278 | + D23696911E7FC83800E4BF71 /* chatMsgModel.m */, | ||
| 1279 | + ); | ||
| 1280 | + path = ChatMsgModel; | ||
| 1281 | + sourceTree = "<group>"; | ||
| 1282 | + }; | ||
| 1228 | D2575C431E76846900E3A8FC /* InteractionSections */ = { | 1283 | D2575C431E76846900E3A8FC /* InteractionSections */ = { |
| 1229 | isa = PBXGroup; | 1284 | isa = PBXGroup; |
| 1230 | children = ( | 1285 | children = ( |
| @@ -1255,8 +1310,9 @@ | @@ -1255,8 +1310,9 @@ | ||
| 1255 | D2575C681E76A42B00E3A8FC /* Gift */ = { | 1310 | D2575C681E76A42B00E3A8FC /* Gift */ = { |
| 1256 | isa = PBXGroup; | 1311 | isa = PBXGroup; |
| 1257 | children = ( | 1312 | children = ( |
| 1258 | - D25530071E791A7100DF38A5 /* GiftComboView.h */, | ||
| 1259 | - D25530081E791A7100DF38A5 /* GiftComboView.m */, | 1313 | + D217A2441E7B76C7003B44CB /* Present */, |
| 1314 | + D217A24C1E7B77C7003B44CB /* ComboCell.h */, | ||
| 1315 | + D217A24D1E7B77C7003B44CB /* ComboCell.m */, | ||
| 1260 | D25530041E7911A800DF38A5 /* GiftAnimationAction.h */, | 1316 | D25530041E7911A800DF38A5 /* GiftAnimationAction.h */, |
| 1261 | D25530051E7911A800DF38A5 /* GiftAnimationAction.m */, | 1317 | D25530051E7911A800DF38A5 /* GiftAnimationAction.m */, |
| 1262 | D25530011E79115100DF38A5 /* AnimQueueManager.h */, | 1318 | D25530011E79115100DF38A5 /* AnimQueueManager.h */, |
| @@ -1602,7 +1658,6 @@ | @@ -1602,7 +1658,6 @@ | ||
| 1602 | isa = PBXSourcesBuildPhase; | 1658 | isa = PBXSourcesBuildPhase; |
| 1603 | buildActionMask = 2147483647; | 1659 | buildActionMask = 2147483647; |
| 1604 | files = ( | 1660 | files = ( |
| 1605 | - D25530091E791A7100DF38A5 /* GiftComboView.m in Sources */, | ||
| 1606 | D2029CC31E6EADE10027CD92 /* UIImageView+HighlightedWebCache.m in Sources */, | 1661 | D2029CC31E6EADE10027CD92 /* UIImageView+HighlightedWebCache.m in Sources */, |
| 1607 | D22830FF1E77C69E00627701 /* GiftListView.m in Sources */, | 1662 | D22830FF1E77C69E00627701 /* GiftListView.m in Sources */, |
| 1608 | D2029CC01E6EADE10027CD92 /* UIImage+GIF.m in Sources */, | 1663 | D2029CC01E6EADE10027CD92 /* UIImage+GIF.m in Sources */, |
| @@ -1622,6 +1677,7 @@ | @@ -1622,6 +1677,7 @@ | ||
| 1622 | D2029CCD1E6EADE10027CD92 /* SearchModel.m in Sources */, | 1677 | D2029CCD1E6EADE10027CD92 /* SearchModel.m in Sources */, |
| 1623 | 810B65051E779B1F00133E15 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, | 1678 | 810B65051E779B1F00133E15 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, |
| 1624 | D2029CCB1E6EADE10027CD92 /* SVRadialGradientLayer.m in Sources */, | 1679 | D2029CCB1E6EADE10027CD92 /* SVRadialGradientLayer.m in Sources */, |
| 1680 | + D23696841E7FC6A900E4BF71 /* chatListCell.m in Sources */, | ||
| 1625 | D2029CAF1E6EADE10027CD92 /* MJRefreshStateHeader.m in Sources */, | 1681 | D2029CAF1E6EADE10027CD92 /* MJRefreshStateHeader.m in Sources */, |
| 1626 | D2029C941E6EADE10027CD92 /* UIRefreshControl+AFNetworking.m in Sources */, | 1682 | D2029C941E6EADE10027CD92 /* UIRefreshControl+AFNetworking.m in Sources */, |
| 1627 | D2029C911E6EADE10027CD92 /* UIButton+AFNetworking.m in Sources */, | 1683 | D2029C911E6EADE10027CD92 /* UIButton+AFNetworking.m in Sources */, |
| @@ -1644,6 +1700,7 @@ | @@ -1644,6 +1700,7 @@ | ||
| 1644 | D2029CA11E6EADE10027CD92 /* NSString+MJExtension.m in Sources */, | 1700 | D2029CA11E6EADE10027CD92 /* NSString+MJExtension.m in Sources */, |
| 1645 | D2029BCB1E6EADD70027CD92 /* BaseTableViewCell.m in Sources */, | 1701 | D2029BCB1E6EADD70027CD92 /* BaseTableViewCell.m in Sources */, |
| 1646 | D2029CAA1E6EADE10027CD92 /* MJRefreshBackGifFooter.m in Sources */, | 1702 | D2029CAA1E6EADE10027CD92 /* MJRefreshBackGifFooter.m in Sources */, |
| 1703 | + D217A24B1E7B76C7003B44CB /* PresentViewCell.m in Sources */, | ||
| 1647 | D2029C9B1E6EADE10027CD92 /* MJPropertyKey.m in Sources */, | 1704 | D2029C9B1E6EADE10027CD92 /* MJPropertyKey.m in Sources */, |
| 1648 | D2029CBF1E6EADE10027CD92 /* UIButton+WebCache.m in Sources */, | 1705 | D2029CBF1E6EADE10027CD92 /* UIButton+WebCache.m in Sources */, |
| 1649 | 810B64E31E779AFE00133E15 /* LVCLivePlayerController.m in Sources */, | 1706 | 810B64E31E779AFE00133E15 /* LVCLivePlayerController.m in Sources */, |
| @@ -1658,9 +1715,9 @@ | @@ -1658,9 +1715,9 @@ | ||
| 1658 | D2029CA31E6EADE10027CD92 /* MJRefreshBackFooter.m in Sources */, | 1715 | D2029CA31E6EADE10027CD92 /* MJRefreshBackFooter.m in Sources */, |
| 1659 | D255300C1E793F8200DF38A5 /* NHFighterView+animDelegagte.m in Sources */, | 1716 | D255300C1E793F8200DF38A5 /* NHFighterView+animDelegagte.m in Sources */, |
| 1660 | D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */, | 1717 | D2575C4A1E7685DE00E3A8FC /* UIView+Bubbling.m in Sources */, |
| 1661 | - D22831021E77D83C00627701 /* GiftModelView.m in Sources */, | ||
| 1662 | D2029CA61E6EADE10027CD92 /* MJRefreshHeader.m in Sources */, | 1718 | D2029CA61E6EADE10027CD92 /* MJRefreshHeader.m in Sources */, |
| 1663 | D2029CC41E6EADE10027CD92 /* UIImageView+WebCache.m in Sources */, | 1719 | D2029CC41E6EADE10027CD92 /* UIImageView+WebCache.m in Sources */, |
| 1720 | + D236967E1E7F9E4100E4BF71 /* GiftPayButton.m in Sources */, | ||
| 1664 | D2029CC81E6EADE10027CD92 /* SVProgressAnimatedView.m in Sources */, | 1721 | D2029CC81E6EADE10027CD92 /* SVProgressAnimatedView.m in Sources */, |
| 1665 | D2029C961E6EADE10027CD92 /* MBProgressHUD.m in Sources */, | 1722 | D2029C961E6EADE10027CD92 /* MBProgressHUD.m in Sources */, |
| 1666 | 810B65071E779B1F00133E15 /* ViewController+MASAdditions.m in Sources */, | 1723 | 810B65071E779B1F00133E15 /* ViewController+MASAdditions.m in Sources */, |
| @@ -1671,6 +1728,7 @@ | @@ -1671,6 +1728,7 @@ | ||
| 1671 | D2029C981E6EADE10027CD92 /* MJExtensionConst.m in Sources */, | 1728 | D2029C981E6EADE10027CD92 /* MJExtensionConst.m in Sources */, |
| 1672 | D2575C671E76A25400E3A8FC /* LVCInteractionController.m in Sources */, | 1729 | D2575C671E76A25400E3A8FC /* LVCInteractionController.m in Sources */, |
| 1673 | D2029CAE1E6EADE10027CD92 /* MJRefreshNormalHeader.m in Sources */, | 1730 | D2029CAE1E6EADE10027CD92 /* MJRefreshNormalHeader.m in Sources */, |
| 1731 | + D23696921E7FC83800E4BF71 /* chatMsgModel.m in Sources */, | ||
| 1674 | D2029C901E6EADE10027CD92 /* UIActivityIndicatorView+AFNetworking.m in Sources */, | 1732 | D2029C901E6EADE10027CD92 /* UIActivityIndicatorView+AFNetworking.m in Sources */, |
| 1675 | D2029CC61E6EADE10027CD92 /* SSKeychain.m in Sources */, | 1733 | D2029CC61E6EADE10027CD92 /* SSKeychain.m in Sources */, |
| 1676 | D2029C8B1E6EADE10027CD92 /* AFURLResponseSerialization.m in Sources */, | 1734 | D2029C8B1E6EADE10027CD92 /* AFURLResponseSerialization.m in Sources */, |
| @@ -1682,6 +1740,7 @@ | @@ -1682,6 +1740,7 @@ | ||
| 1682 | D2029D041E6EAE2E0027CD92 /* UILabel+ContentSize.m in Sources */, | 1740 | D2029D041E6EAE2E0027CD92 /* UILabel+ContentSize.m in Sources */, |
| 1683 | D25530031E79115100DF38A5 /* AnimQueueManager.m in Sources */, | 1741 | D25530031E79115100DF38A5 /* AnimQueueManager.m in Sources */, |
| 1684 | D2029C871E6EADE10027CD92 /* AFHTTPSessionManager.m in Sources */, | 1742 | D2029C871E6EADE10027CD92 /* AFHTTPSessionManager.m in Sources */, |
| 1743 | + D236968D1E7FC7C200E4BF71 /* CNBarrageManager.m in Sources */, | ||
| 1685 | D2029B861E6EAAA50027CD92 /* main.m in Sources */, | 1744 | D2029B861E6EAAA50027CD92 /* main.m in Sources */, |
| 1686 | D2029C8C1E6EADE10027CD92 /* AFURLSessionManager.m in Sources */, | 1745 | D2029C8C1E6EADE10027CD92 /* AFURLSessionManager.m in Sources */, |
| 1687 | D2029C9F1E6EADE10027CD92 /* NSObject+MJKeyValue.m in Sources */, | 1746 | D2029C9F1E6EADE10027CD92 /* NSObject+MJKeyValue.m in Sources */, |
| @@ -1704,6 +1763,7 @@ | @@ -1704,6 +1763,7 @@ | ||
| 1704 | D2029CCA1E6EADE10027CD92 /* SVProgressHUD.m in Sources */, | 1763 | D2029CCA1E6EADE10027CD92 /* SVProgressHUD.m in Sources */, |
| 1705 | D2029CA81E6EADE10027CD92 /* MJRefreshAutoNormalFooter.m in Sources */, | 1764 | D2029CA81E6EADE10027CD92 /* MJRefreshAutoNormalFooter.m in Sources */, |
| 1706 | D2029C891E6EADE10027CD92 /* AFSecurityPolicy.m in Sources */, | 1765 | D2029C891E6EADE10027CD92 /* AFSecurityPolicy.m in Sources */, |
| 1766 | + D217A24A1E7B76C7003B44CB /* PresentView.m in Sources */, | ||
| 1707 | D22830F11E778C0F00627701 /* LiveBaseView.m in Sources */, | 1767 | D22830F11E778C0F00627701 /* LiveBaseView.m in Sources */, |
| 1708 | D2029CBA1E6EADE10027CD92 /* SDWebImageDecoder.m in Sources */, | 1768 | D2029CBA1E6EADE10027CD92 /* SDWebImageDecoder.m in Sources */, |
| 1709 | 8112D4311E7927A5002E00F6 /* LVCPlayerLoadingView.m in Sources */, | 1769 | 8112D4311E7927A5002E00F6 /* LVCPlayerLoadingView.m in Sources */, |
| @@ -1712,11 +1772,13 @@ | @@ -1712,11 +1772,13 @@ | ||
| 1712 | D2029BCD1E6EADD70027CD92 /* BaseViewController.m in Sources */, | 1772 | D2029BCD1E6EADD70027CD92 /* BaseViewController.m in Sources */, |
| 1713 | 810B64E01E779AE900133E15 /* LVCPlayer.m in Sources */, | 1773 | 810B64E01E779AE900133E15 /* LVCPlayer.m in Sources */, |
| 1714 | 810B64FF1E779B1F00133E15 /* MASConstraint.m in Sources */, | 1774 | 810B64FF1E779B1F00133E15 /* MASConstraint.m in Sources */, |
| 1775 | + D236968E1E7FC7C200E4BF71 /* CNBarrageView.m in Sources */, | ||
| 1715 | D25BF87A1E7B8A82007FB138 /* FilterFunctionView.m in Sources */, | 1776 | D25BF87A1E7B8A82007FB138 /* FilterFunctionView.m in Sources */, |
| 1716 | D2029D001E6EAE2E0027CD92 /* NSNumber+ScaleHeight.m in Sources */, | 1777 | D2029D001E6EAE2E0027CD92 /* NSNumber+ScaleHeight.m in Sources */, |
| 1717 | D2888D9E1E6EBF1B003A77C8 /* LVCLiveViewController.m in Sources */, | 1778 | D2888D9E1E6EBF1B003A77C8 /* LVCLiveViewController.m in Sources */, |
| 1718 | D2029C951E6EADE10027CD92 /* UIWebView+AFNetworking.m in Sources */, | 1779 | D2029C951E6EADE10027CD92 /* UIWebView+AFNetworking.m in Sources */, |
| 1719 | 810B650A1E77B39D00133E15 /* LVCFullScreenPlayerController.m in Sources */, | 1780 | 810B650A1E77B39D00133E15 /* LVCFullScreenPlayerController.m in Sources */, |
| 1781 | + D217A24E1E7B77C7003B44CB /* ComboCell.m in Sources */, | ||
| 1720 | D2029CBD1E6EADE10027CD92 /* SDWebImageManager.m in Sources */, | 1782 | D2029CBD1E6EADE10027CD92 /* SDWebImageManager.m in Sources */, |
| 1721 | D2029CB41E6EADE10027CD92 /* UIView+MJExtension.m in Sources */, | 1783 | D2029CB41E6EADE10027CD92 /* UIView+MJExtension.m in Sources */, |
| 1722 | 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */, | 1784 | 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */, |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/BottomToolView/BottomToolView.m
| @@ -31,12 +31,16 @@ | @@ -31,12 +31,16 @@ | ||
| 31 | #pragma mark - buttonClick | 31 | #pragma mark - buttonClick |
| 32 | - (void)chatAction | 32 | - (void)chatAction |
| 33 | { | 33 | { |
| 34 | - | 34 | + if ([self.delegate respondsToSelector:@selector(bottomActionWithType:)]) { |
| 35 | + [self.delegate bottomActionWithType:BtnClickTypeChat]; | ||
| 36 | + } | ||
| 35 | } | 37 | } |
| 36 | 38 | ||
| 37 | - (void)privateChatAction | 39 | - (void)privateChatAction |
| 38 | { | 40 | { |
| 39 | - | 41 | + if ([self.delegate respondsToSelector:@selector(bottomActionWithType:)]) { |
| 42 | + [self.delegate bottomActionWithType:BtnClickTypePriChat]; | ||
| 43 | + } | ||
| 40 | } | 44 | } |
| 41 | 45 | ||
| 42 | - (void)giftAction | 46 | - (void)giftAction |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Chat/Barrage/CNBarrageManager.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNBarrageManager.h | ||
| 3 | +// personalXmppChatDemo | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2016/12/10. | ||
| 6 | +// Copyright © 2016年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +@class CNBarrageView; | ||
| 12 | +@class chatMsgModel; | ||
| 13 | +@interface CNBarrageManager : NSObject | ||
| 14 | + | ||
| 15 | +@property (nonatomic, copy) void(^generateBarrageBlock)(CNBarrageView *view);//生成弹幕View回调 | ||
| 16 | +@property (nonatomic) BOOL isStopBarrage;//是否关闭了弹幕 | ||
| 17 | +/** | ||
| 18 | + 开始弹幕根据新消息数组 | ||
| 19 | + | ||
| 20 | + @param newBarrageArray 新消息数组 | ||
| 21 | + */ | ||
| 22 | +- (void)startBarrageWithNewArray:(NSMutableArray <chatMsgModel *>*)newBarrageArray; | ||
| 23 | + | ||
| 24 | +/** | ||
| 25 | + 停止弹幕 | ||
| 26 | + */ | ||
| 27 | +- (void)stopBarrage; | ||
| 28 | + | ||
| 29 | + | ||
| 30 | + | ||
| 31 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Chat/Barrage/CNBarrageManager.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNBarrageManager.m | ||
| 3 | +// personalXmppChatDemo | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2016/12/10. | ||
| 6 | +// Copyright © 2016年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNBarrageManager.h" | ||
| 10 | +#import "CNBarrageView.h" | ||
| 11 | +#import "chatMsgModel.h" | ||
| 12 | + | ||
| 13 | +#define MAX_OVERLAP_COUNT 100 | ||
| 14 | + | ||
| 15 | +@interface CNBarrageManager () | ||
| 16 | + | ||
| 17 | +@property (nonatomic, strong) NSMutableArray *_Nullable allComments;//所有评论 | ||
| 18 | +@property (nonatomic, strong) NSMutableArray *_Nullable tmpComments;//临时评论 | ||
| 19 | +@property (nonatomic ,strong) NSMutableArray *_Nullable barrageQueue;//评论管理队列数组 | ||
| 20 | +@property (nonatomic ,strong) NSMutableArray *_Nullable trajectoryArr;//弹幕轨迹数组 | ||
| 21 | + | ||
| 22 | +@property BOOL isStarted;//标记是否开始弹幕 | ||
| 23 | +@property BOOL isStopAnimation;//标记是否停止弹幕 | ||
| 24 | + | ||
| 25 | +@end | ||
| 26 | + | ||
| 27 | +@implementation CNBarrageManager | ||
| 28 | + | ||
| 29 | +/** | ||
| 30 | + 开始弹幕根据新消息数组 | ||
| 31 | + | ||
| 32 | + @param newBarrageArray 新消息数组 | ||
| 33 | + */ | ||
| 34 | +- (void)startBarrageWithNewArray:(NSMutableArray <chatMsgModel *>*)newBarrageArray | ||
| 35 | +{ | ||
| 36 | + if (self.isStopAnimation && _isStopBarrage) { | ||
| 37 | + return; | ||
| 38 | + } | ||
| 39 | + [self.allComments addObjectsFromArray:newBarrageArray]; | ||
| 40 | + | ||
| 41 | + [self startBarrage]; | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +/** | ||
| 45 | + 开始弹幕 | ||
| 46 | + */ | ||
| 47 | +- (void)startBarrage | ||
| 48 | +{ | ||
| 49 | + if (self.tmpComments.count == 0) { | ||
| 50 | + [self.tmpComments addObjectsFromArray:self.allComments]; | ||
| 51 | + [self.allComments removeAllObjects]; | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + self.isStarted = YES; | ||
| 55 | + self.isStopAnimation = NO; | ||
| 56 | + [self initBarrageCommentView]; | ||
| 57 | +} | ||
| 58 | + | ||
| 59 | +/** | ||
| 60 | + 停止弹幕 | ||
| 61 | + */ | ||
| 62 | +- (void)stopBarrage | ||
| 63 | +{ | ||
| 64 | + self.isStopAnimation = YES; | ||
| 65 | + | ||
| 66 | + [self.barrageQueue enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { | ||
| 67 | + CNBarrageView *view = obj; | ||
| 68 | + [view stopAnimation]; | ||
| 69 | + view = nil; | ||
| 70 | + self.tmpComments = nil; | ||
| 71 | + self.allComments = nil; | ||
| 72 | + self.trajectoryArr = nil; | ||
| 73 | + }]; | ||
| 74 | + self.barrageQueue = nil; | ||
| 75 | +} | ||
| 76 | + | ||
| 77 | +/** | ||
| 78 | + 初始化弹幕的评论View | ||
| 79 | + */ | ||
| 80 | +- (void)initBarrageCommentView | ||
| 81 | +{ | ||
| 82 | + if(self.isStopAnimation)return; | ||
| 83 | + //初始化轨道位置随机 | ||
| 84 | + long count = self.tmpComments.count; | ||
| 85 | + for (int i = 0; i < count; i ++) { | ||
| 86 | + chatMsgModel *model = [self.tmpComments firstObject]; | ||
| 87 | + NSString *comment = model.content; | ||
| 88 | + NSString *userName = model.name; | ||
| 89 | + if (comment) { | ||
| 90 | + [self.tmpComments removeObjectAtIndex:0]; | ||
| 91 | + //根据当前未发送弹幕数量生成轨迹 | ||
| 92 | + NSString *trajectory; | ||
| 93 | + if (self.tmpComments.count > MAX_OVERLAP_COUNT) | ||
| 94 | + {//数量较多轨迹可重叠 | ||
| 95 | + trajectory = [self trajectoryOverlap:YES]; | ||
| 96 | + }else | ||
| 97 | + {//数量较少轨迹可能不重叠,但频率高会使轨迹数组已满,造成重叠 | ||
| 98 | + trajectory = [self trajectoryOverlap:NO]; | ||
| 99 | + } | ||
| 100 | + [self createBarrageComment:comment userName:userName trajectory:trajectory isMine:model.isMine]; //trajectory:trajectory isMine:model.isMine]; | ||
| 101 | + } | ||
| 102 | + else { | ||
| 103 | + //当弹幕没有时跳出循环 | ||
| 104 | + break; | ||
| 105 | + } | ||
| 106 | + } | ||
| 107 | +} | ||
| 108 | + | ||
| 109 | +/** | ||
| 110 | + 生成评论弹幕轨迹 | ||
| 111 | + | ||
| 112 | + @param isOverlap 是否重叠 | ||
| 113 | + @return 根据轨迹是否可重叠,生成对应的新轨迹 | ||
| 114 | + */ | ||
| 115 | +- (NSString *)trajectoryOverlap:(BOOL)isOverlap | ||
| 116 | +{ | ||
| 117 | + NSString *trajectory = @""; | ||
| 118 | + long arcIndex = arc4random() % MAX_BARRAGE_VERTICAL_COUNT; | ||
| 119 | + CGFloat tra = arcIndex * BARRAGE_VERTICAL_HEIGHT + (arcIndex - 1) * BARRAGE_VERTICAL_MARGIN; | ||
| 120 | +// NSLog(@"trajectory = %f ,%ld,%f,%ld,%f",tra,arcIndex,BARRAGE_VERTICAL_MARGIN,MAX_BARRAGE_VERTICAL_COUNT,BARRAGE_VERTICAL_MARGIN); | ||
| 121 | + if (isOverlap) { | ||
| 122 | + //生成可重叠的轨迹 | ||
| 123 | + trajectory = [NSString stringWithFormat:@"%f",tra]; | ||
| 124 | + [self.trajectoryArr addObject:trajectory]; | ||
| 125 | + return [NSString stringWithFormat:@"%f",tra]; | ||
| 126 | + } | ||
| 127 | + //生成不重叠的轨迹 | ||
| 128 | + do { | ||
| 129 | + arcIndex = arc4random() % MAX_BARRAGE_VERTICAL_COUNT; | ||
| 130 | + tra = arcIndex * BARRAGE_VERTICAL_HEIGHT + (arcIndex - 1) * BARRAGE_VERTICAL_MARGIN; | ||
| 131 | + trajectory = [NSString stringWithFormat:@"%f",tra]; | ||
| 132 | + if (self.trajectoryArr.count >= MAX_BARRAGE_VERTICAL_COUNT) break; | ||
| 133 | + | ||
| 134 | + } while ([self.trajectoryArr containsObject:trajectory]); | ||
| 135 | + if (self.trajectoryArr.count >= MAX_BARRAGE_VERTICAL_COUNT) | ||
| 136 | + {//当前轨迹数组已满,弹幕需要重叠显示 | ||
| 137 | + | ||
| 138 | + }else | ||
| 139 | + {//当前轨迹数组还没满,弹幕无需重叠 | ||
| 140 | + [self.trajectoryArr addObject:trajectory]; | ||
| 141 | + } | ||
| 142 | + return trajectory; | ||
| 143 | +} | ||
| 144 | + | ||
| 145 | +/** | ||
| 146 | + 下一条评论 | ||
| 147 | + | ||
| 148 | + @return 返回当前tmpComments的下一条评论数据 | ||
| 149 | + */ | ||
| 150 | +- (NSString *)nextComment { | ||
| 151 | + chatMsgModel *model = [self.tmpComments firstObject]; | ||
| 152 | + if (model.content) { | ||
| 153 | + [self.tmpComments removeObjectAtIndex:0]; | ||
| 154 | + } | ||
| 155 | + return model.content; | ||
| 156 | +} | ||
| 157 | + | ||
| 158 | +/** | ||
| 159 | + 创建评论弹幕,根据评论内容和弹幕轨迹 | ||
| 160 | + | ||
| 161 | + @param comment 评论内容 | ||
| 162 | + @param userName 用户名字 | ||
| 163 | + @param trajectory 弹幕轨迹 | ||
| 164 | + @param isMine 是否是我发的弹幕 | ||
| 165 | + */ | ||
| 166 | +- (void)createBarrageComment:(NSString *)comment userName:(NSString *)userName trajectory:(NSString *)trajectory isMine:(BOOL)isMine | ||
| 167 | +{ | ||
| 168 | + if (self.isStopAnimation) { | ||
| 169 | + return; | ||
| 170 | + } | ||
| 171 | + //创建一个弹幕view | ||
| 172 | + CNBarrageView *view = [[CNBarrageView alloc] initWithContent:comment userName:userName isMine:isMine]; | ||
| 173 | + | ||
| 174 | + //设置运行轨迹 | ||
| 175 | + view.trajectory = [trajectory floatValue]; | ||
| 176 | + weakself | ||
| 177 | + __weak CNBarrageView *weakBarrageView = view; | ||
| 178 | + view.moveBlock = ^(CommentMoveState status){ | ||
| 179 | + strongself | ||
| 180 | + if (self.isStopAnimation) { | ||
| 181 | + return; | ||
| 182 | + } | ||
| 183 | + switch (status) { | ||
| 184 | + case CommentMoveStateStart: | ||
| 185 | + { | ||
| 186 | + //弹幕开始,将view加入弹幕管理数组 | ||
| 187 | + [self.barrageQueue addObject:weakBarrageView]; | ||
| 188 | + } | ||
| 189 | + break; | ||
| 190 | + case CommentMoveStateEnter: | ||
| 191 | + { | ||
| 192 | + [self.trajectoryArr removeObject:trajectory]; | ||
| 193 | + //弹幕完全进入屏幕,判断接下来是否还有内容,如果有则在该弹幕轨迹队列中创建弹幕 | ||
| 194 | + NSString *comment = [self nextComment]; | ||
| 195 | + if (comment) { | ||
| 196 | + [self createBarrageComment:comment userName:userName trajectory:trajectory isMine:isMine]; | ||
| 197 | +// [self createBarrageComment:comment trajectory:trajectory isMine:isMine]; | ||
| 198 | + } | ||
| 199 | + else { | ||
| 200 | + //没有评论了 | ||
| 201 | + } | ||
| 202 | + } | ||
| 203 | + break; | ||
| 204 | + case CommentMoveStateEnd: | ||
| 205 | + { | ||
| 206 | + //弹幕飞出屏幕后从弹幕管理队列中删除 | ||
| 207 | + if ([self.barrageQueue containsObject:weakBarrageView]) { | ||
| 208 | + [self.barrageQueue removeObject:weakBarrageView]; | ||
| 209 | + } | ||
| 210 | + } | ||
| 211 | + break; | ||
| 212 | + default: | ||
| 213 | + break; | ||
| 214 | + } | ||
| 215 | + }; | ||
| 216 | + //弹幕生成后,传到Controller进行页面展示 | ||
| 217 | + if (self.generateBarrageBlock) { | ||
| 218 | + self.generateBarrageBlock(view); | ||
| 219 | + } | ||
| 220 | +} | ||
| 221 | + | ||
| 222 | +#pragma mark - getter | ||
| 223 | + | ||
| 224 | +- (NSMutableArray *)allComments { | ||
| 225 | + if (!_allComments) { | ||
| 226 | + _allComments = [NSMutableArray array]; | ||
| 227 | + } | ||
| 228 | + return _allComments; | ||
| 229 | +} | ||
| 230 | + | ||
| 231 | +- (NSMutableArray *)tmpComments { | ||
| 232 | + if (!_tmpComments) { | ||
| 233 | + _tmpComments = [NSMutableArray array]; | ||
| 234 | + } | ||
| 235 | + return _tmpComments; | ||
| 236 | +} | ||
| 237 | + | ||
| 238 | +- (NSMutableArray *)barrageQueue { | ||
| 239 | + if (!_barrageQueue) { | ||
| 240 | + _barrageQueue = [NSMutableArray array]; | ||
| 241 | + } | ||
| 242 | + return _barrageQueue; | ||
| 243 | +} | ||
| 244 | + | ||
| 245 | +- (NSMutableArray *)trajectoryArr { | ||
| 246 | + if (!_trajectoryArr) { | ||
| 247 | + _trajectoryArr = [NSMutableArray array]; | ||
| 248 | + } | ||
| 249 | + return _trajectoryArr; | ||
| 250 | +} | ||
| 251 | + | ||
| 252 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Chat/Barrage/CNBarrageView.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNBarrageView.h | ||
| 3 | +// personalXmppChatDemo | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2016/12/10. | ||
| 6 | +// Copyright © 2016年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +#define BARRAGE_VERTICAL_HEIGHT 25.f //每个弹幕View在垂直方向上的高度 | ||
| 12 | +#define MAX_BARRAGE_VERTICAL_COUNT (long)([UIScreen mainScreen].bounds.size.height * 1.0/BARRAGE_VERTICAL_HEIGHT) //垂直方向上的弹幕最大数量 | ||
| 13 | +#define BARRAGE_VERTICAL_MARGIN ([UIScreen mainScreen].bounds.size.height - BARRAGE_VERTICAL_HEIGHT * MAX_BARRAGE_VERTICAL_COUNT) * 1.0 / (MAX_BARRAGE_VERTICAL_COUNT - 1) //垂直方向上弹幕之间的间隙 | ||
| 14 | + | ||
| 15 | +typedef NS_ENUM(NSInteger, CommentMoveState){//弹幕移动的状态 | ||
| 16 | + CommentMoveStateStart = 0,//将要进入屏幕 | ||
| 17 | + CommentMoveStateEnter ,//完全进入 | ||
| 18 | + CommentMoveStateEnd //完全移除屏幕 | ||
| 19 | +}; | ||
| 20 | + | ||
| 21 | + | ||
| 22 | +@interface CNBarrageView : UIView | ||
| 23 | + | ||
| 24 | +@property (nonatomic ,copy) void (^moveBlock) (CommentMoveState state);//弹幕移动的状态 | ||
| 25 | +@property (nonatomic) CGFloat trajectory;//弹幕的移动轨迹 | ||
| 26 | + | ||
| 27 | +/** | ||
| 28 | + 初始化弹幕View根据评论内容,消息是否是自己发送 | ||
| 29 | + | ||
| 30 | + @param content 评论内容 | ||
| 31 | + @param userName 用户名字 | ||
| 32 | + @param isMine 是否是自己的评论弹幕 | ||
| 33 | + @return 弹幕View | ||
| 34 | + */ | ||
| 35 | +- (instancetype)initWithContent:(NSString *)content userName:(NSString *)userName isMine:(BOOL)isMine; | ||
| 36 | + | ||
| 37 | +/** | ||
| 38 | + 开始移动动画 | ||
| 39 | + */ | ||
| 40 | +- (void)startAnimation; | ||
| 41 | + | ||
| 42 | +/** | ||
| 43 | + 停止移动动画 | ||
| 44 | + */ | ||
| 45 | +- (void)stopAnimation; | ||
| 46 | + | ||
| 47 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Chat/Barrage/CNBarrageView.m
0 → 100644
| 1 | + | ||
| 2 | +// | ||
| 3 | +// CNBarrageView.m | ||
| 4 | +// personalXmppChatDemo | ||
| 5 | +// | ||
| 6 | +// Created by 张旭 on 2016/12/10. | ||
| 7 | +// Copyright © 2016年 cnlive. All rights reserved. | ||
| 8 | +// | ||
| 9 | + | ||
| 10 | +#import "CNBarrageView.h" | ||
| 11 | + | ||
| 12 | +#define TotalDuration 5 //弹幕飘过总时间 | ||
| 13 | +#define BARRAGE_Horizontal_Margin 5 //弹幕间水平间隙 | ||
| 14 | + | ||
| 15 | +@interface CNBarrageView () | ||
| 16 | + | ||
| 17 | +@property (nonatomic ,strong) UILabel * _Nullable commentLabel;//评论Label | ||
| 18 | +@property BOOL isDealloc;//标记资源是否已释放 | ||
| 19 | + | ||
| 20 | +@end | ||
| 21 | + | ||
| 22 | +@implementation CNBarrageView | ||
| 23 | + | ||
| 24 | +/** | ||
| 25 | + 销毁对象及动画 | ||
| 26 | + */ | ||
| 27 | +- (void)dealloc | ||
| 28 | +{ | ||
| 29 | + [self stopAnimation]; | ||
| 30 | + self.moveBlock = nil; | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | +/** | ||
| 34 | + 初始化弹幕View根据评论内容,消息是否是自己发送 | ||
| 35 | + | ||
| 36 | + @param content 评论内容 | ||
| 37 | + @param userName 用户名字 | ||
| 38 | + @param isMine 是否是自己的评论弹幕 | ||
| 39 | + @return 弹幕View | ||
| 40 | + */ | ||
| 41 | +- (instancetype)initWithContent:(NSString *)content userName:(NSString *)userName isMine:(BOOL)isMine | ||
| 42 | +{ | ||
| 43 | + if (self = [super init]) | ||
| 44 | + { | ||
| 45 | + content = [NSString stringWithFormat:@"%@:%@",userName,content]; | ||
| 46 | + NSDictionary *attributes = @{NSFontAttributeName:[UIFont systemFontOfSize:14]}; | ||
| 47 | + float width = [content sizeWithAttributes:attributes].width; | ||
| 48 | +// float height = [content sizeWithAttributes:attributes].height;//16.707031 | ||
| 49 | + self.bounds = CGRectMake(0, 0, width + BARRAGE_Horizontal_Margin * 2, BARRAGE_VERTICAL_HEIGHT); | ||
| 50 | + self.commentLabel.text = content; | ||
| 51 | + self.commentLabel.frame = CGRectMake(BARRAGE_Horizontal_Margin, 0, width, BARRAGE_VERTICAL_HEIGHT); | ||
| 52 | + if(isMine) | ||
| 53 | + { | ||
| 54 | + self.commentLabel.textColor = [UIColor redColor]; | ||
| 55 | + }else | ||
| 56 | + { | ||
| 57 | + self.commentLabel.textColor = [UIColor lightGrayColor]; | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + } | ||
| 61 | + return self; | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +/** | ||
| 65 | + 开始移动动画 | ||
| 66 | + */ | ||
| 67 | +- (void)startAnimation | ||
| 68 | +{ | ||
| 69 | + CGFloat wholeWidth = self.width + SCREEN_WIDTH + 50;//总轨迹长度 | ||
| 70 | + CGFloat speed = wholeWidth / TotalDuration;//速度 | ||
| 71 | + CGFloat duration = (self.width + 50) / speed;//完全进入屏幕的时间 | ||
| 72 | + | ||
| 73 | + if (self.moveBlock) { | ||
| 74 | + //弹幕开始进入屏幕 | ||
| 75 | + self.moveBlock(CommentMoveStateStart); | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | ||
| 79 | + //避免重复,若资源已释放 不再操作 | ||
| 80 | + if (self.isDealloc) { | ||
| 81 | + return; | ||
| 82 | + } | ||
| 83 | + //duration时间后弹幕完全进入屏幕 | ||
| 84 | + if (self.moveBlock) { | ||
| 85 | + self.moveBlock(CommentMoveStateEnter); | ||
| 86 | + } | ||
| 87 | + }); | ||
| 88 | + | ||
| 89 | + weakself | ||
| 90 | + //弹幕完全离开屏幕 | ||
| 91 | + [UIView animateWithDuration:TotalDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ | ||
| 92 | + strongself | ||
| 93 | + self.left = - self.width; | ||
| 94 | + } completion:^(BOOL finished) { | ||
| 95 | + if (self.moveBlock) { | ||
| 96 | + self.moveBlock(CommentMoveStateEnd); | ||
| 97 | + } | ||
| 98 | + [self removeFromSuperview]; | ||
| 99 | + }]; | ||
| 100 | + | ||
| 101 | +} | ||
| 102 | + | ||
| 103 | +/** | ||
| 104 | + 停止移动动画 | ||
| 105 | + */ | ||
| 106 | +- (void)stopAnimation | ||
| 107 | +{ | ||
| 108 | + self.isDealloc = YES; | ||
| 109 | + [self.layer removeAllAnimations]; | ||
| 110 | + [self removeFromSuperview]; | ||
| 111 | +} | ||
| 112 | + | ||
| 113 | +#pragma mark getter | ||
| 114 | + | ||
| 115 | +- (UILabel *)commentLabel | ||
| 116 | +{ | ||
| 117 | + if (!_commentLabel) { | ||
| 118 | + _commentLabel = [[UILabel alloc] init]; | ||
| 119 | + _commentLabel.backgroundColor = [UIColor clearColor]; | ||
| 120 | + _commentLabel.font = [UIFont systemFontOfSize:14.f]; | ||
| 121 | + _commentLabel.textColor = [UIColor lightGrayColor]; | ||
| 122 | + [self addSubview:self.commentLabel]; | ||
| 123 | + } | ||
| 124 | + return _commentLabel; | ||
| 125 | +} | ||
| 126 | + | ||
| 127 | +/* | ||
| 128 | +// Only override drawRect: if you perform custom drawing. | ||
| 129 | +// An empty implementation adversely affects performance during animation. | ||
| 130 | +- (void)drawRect:(CGRect)rect { | ||
| 131 | + // Drawing code | ||
| 132 | +} | ||
| 133 | +*/ | ||
| 134 | + | ||
| 135 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Chat/ChatMsgModel/chatMsgModel.h
0 → 100644
| 1 | +// | ||
| 2 | +// chatMsgModel.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/20. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "BaseModel.h" | ||
| 10 | + | ||
| 11 | +@interface chatMsgModel : BaseModel | ||
| 12 | + | ||
| 13 | +@property (nonatomic ,copy ) NSString * _Nullable icon;//头像 | ||
| 14 | +@property (nonatomic ,copy ) NSString * _Nullable name;//姓名 | ||
| 15 | +@property (nonatomic ,copy ) NSString * _Nullable content;//内容 | ||
| 16 | + | ||
| 17 | +@property (nonatomic ,assign) CGFloat cellWidth;//内容宽度 | ||
| 18 | +@property (nonatomic ,assign) CGFloat cellHeight;//内容高度 | ||
| 19 | + | ||
| 20 | +@property (nonatomic) BOOL isMine;//消息是否是自己发送 | ||
| 21 | + | ||
| 22 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Chat/ChatMsgModel/chatMsgModel.m
0 → 100644
| 1 | +// | ||
| 2 | +// chatMsgModel.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/20. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "chatMsgModel.h" | ||
| 10 | + | ||
| 11 | +#define ChatCellMargin 10 | ||
| 12 | + | ||
| 13 | +@implementation chatMsgModel | ||
| 14 | + | ||
| 15 | +- (CGFloat)cellHeight | ||
| 16 | +{ | ||
| 17 | + //如果计算过高度,直接返回 | ||
| 18 | + if (_cellHeight) return _cellHeight; | ||
| 19 | + | ||
| 20 | + //头像 | ||
| 21 | + _cellHeight = 40; | ||
| 22 | + //文字 | ||
| 23 | + CGFloat textMaxW = self.cellWidth - 2 * ChatCellMargin; | ||
| 24 | + CGSize textMaxSize = CGSizeMake(textMaxW, MAXFLOAT); | ||
| 25 | + CGSize textSize = [self.content boundingRectWithSize:textMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:16]} context:nil].size; | ||
| 26 | + | ||
| 27 | + //底部空隙 | ||
| 28 | + _cellHeight += textSize.height + ChatCellMargin; | ||
| 29 | + // NSLog(@"cellHeight = %f",_cellHeight); | ||
| 30 | + return _cellHeight; | ||
| 31 | +} | ||
| 32 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Chat/ChatViews/chatListCell.h
0 → 100644
| 1 | +// | ||
| 2 | +// chatListCell.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/20. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "BaseTableViewCell.h" | ||
| 10 | +@class chatMsgModel; | ||
| 11 | +@interface chatListCell : BaseTableViewCell | ||
| 12 | + | ||
| 13 | +- (void)loadUIWithModel:(chatMsgModel *)model; | ||
| 14 | + | ||
| 15 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Chat/ChatViews/chatListCell.m
0 → 100644
| 1 | +// | ||
| 2 | +// chatListCell.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/20. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "chatListCell.h" | ||
| 10 | +#import "chatMsgModel.h" | ||
| 11 | +@interface chatListCell () | ||
| 12 | + | ||
| 13 | +@property (nonatomic ,strong) UIImageView * _Nullable iconImageView;//头像图片 | ||
| 14 | +@property (nonatomic ,strong) UILabel * _Nullable nameLabel;//名字 | ||
| 15 | +@property (nonatomic ,strong) UILabel * _Nullable contentLabel;//内容 | ||
| 16 | +@property (nonatomic ,strong) UIImageView * _Nullable lineImageView;//分割线 | ||
| 17 | + | ||
| 18 | +@property (nonatomic ,strong) chatMsgModel * _Nullable model; | ||
| 19 | + | ||
| 20 | +@end | ||
| 21 | + | ||
| 22 | +@implementation chatListCell | ||
| 23 | + | ||
| 24 | +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier | ||
| 25 | +{ | ||
| 26 | + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; | ||
| 27 | + if (self) { | ||
| 28 | + self.backgroundColor = [UIColor clearColor]; | ||
| 29 | + self.selectionStyle = UITableViewCellSelectionStyleNone; | ||
| 30 | + } | ||
| 31 | + return self; | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +- (void)loadUIWithModel:(chatMsgModel *)model | ||
| 35 | +{ | ||
| 36 | + model.cellWidth = self.width; | ||
| 37 | + _model = model; | ||
| 38 | + | ||
| 39 | + [self bindView];//更新cell高度后再初始化UI | ||
| 40 | + [self.iconImageView sd_setImageWithURL:[NSURL URLWithString:model.icon] placeholderImage:nil]; | ||
| 41 | + // self.iconImageView.backgroundColor = [UIColor greenColor]; | ||
| 42 | + self.nameLabel.text = [NSString stringWithFormat:@"%@:",model.name]; | ||
| 43 | + CGSize labelSize = [self.nameLabel labelSize]; | ||
| 44 | + self.nameLabel.frame = CGRectMake(self.iconImageView.right + 10, self.iconImageView.top, labelSize.width, labelSize.height); | ||
| 45 | + self.nameLabel.centerY = self.iconImageView.centerY; | ||
| 46 | + self.contentLabel.text = model.content; | ||
| 47 | + CGSize contentLabelSize = [self.contentLabel labelSizeWithWidth:self.width - 2 * self.iconImageView.left]; | ||
| 48 | + self.contentLabel.frame = CGRectMake(self.iconImageView.left, self.iconImageView.bottom + 10, contentLabelSize.width, contentLabelSize.height); | ||
| 49 | + | ||
| 50 | + self.lineImageView.frame = CGRectMake(self.iconImageView.left, self.contentLabel.bottom + 5, self.width - self.iconImageView.left * 2, 1); | ||
| 51 | +} | ||
| 52 | + | ||
| 53 | +- (void)bindView | ||
| 54 | +{ | ||
| 55 | + self.iconImageView.frame = CGRectMake(10, 10, 30, 30); | ||
| 56 | + self.nameLabel.frame = CGRectMake(self.iconImageView.right + 10, self.iconImageView.top, self.width - self.iconImageView.right - 20, 25); | ||
| 57 | + self.nameLabel.centerY = self.iconImageView.centerY; | ||
| 58 | + self.contentLabel.frame = CGRectMake(self.iconImageView.left, self.iconImageView.bottom + 10, self.width - 2 * self.iconImageView.left, 25); | ||
| 59 | +} | ||
| 60 | + | ||
| 61 | +#pragma mark - getter | ||
| 62 | +- (UILabel * _Nullable)nameLabel | ||
| 63 | +{ | ||
| 64 | + if (!_nameLabel) | ||
| 65 | + { | ||
| 66 | + _nameLabel = [[UILabel alloc] init]; | ||
| 67 | + _nameLabel.textAlignment = NSTextAlignmentLeft; | ||
| 68 | + _nameLabel.textColor = [UIColor redColor]; | ||
| 69 | + _nameLabel.font = [UIFont systemFontOfSize:15.f]; | ||
| 70 | + [self addSubview:_nameLabel]; | ||
| 71 | + } | ||
| 72 | + return _nameLabel; | ||
| 73 | +} | ||
| 74 | + | ||
| 75 | +- (UILabel * _Nullable)contentLabel | ||
| 76 | +{ | ||
| 77 | + if (!_contentLabel) | ||
| 78 | + { | ||
| 79 | + _contentLabel = [[UILabel alloc] init]; | ||
| 80 | + _contentLabel.textAlignment = NSTextAlignmentLeft; | ||
| 81 | + _contentLabel.textColor = [UIColor lightGrayColor]; | ||
| 82 | + _contentLabel.numberOfLines = 0; | ||
| 83 | + _contentLabel.font = [UIFont systemFontOfSize:12.f]; | ||
| 84 | + [self addSubview:_contentLabel]; | ||
| 85 | + } | ||
| 86 | + return _contentLabel; | ||
| 87 | +} | ||
| 88 | + | ||
| 89 | +- (UIImageView * _Nullable)iconImageView | ||
| 90 | +{ | ||
| 91 | + if (!_iconImageView) | ||
| 92 | + { | ||
| 93 | + _iconImageView = [[UIImageView alloc] init]; | ||
| 94 | + _iconImageView.layer.masksToBounds = YES; | ||
| 95 | + _iconImageView.layer.cornerRadius = 15.f; | ||
| 96 | + [self addSubview:_iconImageView]; | ||
| 97 | + } | ||
| 98 | + return _iconImageView; | ||
| 99 | +} | ||
| 100 | + | ||
| 101 | +- (UIImageView * _Nullable)lineImageView | ||
| 102 | +{ | ||
| 103 | + if (!_lineImageView) | ||
| 104 | + { | ||
| 105 | + _lineImageView = [[UIImageView alloc] init]; | ||
| 106 | + _lineImageView.image = [UIImage imageNamed:@"分割线(聊天复用)"]; | ||
| 107 | + [self addSubview:_lineImageView]; | ||
| 108 | + } | ||
| 109 | + return _lineImageView; | ||
| 110 | +} | ||
| 111 | + | ||
| 112 | + | ||
| 113 | +/* | ||
| 114 | +// Only override drawRect: if you perform custom drawing. | ||
| 115 | +// An empty implementation adversely affects performance during animation. | ||
| 116 | +- (void)drawRect:(CGRect)rect { | ||
| 117 | + // Drawing code | ||
| 118 | +} | ||
| 119 | +*/ | ||
| 120 | + | ||
| 121 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/AnimQueueManager.h
| @@ -9,11 +9,9 @@ | @@ -9,11 +9,9 @@ | ||
| 9 | #import <Foundation/Foundation.h> | 9 | #import <Foundation/Foundation.h> |
| 10 | 10 | ||
| 11 | @class GiftModel; | 11 | @class GiftModel; |
| 12 | +@class PresentView; | ||
| 12 | @interface AnimQueueManager : NSObject | 13 | @interface AnimQueueManager : NSObject |
| 13 | 14 | ||
| 14 | -@property (nonatomic, assign)NSInteger maxTop; //初始位置(需要根据显示设置最低位置在哪里) | ||
| 15 | -//@property (nonatomic, strong)NSMutableArray *arGiftArray; //横幅的数量,用于轨道计算(现在结构是一维数组,因为轨道中的弹道只有1个,如果是多个的话需要变为二维数组) | ||
| 16 | - | ||
| 17 | /** | 15 | /** |
| 18 | 初始化管理类 | 16 | 初始化管理类 |
| 19 | @return 当前manager | 17 | @return 当前manager |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/AnimQueueManager.m
| @@ -9,10 +9,13 @@ | @@ -9,10 +9,13 @@ | ||
| 9 | #import "AnimQueueManager.h" | 9 | #import "AnimQueueManager.h" |
| 10 | #import "GiftAnimOperation.h" | 10 | #import "GiftAnimOperation.h" |
| 11 | #import "GiftModel.h" | 11 | #import "GiftModel.h" |
| 12 | +#import "PresentView.h" | ||
| 13 | + | ||
| 14 | +#import "LiveBaseView.h" | ||
| 15 | +#import "PresentView.h" | ||
| 12 | 16 | ||
| 13 | @interface AnimQueueManager () | 17 | @interface AnimQueueManager () |
| 14 | 18 | ||
| 15 | -@property (nonatomic, assign)NSInteger maxOperationCount; //并发数 | ||
| 16 | @property (nonatomic,strong) NSOperationQueue *comboAnimationQueue; //连击动画队列 | 19 | @property (nonatomic,strong) NSOperationQueue *comboAnimationQueue; //连击动画队列 |
| 17 | @property (nonatomic,strong) NSOperationQueue *expenAnimationQueue; //豪华礼物动画队列 | 20 | @property (nonatomic,strong) NSOperationQueue *expenAnimationQueue; //豪华礼物动画队列 |
| 18 | 21 | ||
| @@ -31,26 +34,11 @@ | @@ -31,26 +34,11 @@ | ||
| 31 | static dispatch_once_t onceToken; | 34 | static dispatch_once_t onceToken; |
| 32 | dispatch_once(&onceToken, ^{ | 35 | dispatch_once(&onceToken, ^{ |
| 33 | manager = [[AnimQueueManager alloc] init]; | 36 | manager = [[AnimQueueManager alloc] init]; |
| 34 | - manager.maxOperationCount = 2; | ||
| 35 | -// manager.arGiftArray = [NSMutableArray arrayWithObjects:@200,@240,@280, nil]; | ||
| 36 | }); | 37 | }); |
| 37 | return manager; | 38 | return manager; |
| 38 | } | 39 | } |
| 39 | 40 | ||
| 40 | /** | 41 | /** |
| 41 | - 连击动画队列 | ||
| 42 | - | ||
| 43 | - @return 队列obj | ||
| 44 | - */ | ||
| 45 | -- (NSOperationQueue *)comboAnimationQueue{ | ||
| 46 | - if (_comboAnimationQueue == nil) { | ||
| 47 | - _comboAnimationQueue = [[NSOperationQueue alloc] init]; | ||
| 48 | - _comboAnimationQueue.maxConcurrentOperationCount = 3; | ||
| 49 | - } | ||
| 50 | - return _comboAnimationQueue; | ||
| 51 | -} | ||
| 52 | - | ||
| 53 | -/** | ||
| 54 | 豪华动画队列 | 42 | 豪华动画队列 |
| 55 | 43 | ||
| 56 | @return 队列obj | 44 | @return 队列obj |
| @@ -69,28 +57,29 @@ | @@ -69,28 +57,29 @@ | ||
| 69 | @param model modelobj | 57 | @param model modelobj |
| 70 | */ | 58 | */ |
| 71 | - (void)addAnimationWithModel:(GiftModel *)model animContentView:(UIView *)animContentView{ | 59 | - (void)addAnimationWithModel:(GiftModel *)model animContentView:(UIView *)animContentView{ |
| 72 | - | ||
| 73 | - GiftAnimOperation *op = [GiftAnimOperation addGiftAnimOperationWithGiftModel:model animContentView:animContentView maxTop:self.maxTop]; | ||
| 74 | - NSInteger index = self.comboAnimationQueue.operationCount; | ||
| 75 | - NSLog(@"index:%zd",index); | 60 | + |
| 61 | + GiftAnimOperation *op = [GiftAnimOperation addGiftAnimOperationWithGiftModel:model animContentView:animContentView]; | ||
| 76 | switch (model.giftStyle) { | 62 | switch (model.giftStyle) { |
| 77 | case GiftStylePorsch: | 63 | case GiftStylePorsch: |
| 64 | + { | ||
| 65 | + [self.expenAnimationQueue addOperation:op]; | ||
| 66 | + } | ||
| 67 | + break; | ||
| 68 | + case GiftStyleFighter: | ||
| 69 | + { | ||
| 78 | [self.expenAnimationQueue addOperation:op]; | 70 | [self.expenAnimationQueue addOperation:op]; |
| 71 | + } | ||
| 79 | break; | 72 | break; |
| 80 | -// case GiftStyleFighter: | ||
| 81 | -// [self.expenAnimationQueue addOperation:op]; | ||
| 82 | -// break; | ||
| 83 | case GiftStylePlane: | 73 | case GiftStylePlane: |
| 74 | + { | ||
| 84 | [self.expenAnimationQueue addOperation:op]; | 75 | [self.expenAnimationQueue addOperation:op]; |
| 76 | + } | ||
| 85 | break; | 77 | break; |
| 78 | + | ||
| 86 | case GiftStyleCombo: | 79 | case GiftStyleCombo: |
| 87 | { | 80 | { |
| 88 | - [self.comboAnimationQueue addOperation:op]; | ||
| 89 | -// int i = rand()%4; | ||
| 90 | -// op.name = i >0 ? @"张三_love" : @"李四_flower";//name imagename | ||
| 91 | -// self.comboAnimationQueue.suspended; | ||
| 92 | - } | ||
| 93 | - | 81 | + [(PresentView *)animContentView insertPresentMessages:@[model] showShakeAnimation:YES]; |
| 82 | + } | ||
| 94 | break; | 83 | break; |
| 95 | default: | 84 | default: |
| 96 | break; | 85 | break; |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftAnimOperation.h
| @@ -13,6 +13,6 @@ | @@ -13,6 +13,6 @@ | ||
| 13 | 13 | ||
| 14 | @interface GiftAnimOperation : NSOperation | 14 | @interface GiftAnimOperation : NSOperation |
| 15 | 15 | ||
| 16 | -+ (GiftAnimOperation *)addGiftAnimOperationWithGiftModel:(GiftModel *)model animContentView:(UIView *)animContentView maxTop:(NSInteger)maxTop; | 16 | ++ (GiftAnimOperation *)addGiftAnimOperationWithGiftModel:(GiftModel *)model animContentView:(UIView *)animContentView; |
| 17 | 17 | ||
| 18 | @end | 18 | @end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftAnimOperation.m
| @@ -8,12 +8,11 @@ | @@ -8,12 +8,11 @@ | ||
| 8 | 8 | ||
| 9 | #import "GiftAnimOperation.h" | 9 | #import "GiftAnimOperation.h" |
| 10 | #import "GiftModel.h" | 10 | #import "GiftModel.h" |
| 11 | -#import "GiftComboView.h" | ||
| 12 | #import "NHCarViews.h" | 11 | #import "NHCarViews.h" |
| 13 | #import "NHPlaneViews.h" | 12 | #import "NHPlaneViews.h" |
| 14 | #import "GiftAnimationAction.h" | 13 | #import "GiftAnimationAction.h" |
| 15 | -//#import "NHFighterView.h" | ||
| 16 | -//#import "NHFighterView+animDelegagte.h" | 14 | +#import "NHFighterView.h" |
| 15 | +#import "NHFighterView+animDelegagte.h" | ||
| 17 | 16 | ||
| 18 | @interface GiftAnimOperation () | 17 | @interface GiftAnimOperation () |
| 19 | { | 18 | { |
| @@ -21,24 +20,19 @@ | @@ -21,24 +20,19 @@ | ||
| 21 | BOOL _executing; //队列任务开始执行 | 20 | BOOL _executing; //队列任务开始执行 |
| 22 | } | 21 | } |
| 23 | 22 | ||
| 24 | -@property (nonatomic, strong)GiftComboView *giftComboView; //连击动画 | ||
| 25 | @property (nonatomic, strong)NHCarViews *giftCarView; //跑车动画 | 23 | @property (nonatomic, strong)NHCarViews *giftCarView; //跑车动画 |
| 26 | -//@property (nonatomic, strong)NHFighterView *giftFighterView; //歼灭机动画 | 24 | +@property (nonatomic, strong)NHFighterView *giftFighterView; //歼灭机动画 |
| 27 | @property (nonatomic, strong)NHPlaneViews *giftPlaneView; //客机动画 | 25 | @property (nonatomic, strong)NHPlaneViews *giftPlaneView; //客机动画 |
| 28 | - | ||
| 29 | @property (nonatomic, strong)GiftModel *model; //model | 26 | @property (nonatomic, strong)GiftModel *model; //model |
| 30 | @property (nonatomic,strong) UIView *animContentView; //需要显示动画的view | 27 | @property (nonatomic,strong) UIView *animContentView; //需要显示动画的view |
| 31 | -@property (nonatomic, assign)NSInteger maxTop; //初始位置(需要根据显示设置最低位置在哪里) | ||
| 32 | -@property (nonatomic ,strong) NSArray * _Nullable defaultTrajory;//默认轨迹数组 | ||
| 33 | -@property (nonatomic ,strong) NSMutableArray * _Nullable emptyTrajory;//当前空轨迹数组 | ||
| 34 | 28 | ||
| 35 | @end | 29 | @end |
| 36 | 30 | ||
| 37 | @implementation GiftAnimOperation | 31 | @implementation GiftAnimOperation |
| 38 | 32 | ||
| 39 | -+ (GiftAnimOperation *)addGiftAnimOperationWithGiftModel:(GiftModel *)model animContentView:(UIView *)animContentView maxTop:(NSInteger)maxTop{ | 33 | ++ (GiftAnimOperation *)addGiftAnimOperationWithGiftModel:(GiftModel *)model animContentView:(UIView *)animContentView{ |
| 40 | 34 | ||
| 41 | - GiftAnimOperation *giftAnimOperation = [[GiftAnimOperation alloc]initWithGiftModel:model animContentView:animContentView maxTop:maxTop]; | 35 | + GiftAnimOperation *giftAnimOperation = [[GiftAnimOperation alloc]initWithGiftModel:model animContentView:animContentView]; |
| 42 | return giftAnimOperation; | 36 | return giftAnimOperation; |
| 43 | } | 37 | } |
| 44 | 38 | ||
| @@ -49,12 +43,11 @@ | @@ -49,12 +43,11 @@ | ||
| 49 | @param animContentView 需要把动画view添加到的view | 43 | @param animContentView 需要把动画view添加到的view |
| 50 | @return obj | 44 | @return obj |
| 51 | */ | 45 | */ |
| 52 | -- (instancetype)initWithGiftModel:(GiftModel *)model animContentView:(UIView *)animContentView maxTop:(NSInteger)maxTop{ | 46 | +- (instancetype)initWithGiftModel:(GiftModel *)model animContentView:(UIView *)animContentView{ |
| 53 | self = [super init]; | 47 | self = [super init]; |
| 54 | if (self) { | 48 | if (self) { |
| 55 | self.model = model; | 49 | self.model = model; |
| 56 | self.animContentView = animContentView; | 50 | self.animContentView = animContentView; |
| 57 | - self.maxTop = maxTop; | ||
| 58 | } | 51 | } |
| 59 | return self; | 52 | return self; |
| 60 | } | 53 | } |
| @@ -79,15 +72,13 @@ | @@ -79,15 +72,13 @@ | ||
| 79 | case GiftStylePorsch: | 72 | case GiftStylePorsch: |
| 80 | [self porschAnimation]; | 73 | [self porschAnimation]; |
| 81 | break; | 74 | break; |
| 82 | -// case GiftStyleFighter: | ||
| 83 | -// [self fighterAnimation]; | ||
| 84 | -// break; | 75 | + case GiftStyleFighter: |
| 76 | + [self fighterAnimation]; | ||
| 77 | + break; | ||
| 85 | case GiftStylePlane: | 78 | case GiftStylePlane: |
| 86 | [self planeAnimation]; | 79 | [self planeAnimation]; |
| 87 | break; | 80 | break; |
| 88 | - case GiftStyleCombo: | ||
| 89 | - [self comboViewAnimation]; | ||
| 90 | - break; | 81 | + |
| 91 | default: | 82 | default: |
| 92 | break; | 83 | break; |
| 93 | } | 84 | } |
| @@ -114,110 +105,48 @@ | @@ -114,110 +105,48 @@ | ||
| 114 | }); | 105 | }); |
| 115 | } | 106 | } |
| 116 | 107 | ||
| 117 | -//- (void)fighterAnimation | ||
| 118 | -//{ | ||
| 119 | -// weakself | ||
| 120 | -// dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 121 | -// strongself | ||
| 122 | -// | ||
| 123 | -// [self.giftFighterView addAnimationsMoveToPoint:CGPointMake(SCREEN_WIDTH, 60) endPoint:CGPointMake( -500, 600)]; | ||
| 124 | -// [self.animContentView addSubview:self.giftFighterView]; | ||
| 125 | -// [self.giftFighterView startFighterAnimationWithCompletion:^{ | ||
| 126 | -// [self willChangeValueForKey:@"isFinished"]; | ||
| 127 | -// | ||
| 128 | -// _finished = YES; | ||
| 129 | -// | ||
| 130 | -// [self didChangeValueForKey:@"isFinished"]; | ||
| 131 | -// }]; | ||
| 132 | -// | ||
| 133 | -// }); | ||
| 134 | -//} | ||
| 135 | - | ||
| 136 | -- (void)planeAnimation | 108 | +- (void)fighterAnimation |
| 137 | { | 109 | { |
| 138 | weakself | 110 | weakself |
| 139 | dispatch_async(dispatch_get_main_queue(), ^{ | 111 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 140 | strongself | 112 | strongself |
| 141 | 113 | ||
| 142 | - [self.giftPlaneView addAnimationsMoveToPoint:CGPointMake(SCREEN_WIDTH, 100) endPoint:CGPointMake(-500, 410)]; | ||
| 143 | - [self.animContentView addSubview:self.giftPlaneView]; | ||
| 144 | - [self.giftPlaneView startPlaneAnimationWithCompletion:^{ | ||
| 145 | - | 114 | + [self.giftFighterView addAnimationsMoveToPoint:CGPointMake(SCREEN_WIDTH, 60) endPoint:CGPointMake( -500, 600)]; |
| 115 | + [self.animContentView addSubview:self.giftFighterView]; | ||
| 116 | + | ||
| 117 | + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(12 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | ||
| 146 | [self willChangeValueForKey:@"isFinished"]; | 118 | [self willChangeValueForKey:@"isFinished"]; |
| 147 | 119 | ||
| 148 | _finished = YES; | 120 | _finished = YES; |
| 149 | 121 | ||
| 150 | [self didChangeValueForKey:@"isFinished"]; | 122 | [self didChangeValueForKey:@"isFinished"]; |
| 151 | - }]; | ||
| 152 | - | 123 | + |
| 124 | + }); | ||
| 153 | }); | 125 | }); |
| 154 | } | 126 | } |
| 155 | 127 | ||
| 156 | -static long currentCompleteIndex = 0; | ||
| 157 | -/** | ||
| 158 | - 连击动画 | ||
| 159 | - */ | ||
| 160 | -- (void)comboViewAnimation{ | ||
| 161 | - | ||
| 162 | - __weak GiftAnimOperation *weakSelf = self; | ||
| 163 | -// currentCompleteIndex ++; | ||
| 164 | - | ||
| 165 | -// if (self.emptyTrajory.count == 0)//index = 0 | ||
| 166 | -// { | ||
| 167 | -// currentCompleteIndex = 0; | ||
| 168 | -// | ||
| 169 | -// }else if (self.emptyTrajory.count < 3)//从emptyArr取空的index并赋值 index | ||
| 170 | -// { | ||
| 171 | -// | ||
| 172 | -// | ||
| 173 | -// }else// = 3已满 index = 0 | ||
| 174 | -// { | ||
| 175 | -// currentCompleteIndex = 0; | ||
| 176 | -// } | ||
| 177 | -// self.name = @"111"; | 128 | +- (void)planeAnimation |
| 129 | +{ | ||
| 130 | + weakself | ||
| 178 | dispatch_async(dispatch_get_main_queue(), ^{ | 131 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 179 | - [weakSelf.animContentView addSubview:weakSelf.giftComboView]; | ||
| 180 | - | ||
| 181 | - weakSelf.giftComboView.top = [self.defaultTrajory[currentCompleteIndex] integerValue]; | 132 | + strongself |
| 182 | 133 | ||
| 183 | - NSLog(@"top:%zd,index%ld",[self.defaultTrajory[currentCompleteIndex] integerValue],currentCompleteIndex); | ||
| 184 | - currentCompleteIndex ++; | ||
| 185 | - if (currentCompleteIndex == 3) | ||
| 186 | - { | ||
| 187 | - currentCompleteIndex = 0; | ||
| 188 | - } | ||
| 189 | -// if ([self.name isEqualToString:@"李四_flower"]) { | ||
| 190 | -//// currentCompleteIndex = 0; | ||
| 191 | -// self. | ||
| 192 | -// } | ||
| 193 | - [weakSelf.giftComboView startComboAnimationWithCompletion:^{ | ||
| 194 | - NSLog(@"complet top:%zd,index%zd",[self.defaultTrajory[currentCompleteIndex] integerValue],currentCompleteIndex); | ||
| 195 | - //empty存当前顺序 | ||
| 196 | -// [self.emptyTrajory replaceObjectAtIndex:<#(NSUInteger)#> withObject:<#(nonnull id)#>]; | ||
| 197 | - [weakSelf.giftComboView removeFromSuperview]; | 134 | + [self.giftPlaneView addAnimationsMoveToPoint:CGPointMake(SCREEN_WIDTH, 100) endPoint:CGPointMake(-500, 410)]; |
| 135 | + [self.animContentView addSubview:self.giftPlaneView]; | ||
| 136 | + | ||
| 137 | + [self.giftPlaneView startPlaneAnimationWithCompletion:^{ | ||
| 198 | 138 | ||
| 199 | - [weakSelf willChangeValueForKey:@"isFinished"]; | 139 | + [self willChangeValueForKey:@"isFinished"]; |
| 200 | 140 | ||
| 201 | _finished = YES; | 141 | _finished = YES; |
| 202 | 142 | ||
| 203 | - [weakSelf didChangeValueForKey:@"isFinished"]; | 143 | + [self didChangeValueForKey:@"isFinished"]; |
| 204 | }]; | 144 | }]; |
| 145 | + | ||
| 205 | }); | 146 | }); |
| 206 | } | 147 | } |
| 207 | 148 | ||
| 208 | /** | 149 | /** |
| 209 | - 连击动画 | ||
| 210 | - | ||
| 211 | - @return 连击view | ||
| 212 | - */ | ||
| 213 | -- (GiftComboView *)giftComboView{ | ||
| 214 | - if (_giftComboView == nil) { | ||
| 215 | - _giftComboView = [GiftComboView comboView]; | ||
| 216 | - } | ||
| 217 | - return _giftComboView; | ||
| 218 | -} | ||
| 219 | - | ||
| 220 | -/** | ||
| 221 | 跑车动画 | 150 | 跑车动画 |
| 222 | 151 | ||
| 223 | @return 连击view | 152 | @return 连击view |
| @@ -241,12 +170,12 @@ static long currentCompleteIndex = 0; | @@ -241,12 +170,12 @@ static long currentCompleteIndex = 0; | ||
| 241 | 170 | ||
| 242 | @return 连击view | 171 | @return 连击view |
| 243 | */ | 172 | */ |
| 244 | -//- (NHFighterView *)giftFighterView{ | ||
| 245 | -// if (_giftFighterView == nil) { | ||
| 246 | -// _giftFighterView = [NHFighterView loadFighterViewWithPoint:CGPointMake(10, 100)]; | ||
| 247 | -// } | ||
| 248 | -// return _giftFighterView; | ||
| 249 | -//} | 173 | +- (NHFighterView *)giftFighterView{ |
| 174 | + if (_giftFighterView == nil) { | ||
| 175 | + _giftFighterView = [NHFighterView loadFighterViewWithPoint:CGPointMake(10, 100)]; | ||
| 176 | + } | ||
| 177 | + return _giftFighterView; | ||
| 178 | +} | ||
| 250 | 179 | ||
| 251 | /** | 180 | /** |
| 252 | 客机动画 | 181 | 客机动画 |
| @@ -260,24 +189,6 @@ static long currentCompleteIndex = 0; | @@ -260,24 +189,6 @@ static long currentCompleteIndex = 0; | ||
| 260 | return _giftPlaneView; | 189 | return _giftPlaneView; |
| 261 | } | 190 | } |
| 262 | 191 | ||
| 263 | -- (NSArray *)defaultTrajory | ||
| 264 | -{ | ||
| 265 | - if (!_defaultTrajory) | ||
| 266 | - { | ||
| 267 | - _defaultTrajory = [[NSArray alloc] initWithObjects:@200,@240,@280, nil]; | ||
| 268 | - } | ||
| 269 | - return _defaultTrajory; | ||
| 270 | -} | ||
| 271 | - | ||
| 272 | -- (NSMutableArray *)emptyTrajory | ||
| 273 | -{ | ||
| 274 | - if (!_emptyTrajory) | ||
| 275 | - { | ||
| 276 | - _emptyTrajory = [[NSMutableArray alloc] init]; | ||
| 277 | - } | ||
| 278 | - return _emptyTrajory; | ||
| 279 | -} | ||
| 280 | - | ||
| 281 | // 提示:To be deprecated; use and override 'asynchronous' below | 192 | // 提示:To be deprecated; use and override 'asynchronous' below |
| 282 | //之前用的isConcurrent | 193 | //之前用的isConcurrent |
| 283 | /** | 194 | /** |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftAnimationAction.h
| @@ -18,21 +18,11 @@ typedef void(^giftAnimationCompletion)(); | @@ -18,21 +18,11 @@ typedef void(^giftAnimationCompletion)(); | ||
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | /** | 20 | /** |
| 21 | - 连击动画 | ||
| 22 | - */ | ||
| 23 | -- (void)startComboAnimationWithCompletion:(giftAnimationCompletion)Completion; | ||
| 24 | - | ||
| 25 | -/** | ||
| 26 | 跑车动画 | 21 | 跑车动画 |
| 27 | */ | 22 | */ |
| 28 | - (void)startPorschAnimationWithCompletion:(giftAnimationCompletion)Completion; | 23 | - (void)startPorschAnimationWithCompletion:(giftAnimationCompletion)Completion; |
| 29 | 24 | ||
| 30 | /** | 25 | /** |
| 31 | - 歼灭机动画 | ||
| 32 | - */ | ||
| 33 | -//- (void)startFighterAnimationWithCompletion:(giftAnimationCompletion)Completion; | ||
| 34 | - | ||
| 35 | -/** | ||
| 36 | 客机动画 | 26 | 客机动画 |
| 37 | */ | 27 | */ |
| 38 | - (void)startPlaneAnimationWithCompletion:(giftAnimationCompletion)Completion; | 28 | - (void)startPlaneAnimationWithCompletion:(giftAnimationCompletion)Completion; |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftAnimationAction.m
| @@ -11,46 +11,6 @@ | @@ -11,46 +11,6 @@ | ||
| 11 | @implementation GiftAnimationAction | 11 | @implementation GiftAnimationAction |
| 12 | 12 | ||
| 13 | /** | 13 | /** |
| 14 | - 连击横屏动画 | ||
| 15 | - */ | ||
| 16 | -- (void)startComboAnimationWithCompletion:(giftAnimationCompletion)Completion{ | ||
| 17 | - _giftAnimationCompletion = Completion; | ||
| 18 | - NSLog(@"self.width:%f",self.width); | ||
| 19 | - [self animationWithDuration:4 | ||
| 20 | - YValues:@[@(0 - self.width), @(115), @(110), @(110), @(0 - self.width)] | ||
| 21 | - keyTimes:@[@0.0, @0.2, @0.3, @0.8, @1.0] | ||
| 22 | - timingFunctions:@[ | ||
| 23 | - [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseOut], | ||
| 24 | - [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault], | ||
| 25 | - [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault], | ||
| 26 | - [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn] | ||
| 27 | - ] | ||
| 28 | - addView:self]; | ||
| 29 | -} | ||
| 30 | - | ||
| 31 | -/** | ||
| 32 | - 位移动画具体实现 | ||
| 33 | - | ||
| 34 | - @param duration 动画持续时间 | ||
| 35 | - @param YValues 动画帧数组 | ||
| 36 | - @param keyTimes 动画帧时间 | ||
| 37 | - @param timingFunctions 动画方式数组 | ||
| 38 | - @param addView 需要添加的view | ||
| 39 | - */ | ||
| 40 | -- (void)animationWithDuration:(float)duration YValues:(NSArray *)YValues keyTimes:(NSArray *)keyTimes timingFunctions:(NSArray *)timingFunctions addView:(UIView *)addView{ | ||
| 41 | - CAKeyframeAnimation *rocketAnim = [CAKeyframeAnimation animation]; | ||
| 42 | - rocketAnim.keyPath = @"position.x"; | ||
| 43 | - rocketAnim.values = YValues; | ||
| 44 | - rocketAnim.keyTimes = keyTimes; | ||
| 45 | - rocketAnim.timingFunctions = timingFunctions; | ||
| 46 | - rocketAnim.duration = duration; | ||
| 47 | - rocketAnim.fillMode = kCAFillModeForwards; | ||
| 48 | - rocketAnim.removedOnCompletion = NO; | ||
| 49 | - rocketAnim.delegate = self; | ||
| 50 | - [addView.layer addAnimation:rocketAnim forKey:@"positionY"]; | ||
| 51 | -} | ||
| 52 | - | ||
| 53 | -/** | ||
| 54 | 跑车动画 | 14 | 跑车动画 |
| 55 | */ | 15 | */ |
| 56 | - (void)startPorschAnimationWithCompletion:(giftAnimationCompletion)Completion | 16 | - (void)startPorschAnimationWithCompletion:(giftAnimationCompletion)Completion |
| @@ -59,14 +19,6 @@ | @@ -59,14 +19,6 @@ | ||
| 59 | } | 19 | } |
| 60 | 20 | ||
| 61 | /** | 21 | /** |
| 62 | - 歼灭机动画 | ||
| 63 | - */ | ||
| 64 | -//- (void)startFighterAnimationWithCompletion:(giftAnimationCompletion)Completion | ||
| 65 | -//{ | ||
| 66 | -// _giftAnimationCompletion = Completion; | ||
| 67 | -//} | ||
| 68 | - | ||
| 69 | -/** | ||
| 70 | 客机动画 | 22 | 客机动画 |
| 71 | */ | 23 | */ |
| 72 | - (void)startPlaneAnimationWithCompletion:(giftAnimationCompletion)Completion | 24 | - (void)startPlaneAnimationWithCompletion:(giftAnimationCompletion)Completion |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftComboView.h deleted
100644 → 0
| 1 | -// | ||
| 2 | -// GiftComboView.h | ||
| 3 | -// LiveVideoCloud | ||
| 4 | -// | ||
| 5 | -// Created by 张旭 on 2017/3/15. | ||
| 6 | -// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | -// | ||
| 8 | - | ||
| 9 | -#import "GiftAnimationAction.h" | ||
| 10 | - | ||
| 11 | -@class GiftModel; | ||
| 12 | -@interface GiftComboView : GiftAnimationAction | ||
| 13 | - | ||
| 14 | -/** | ||
| 15 | - 动画开始 | ||
| 16 | - | ||
| 17 | - @param model 对应的动画解析model | ||
| 18 | - @param animationCompletion 动画完成回调(用于控制队列) | ||
| 19 | - */ | ||
| 20 | -- (void)startAnimationWithModel:(GiftModel *)model withAnimationCompletion: (giftAnimationCompletion)animationCompletion; | ||
| 21 | - | ||
| 22 | -+ (instancetype)comboView; | ||
| 23 | - | ||
| 24 | -@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftComboView.m deleted
100644 → 0
| 1 | -// | ||
| 2 | -// GiftComboView.m | ||
| 3 | -// LiveVideoCloud | ||
| 4 | -// | ||
| 5 | -// Created by 张旭 on 2017/3/15. | ||
| 6 | -// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | -// | ||
| 8 | - | ||
| 9 | -#import "GiftComboView.h" | ||
| 10 | -#import "GiftModel.h" | ||
| 11 | - | ||
| 12 | -@interface GiftComboView (){ | ||
| 13 | - GiftModel *_model;//礼物model | ||
| 14 | -} | ||
| 15 | - | ||
| 16 | -@end | ||
| 17 | - | ||
| 18 | -@implementation GiftComboView | ||
| 19 | - | ||
| 20 | -/** | ||
| 21 | - 动画开始 | ||
| 22 | - | ||
| 23 | - @param model 对应的动画解析model | ||
| 24 | - @param animationCompletion 动画完成回调(用于控制队列) | ||
| 25 | - */ | ||
| 26 | -- (void)startAnimationWithModel:(GiftModel *)model withAnimationCompletion: (giftAnimationCompletion)animationCompletion | ||
| 27 | -{ | ||
| 28 | - _giftAnimationCompletion = animationCompletion; | ||
| 29 | - _model = model; | ||
| 30 | - | ||
| 31 | - [self startComboAnimationWithCompletion:animationCompletion]; | ||
| 32 | -} | ||
| 33 | - | ||
| 34 | - | ||
| 35 | -/** | ||
| 36 | - 初始化连击View | ||
| 37 | - | ||
| 38 | - @return 初始化连击ComboView | ||
| 39 | - */ | ||
| 40 | -+ (instancetype)comboView | ||
| 41 | -{ | ||
| 42 | - GiftComboView *comboView = [[GiftComboView alloc] initWithFrame:CGRectMake(0, 0, 180, 30)]; | ||
| 43 | - comboView.backgroundColor = [UIColor blueColor]; | ||
| 44 | - | ||
| 45 | - return comboView; | ||
| 46 | -} | ||
| 47 | - | ||
| 48 | -/* | ||
| 49 | -// Only override drawRect: if you perform custom drawing. | ||
| 50 | -// An empty implementation adversely affects performance during animation. | ||
| 51 | -- (void)drawRect:(CGRect)rect { | ||
| 52 | - // Drawing code | ||
| 53 | -} | ||
| 54 | -*/ | ||
| 55 | - | ||
| 56 | -@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftModel/GiftModel.h
| @@ -7,29 +7,36 @@ | @@ -7,29 +7,36 @@ | ||
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | #import "BaseModel.h" | 9 | #import "BaseModel.h" |
| 10 | - | 10 | +#import "PresentModelAble.h" |
| 11 | typedef NS_ENUM(NSInteger, GiftStyle) {//礼物类型 | 11 | typedef NS_ENUM(NSInteger, GiftStyle) {//礼物类型 |
| 12 | GiftStyleCombo = 1,//普通可连击礼物 | 12 | GiftStyleCombo = 1,//普通可连击礼物 |
| 13 | GiftStylePorsch ,//豪华跑车礼物 | 13 | GiftStylePorsch ,//豪华跑车礼物 |
| 14 | -// GiftStyleFighter ,//豪华歼灭机礼物 | 14 | + GiftStyleFighter ,//豪华歼灭机礼物 |
| 15 | GiftStylePlane ,//豪华客机礼物 | 15 | GiftStylePlane ,//豪华客机礼物 |
| 16 | }; | 16 | }; |
| 17 | 17 | ||
| 18 | -@interface GiftModel : BaseModel | 18 | +@interface GiftModel : BaseModel <PresentModelAble> |
| 19 | +@property (copy, nonatomic) NSString *_Nullable sender;//送礼人 | ||
| 20 | +@property (copy, nonatomic) NSString *_Nullable giftName;//礼物名称 | ||
| 21 | +@property (copy, nonatomic) NSString *_Nullable icon;//送礼头像 | ||
| 22 | +@property (copy, nonatomic) NSString *_Nullable giftImageName;//礼物图片名字 | ||
| 23 | +@property (assign, nonatomic) NSInteger giftNumber;//礼物数量 | ||
| 19 | 24 | ||
| 20 | -@property (nonatomic ,copy ) NSString * _Nullable image; | 25 | +//可本地处理 |
| 21 | @property (nonatomic ,copy ) NSString * _Nullable price; | 26 | @property (nonatomic ,copy ) NSString * _Nullable price; |
| 22 | - | ||
| 23 | -@property (nonatomic ) NSInteger index;//索引 | ||
| 24 | @property (nonatomic ) GiftStyle giftStyle;//动画类型 | 27 | @property (nonatomic ) GiftStyle giftStyle;//动画类型 |
| 25 | -@property (nonatomic, copy ) NSString * _Nullable giftname;//礼物名字 | ||
| 26 | -@property (nonatomic, strong) NSArray * _Nullable giftIconArray;//礼物图片数组 | ||
| 27 | -@property (nonatomic, copy ) NSString * _Nullable giftNum;//礼物数量 | ||
| 28 | -@property (nonatomic, copy ) NSString * _Nullable giftRusername;//接受礼物的人 | ||
| 29 | -@property (nonatomic, copy ) NSString * _Nullable giftRuserId;//接受礼物的人id | ||
| 30 | -@property (nonatomic, copy ) NSString * _Nullable giftGusername;//送礼物的人 | ||
| 31 | -@property (nonatomic, copy ) NSString * _Nullable giftGuserId;//送礼物的id | 28 | +@property (nonatomic ) NSInteger index;//索引和giftname一样 |
| 29 | + | ||
| 30 | +//@property (nonatomic, copy ) NSString * _Nullable giftname;//礼物名字 | ||
| 31 | +//@property (nonatomic, strong) NSArray * _Nullable giftIconArray;//礼物图片数组 | ||
| 32 | +//@property (nonatomic, copy ) NSString * _Nullable giftNum;//礼物数量 | ||
| 33 | +//@property (nonatomic, copy ) NSString * _Nullable giftRusername;//接受礼物的人 | ||
| 34 | +//@property (nonatomic, copy ) NSString * _Nullable giftRuserId;//接受礼物的人id | ||
| 35 | +//@property (nonatomic, copy ) NSString * _Nullable giftGusername;//送礼物的人 | ||
| 36 | +//@property (nonatomic, copy ) NSString * _Nullable giftGuserId;//送礼物的id | ||
| 32 | 37 | ||
| 33 | //@property (nonatomic, strong) NSString *_Nullable pushId;//跳转id | 38 | //@property (nonatomic, strong) NSString *_Nullable pushId;//跳转id |
| 34 | 39 | ||
| 40 | ++ (instancetype _Nonnull)modelWithSender:(NSString *_Nonnull)sender giftName:(NSString *_Nonnull)giftName icon:(NSString *_Nonnull)icon giftImageName:(NSString *_Nonnull)giftImageName; | ||
| 41 | + | ||
| 35 | @end | 42 | @end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftModel/GiftModel.m
| @@ -9,5 +9,13 @@ | @@ -9,5 +9,13 @@ | ||
| 9 | #import "GiftModel.h" | 9 | #import "GiftModel.h" |
| 10 | 10 | ||
| 11 | @implementation GiftModel | 11 | @implementation GiftModel |
| 12 | - | 12 | ++ (instancetype)modelWithSender:(NSString *)sender giftName:(NSString *)giftName icon:(NSString *)icon giftImageName:(NSString *)giftImageName |
| 13 | +{ | ||
| 14 | + GiftModel *model = [[GiftModel alloc] init]; | ||
| 15 | + model.sender = sender; | ||
| 16 | + model.giftName = giftName; | ||
| 17 | + model.icon = icon; | ||
| 18 | + model.giftImageName = giftImageName; | ||
| 19 | + return model; | ||
| 20 | +} | ||
| 13 | @end | 21 | @end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftResource/NHCarViews.m
| @@ -138,7 +138,7 @@ | @@ -138,7 +138,7 @@ | ||
| 138 | [self.layer removeAllAnimations]; | 138 | [self.layer removeAllAnimations]; |
| 139 | [self removeFromSuperview]; | 139 | [self removeFromSuperview]; |
| 140 | 140 | ||
| 141 | - _giftAnimationCompletion(-1); | 141 | + _giftAnimationCompletion(); |
| 142 | NSLog(@"删除动画"); | 142 | NSLog(@"删除动画"); |
| 143 | // [self.animations removeObjectAtIndex:0]; | 143 | // [self.animations removeObjectAtIndex:0]; |
| 144 | 144 |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftResource/NHFighterView+animDelegagte.m
| @@ -7,6 +7,7 @@ | @@ -7,6 +7,7 @@ | ||
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | #import "NHFighterView+animDelegagte.h" | 9 | #import "NHFighterView+animDelegagte.h" |
| 10 | +#import "GiftAnimationAction.h" | ||
| 10 | 11 | ||
| 11 | @implementation NHFighterView (animDelegagte) | 12 | @implementation NHFighterView (animDelegagte) |
| 12 | 13 | ||
| @@ -17,7 +18,8 @@ | @@ -17,7 +18,8 @@ | ||
| 17 | 18 | ||
| 18 | - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag | 19 | - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag |
| 19 | { | 20 | { |
| 20 | - _giftAnimationCompletion(-1); | 21 | +// _giftAnimationCompletion(); |
| 22 | + | ||
| 21 | NSLog(@"did stop"); | 23 | NSLog(@"did stop"); |
| 22 | } | 24 | } |
| 23 | 25 |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftResource/NHFighterView.h
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftResource/NHPlaneViews.m
| @@ -80,7 +80,7 @@ | @@ -80,7 +80,7 @@ | ||
| 80 | -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ | 80 | -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ |
| 81 | [self.layer removeAllAnimations]; | 81 | [self.layer removeAllAnimations]; |
| 82 | [self removeFromSuperview]; | 82 | [self removeFromSuperview]; |
| 83 | - _giftAnimationCompletion(-1); | 83 | + _giftAnimationCompletion(); |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | 86 |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftViews/GiftListView.m
| @@ -10,16 +10,23 @@ | @@ -10,16 +10,23 @@ | ||
| 10 | #import "GiftModel.h" | 10 | #import "GiftModel.h" |
| 11 | #import "LiveBaseView.h" | 11 | #import "LiveBaseView.h" |
| 12 | #import "AnimQueueManager.h" | 12 | #import "AnimQueueManager.h" |
| 13 | +#import "GiftPayButton.h" | ||
| 13 | 14 | ||
| 14 | #define MAX_LINE_COUNT 4 | 15 | #define MAX_LINE_COUNT 4 |
| 15 | #define MAX_ROW_COUNT 2 | 16 | #define MAX_ROW_COUNT 2 |
| 16 | 17 | ||
| 18 | +#define GiftPayViewHeight 50 | ||
| 19 | + | ||
| 17 | @interface GiftListView () | 20 | @interface GiftListView () |
| 18 | 21 | ||
| 19 | -@property (nonatomic ,strong) NSArray <GiftModel *>* _Nullable giftArray; | ||
| 20 | -@property (nonatomic ,weak) LiveBaseView * _Nullable liveBaseView; | ||
| 21 | -@property (nonatomic, strong) AnimQueueManager *animQueueManager; | ||
| 22 | -@property (nonatomic ,strong) GiftModel * _Nullable model; | 22 | +@property (nonatomic ,strong) NSArray <GiftModel *>* _Nullable giftArray; |
| 23 | +@property (nonatomic ,strong) NSArray <NSString *>* _Nullable images; | ||
| 24 | +@property (nonatomic ,strong) NSArray <NSString *>* _Nullable giftNames; | ||
| 25 | +@property (nonatomic ,strong) NSArray <NSString *>* _Nullable prices; | ||
| 26 | +@property (nonatomic ,strong) NSArray <NSString *>* _Nullable types; | ||
| 27 | +@property (nonatomic ,weak ) LiveBaseView * _Nullable liveBaseView; | ||
| 28 | +@property (nonatomic, strong) AnimQueueManager * animQueueManager; | ||
| 29 | +@property (nonatomic ,strong) GiftModel * _Nullable model; | ||
| 23 | 30 | ||
| 24 | @end | 31 | @end |
| 25 | 32 | ||
| @@ -28,18 +35,22 @@ | @@ -28,18 +35,22 @@ | ||
| 28 | - (instancetype)initWithFrame:(CGRect)frame liveBaseView:(LiveBaseView *_Nullable)liveBaseView | 35 | - (instancetype)initWithFrame:(CGRect)frame liveBaseView:(LiveBaseView *_Nullable)liveBaseView |
| 29 | { | 36 | { |
| 30 | if (self = [super initWithFrame:frame]) { | 37 | if (self = [super initWithFrame:frame]) { |
| 38 | + | ||
| 39 | + _images = [NSArray arrayWithObjects:@"porsch_small80",@"fighter_small80",@"plane_small80",@"love_gift",@"beer",@"chicken",@"cucumber",@"flower",@"hug",@"mouth",@"ring",@"rose",@"sticks",nil]; | ||
| 40 | + _giftNames = [NSArray arrayWithObjects:@"跑车",@"歼灭机",@"飞机",@"大大的爱心",@"啤酒",@"小鸡",@"小黄瓜",@"鲜花",@"抱抱",@"亲吻",@"戒指",@"玫瑰花",@"荧光棒",nil]; | ||
| 41 | + _prices = [NSArray arrayWithObjects:@"300000000",@"300000000",@"300000",@"30",@"30",@"3",@"3",@"1",@"3",@"1",@"3",@"30",@"300", nil]; | ||
| 42 | + _types = [NSArray arrayWithObjects:@2,@3,@4,@1,@1,@1,@1,@1,@1,@1,@1,@1,@1, nil]; | ||
| 43 | + | ||
| 31 | self.liveBaseView = liveBaseView; | 44 | self.liveBaseView = liveBaseView; |
| 32 | self.animQueueManager = [AnimQueueManager sharedAnimQueueManager]; | 45 | self.animQueueManager = [AnimQueueManager sharedAnimQueueManager]; |
| 33 | - self.animQueueManager.maxTop = 200; | ||
| 34 | 46 | ||
| 35 | - UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.width, self.height - 30)]; | ||
| 36 | - scrollView.contentSize = CGSizeMake(self.width *(self.giftArray.count/(MAX_ROW_COUNT*MAX_LINE_COUNT) + 1), self.height - 30); | 47 | + UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.width, self.height - GiftPayViewHeight)]; |
| 48 | + scrollView.contentSize = CGSizeMake(self.width *(self.giftArray.count/(MAX_ROW_COUNT*MAX_LINE_COUNT) + 1), self.height - GiftPayViewHeight); | ||
| 37 | scrollView.pagingEnabled = YES; | 49 | scrollView.pagingEnabled = YES; |
| 38 | scrollView.bounces = NO; | 50 | scrollView.bounces = NO; |
| 39 | scrollView.showsVerticalScrollIndicator = NO; | 51 | scrollView.showsVerticalScrollIndicator = NO; |
| 40 | scrollView.showsHorizontalScrollIndicator = NO; | 52 | scrollView.showsHorizontalScrollIndicator = NO; |
| 41 | [self addSubview:scrollView]; | 53 | [self addSubview:scrollView]; |
| 42 | - scrollView.backgroundColor = ZXRandomColor; | ||
| 43 | 54 | ||
| 44 | int line = 0; | 55 | int line = 0; |
| 45 | int row = 0; | 56 | int row = 0; |
| @@ -57,40 +68,67 @@ | @@ -57,40 +68,67 @@ | ||
| 57 | } | 68 | } |
| 58 | row = i % MAX_LINE_COUNT; | 69 | row = i % MAX_LINE_COUNT; |
| 59 | CGFloat giftWidth = self.width / MAX_LINE_COUNT * 1.0; | 70 | CGFloat giftWidth = self.width / MAX_LINE_COUNT * 1.0; |
| 60 | - CGFloat giftHeight = (self.height - 30) / MAX_ROW_COUNT * 1.0; | 71 | + CGFloat giftHeight = (self.height - GiftPayViewHeight) / MAX_ROW_COUNT * 1.0; |
| 61 | giftX = row * giftWidth + page * scrollView.width; | 72 | giftX = row * giftWidth + page * scrollView.width; |
| 62 | giftY = line * giftHeight; | 73 | giftY = line * giftHeight; |
| 63 | 74 | ||
| 64 | UIView *giftView = [self giftViewWithFrame:CGRectMake(giftX, giftY, giftWidth, giftHeight) model:self.giftArray[i]]; | 75 | UIView *giftView = [self giftViewWithFrame:CGRectMake(giftX, giftY, giftWidth, giftHeight) model:self.giftArray[i]]; |
| 76 | + giftView.backgroundColor = [UIColor clearColor]; | ||
| 65 | 77 | ||
| 66 | - UIImageView *picImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.giftArray[i].image]]; | 78 | + //礼物图片 |
| 79 | + UIImageView *picImg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.giftArray[i].giftImageName]]; | ||
| 67 | picImg.centerX = giftView.width * 0.5; | 80 | picImg.centerX = giftView.width * 0.5; |
| 68 | picImg.centerY = giftView.height * 0.5; | 81 | picImg.centerY = giftView.height * 0.5; |
| 69 | [giftView addSubview:picImg]; | 82 | [giftView addSubview:picImg]; |
| 70 | - | ||
| 71 | [scrollView addSubview:giftView]; | 83 | [scrollView addSubview:giftView]; |
| 72 | 84 | ||
| 73 | UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureClick:)]; | 85 | UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureClick:)]; |
| 74 | giftView.tag = i + 10; | 86 | giftView.tag = i + 10; |
| 75 | [giftView addGestureRecognizer:gesture]; | 87 | [giftView addGestureRecognizer:gesture]; |
| 76 | } | 88 | } |
| 89 | + UIImageView *giftBottomView = [[UIImageView alloc] initWithFrame:CGRectMake(0, self.height - GiftPayViewHeight, self.width, GiftPayViewHeight)]; | ||
| 90 | + giftBottomView.image = [UIImage imageNamed:@"背景400x30"]; | ||
| 91 | + giftBottomView.alpha = 0.4; | ||
| 92 | + [self addSubview:giftBottomView]; | ||
| 93 | + | ||
| 94 | + GiftPayButton *payBtn = [[GiftPayButton alloc] initWithFrame:CGRectMake(10, self.height - GiftPayViewHeight, 80, GiftPayViewHeight)]; | ||
| 95 | + [payBtn addTarget:self action:@selector(payClick) forControlEvents:UIControlEventTouchUpInside]; | ||
| 96 | + [self addSubview:payBtn]; | ||
| 97 | + | ||
| 98 | + UIButton *sendBtn = [[UIButton alloc] initWithFrame:CGRectMake(self.width - 70, self.height - GiftPayViewHeight + (GiftPayViewHeight - 30)*0.5, 60, 30)]; | ||
| 99 | + [sendBtn addTarget:self action:@selector(sendClick) forControlEvents:UIControlEventTouchUpInside]; | ||
| 100 | + [sendBtn setTitle:@"发送" forState:UIControlStateNormal]; | ||
| 101 | + [sendBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal | ||
| 102 | + ]; | ||
| 103 | + [sendBtn setBackgroundColor:[UIColor orangeColor]]; | ||
| 104 | + sendBtn.layer.cornerRadius = sendBtn.height * 0.5; | ||
| 105 | + sendBtn.layer.masksToBounds = YES; | ||
| 106 | + [self addSubview:sendBtn]; | ||
| 77 | } | 107 | } |
| 78 | return self; | 108 | return self; |
| 79 | } | 109 | } |
| 80 | 110 | ||
| 111 | +- (void)sendClick | ||
| 112 | +{ | ||
| 113 | + NSLog(@"sendClick"); | ||
| 114 | +} | ||
| 115 | + | ||
| 116 | +- (void)payClick | ||
| 117 | +{ | ||
| 118 | + NSLog(@"payClick"); | ||
| 119 | +} | ||
| 120 | + | ||
| 81 | - (UIView *)giftViewWithFrame:(CGRect)frame model:(GiftModel *)model | 121 | - (UIView *)giftViewWithFrame:(CGRect)frame model:(GiftModel *)model |
| 82 | { | 122 | { |
| 83 | _model = model; | 123 | _model = model; |
| 84 | UIView *giftView = [[UIView alloc] initWithFrame:frame]; | 124 | UIView *giftView = [[UIView alloc] initWithFrame:frame]; |
| 85 | if (model.giftStyle == GiftStyleCombo) | 125 | if (model.giftStyle == GiftStyleCombo) |
| 86 | - { | 126 | + {//右上角连击标识 |
| 87 | UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(giftView.width - 17, 3, 15, 15)]; | 127 | UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(giftView.width - 17, 3, 15, 15)]; |
| 88 | - imageView.backgroundColor = ZXRandomColor; | 128 | + imageView.image = [UIImage imageNamed:@"continuous"]; |
| 89 | [giftView addSubview:imageView]; | 129 | [giftView addSubview:imageView]; |
| 90 | - }else | ||
| 91 | - { | ||
| 92 | - | ||
| 93 | } | 130 | } |
| 131 | + //礼物价格lbl | ||
| 94 | UILabel *priceLbl = [[UILabel alloc] initWithFrame:CGRectMake(0, giftView.height - 15, 40, 14)]; | 132 | UILabel *priceLbl = [[UILabel alloc] initWithFrame:CGRectMake(0, giftView.height - 15, 40, 14)]; |
| 95 | priceLbl.font = [UIFont systemFontOfSize:kDetailContentFont]; | 133 | priceLbl.font = [UIFont systemFontOfSize:kDetailContentFont]; |
| 96 | priceLbl.textColor = [UIColor greenColor]; | 134 | priceLbl.textColor = [UIColor greenColor]; |
| @@ -99,8 +137,8 @@ | @@ -99,8 +137,8 @@ | ||
| 99 | priceLbl.height = [priceLbl labelSize].height; | 137 | priceLbl.height = [priceLbl labelSize].height; |
| 100 | priceLbl.centerX = giftView.width * 0.5 - 4; | 138 | priceLbl.centerX = giftView.width * 0.5 - 4; |
| 101 | [giftView addSubview:priceLbl]; | 139 | [giftView addSubview:priceLbl]; |
| 102 | - | ||
| 103 | - UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"littleHeart2"]]; | 140 | + //礼物价格图标 |
| 141 | + UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"diamond"]]; | ||
| 104 | image.left = priceLbl.right + 3; | 142 | image.left = priceLbl.right + 3; |
| 105 | image.centerY = priceLbl.centerY; | 143 | image.centerY = priceLbl.centerY; |
| 106 | [giftView addSubview:image]; | 144 | [giftView addSubview:image]; |
| @@ -114,7 +152,26 @@ | @@ -114,7 +152,26 @@ | ||
| 114 | NSInteger tag = gesture.view.tag - 10; | 152 | NSInteger tag = gesture.view.tag - 10; |
| 115 | NSLog(@"%zd",tag); | 153 | NSLog(@"%zd",tag); |
| 116 | //右上角添加✔️,再次点击去掉✔️ | 154 | //右上角添加✔️,再次点击去掉✔️ |
| 117 | - [self.animQueueManager addAnimationWithModel:self.giftArray[tag] animContentView:self.liveBaseView]; | 155 | + GiftModel *model = self.giftArray[tag]; |
| 156 | + if (model.giftStyle == GiftStyleCombo) { | ||
| 157 | + | ||
| 158 | + [self.animQueueManager addAnimationWithModel:self.giftArray[tag] animContentView:(UIView *)self.liveBaseView.presentView]; | ||
| 159 | + }else | ||
| 160 | + { | ||
| 161 | + [self.animQueueManager addAnimationWithModel:self.giftArray[tag] animContentView:self.liveBaseView]; | ||
| 162 | + } | ||
| 163 | +} | ||
| 164 | + | ||
| 165 | +- (NSString *)giftNameWithImageName:(NSString *)imageName | ||
| 166 | +{ | ||
| 167 | + NSString *giftName = @""; | ||
| 168 | + | ||
| 169 | + if ([_images containsObject:imageName]) { | ||
| 170 | + NSInteger index = [_images indexOfObject:imageName]; | ||
| 171 | + giftName = [_giftNames objectAtIndex:index]; | ||
| 172 | + } | ||
| 173 | + | ||
| 174 | + return giftName; | ||
| 118 | } | 175 | } |
| 119 | 176 | ||
| 120 | #pragma mark - getter | 177 | #pragma mark - getter |
| @@ -123,39 +180,37 @@ | @@ -123,39 +180,37 @@ | ||
| 123 | { | 180 | { |
| 124 | if (!_giftArray) | 181 | if (!_giftArray) |
| 125 | { | 182 | { |
| 126 | - NSArray *images = [NSArray arrayWithObjects:@"love",@"love",@"love",@"love",@"love",@"love",@"love",@"love",@"love",@"love",nil]; | ||
| 127 | - NSArray *types = [NSArray arrayWithObjects:@2,@3,@1,@1,@1,@1,@1,@1,@1,@1, nil]; | ||
| 128 | - NSArray *prices = [NSArray arrayWithObjects:@"300000000",@"3000",@"300000",@"30",@"3",@"3",@"1",@"3",@"1",@"3", nil]; | ||
| 129 | - | 183 | + NSArray *senders = [NSArray arrayWithObjects:@"张三",@"龙的传人",@"李四",@"王五",@"宋刘",@"老七",@"老八",@"老九",@"老十",@"老师",@"小十七",@"小十八",@"小十九", nil]; |
| 130 | NSMutableArray *tempArr = [NSMutableArray array]; | 184 | NSMutableArray *tempArr = [NSMutableArray array]; |
| 131 | - for (int i = 0; i < images.count; i ++) { | ||
| 132 | - GiftModel *model = [GiftModel new]; | ||
| 133 | - model.giftname = @"鲜花"; | ||
| 134 | - model.giftIconArray = @[[UIImage imageNamed:@"love"]]; | ||
| 135 | - model.giftNum = @"5"; | ||
| 136 | - model.giftRusername = @"啊啊啊啊啊啊啊啊啊啊啊啊"; | ||
| 137 | - model.giftRuserId = @"10000"; | ||
| 138 | - model.giftGusername = @"按时大多数阿萨德 爱傻傻的爱的"; | ||
| 139 | - model.giftGuserId = @"20000"; | ||
| 140 | - model.image = images[i]; | ||
| 141 | - int type = [types[i] intValue]; | 185 | + for (int i = 0; i < _images.count; i ++) { |
| 186 | + | ||
| 187 | + int type = [_types[i] intValue]; | ||
| 142 | if (type == 1) { | 188 | if (type == 1) { |
| 143 | - model.giftStyle = GiftStyleCombo; | ||
| 144 | - }else if (type == 2) | ||
| 145 | - { | ||
| 146 | - model.giftStyle = GiftStylePorsch; | ||
| 147 | - } | ||
| 148 | -// else if (type == 3) | ||
| 149 | -// { | ||
| 150 | -// model.giftStyle = GiftStyleFighter; | ||
| 151 | -// } | ||
| 152 | - else if (type == 3) | ||
| 153 | - { | ||
| 154 | - model.giftStyle = GiftStylePlane; | ||
| 155 | - } | 189 | + //combo |
| 190 | + GiftModel *model1 = [GiftModel modelWithSender:senders[i] giftName:[self giftNameWithImageName:_images[i]] icon:@"love" giftImageName:_images[i]]; | ||
| 191 | + model1.giftStyle = GiftStyleCombo; | ||
| 192 | + model1.price = _prices[i]; | ||
| 193 | + [tempArr addObject:model1]; | ||
| 194 | + | ||
| 195 | + }else | ||
| 196 | + {//expen | ||
| 197 | + GiftModel *model = [GiftModel modelWithSender:senders[i] giftName:[self giftNameWithImageName:_images[i]] icon:@"love" giftImageName:@""]; | ||
| 156 | 198 | ||
| 157 | - model.price = prices[i]; | ||
| 158 | - [tempArr addObject:model]; | 199 | + if (type == 2) { |
| 200 | + model.giftStyle = GiftStylePorsch; | ||
| 201 | + model.giftImageName = @"porsch_small80"; | ||
| 202 | + } | ||
| 203 | + if (type == 3) { | ||
| 204 | + model.giftStyle = GiftStyleFighter; | ||
| 205 | + model.giftImageName = @"fighter_small80"; | ||
| 206 | + } | ||
| 207 | + if (type == 4) { | ||
| 208 | + model.giftStyle = GiftStylePlane; | ||
| 209 | + model.giftImageName = @"plane_small80"; | ||
| 210 | + } | ||
| 211 | + model.price = _prices[i]; | ||
| 212 | + [tempArr addObject:model]; | ||
| 213 | + } | ||
| 159 | } | 214 | } |
| 160 | _giftArray = [[NSArray alloc] initWithArray:tempArr]; | 215 | _giftArray = [[NSArray alloc] initWithArray:tempArr]; |
| 161 | } | 216 | } |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftViews/GiftModelView.m deleted
100644 → 0
| 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/GiftViews/GiftPayButton.h
0 → 100644
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftViews/GiftPayButton.m
0 → 100644
| 1 | +// | ||
| 2 | +// GiftPayButton.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/20. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "GiftPayButton.h" | ||
| 10 | + | ||
| 11 | +@implementation GiftPayButton | ||
| 12 | + | ||
| 13 | +- (void)layoutSubviews | ||
| 14 | +{ | ||
| 15 | + [super layoutSubviews]; | ||
| 16 | + | ||
| 17 | + [self setTitle:@"充值 10" forState:UIControlStateNormal]; | ||
| 18 | + self.titleLabel.textAlignment = NSTextAlignmentLeft; | ||
| 19 | + self.titleLabel.font = [UIFont systemFontOfSize:kContentFont]; | ||
| 20 | + [self setTitleColor:[UIColor yellowColor] forState:UIControlStateNormal]; | ||
| 21 | + [self setImage:[UIImage imageNamed:@"diamond"] forState:UIControlStateNormal]; | ||
| 22 | + [self setImage:[UIImage imageNamed:@"diamond"] forState:UIControlStateHighlighted]; | ||
| 23 | + | ||
| 24 | + self.titleLabel.left = 0; | ||
| 25 | + self.titleLabel.top = 0; | ||
| 26 | + self.titleLabel.width = self.width - 20; | ||
| 27 | + self.titleLabel.height = self.height; | ||
| 28 | + | ||
| 29 | + self.imageView.height = 10; | ||
| 30 | + self.imageView.width = 13; | ||
| 31 | + self.imageView.left = self.width - 25; | ||
| 32 | + self.imageView.centerY = self.titleLabel.centerY; | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +/* | ||
| 36 | +// Only override drawRect: if you perform custom drawing. | ||
| 37 | +// An empty implementation adversely affects performance during animation. | ||
| 38 | +- (void)drawRect:(CGRect)rect { | ||
| 39 | + // Drawing code | ||
| 40 | +} | ||
| 41 | +*/ | ||
| 42 | + | ||
| 43 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/GiftViews/GiftModelView.h renamed to LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/Present/ComboCell.h
| 1 | // | 1 | // |
| 2 | -// GiftModelView.h | 2 | +// ComboCell.h |
| 3 | // LiveVideoCloud | 3 | // LiveVideoCloud |
| 4 | // | 4 | // |
| 5 | -// Created by 张旭 on 2017/3/14. | 5 | +// Created by 张旭 on 2017/3/17. |
| 6 | // Copyright © 2017年 cnlive. All rights reserved. | 6 | // Copyright © 2017年 cnlive. All rights reserved. |
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | -#import "BaseView.h" | ||
| 10 | - | 9 | +#import "PresentViewCell.h" |
| 11 | @class GiftModel; | 10 | @class GiftModel; |
| 12 | -@interface GiftModelView : BaseView | ||
| 13 | 11 | ||
| 14 | -+ (instancetype)giftViewWithModel:(GiftModel *)giftModel; | 12 | +@interface ComboCell : PresentViewCell |
| 13 | + | ||
| 14 | +@property (nonatomic ,strong) GiftModel * _Nullable model; | ||
| 15 | @end | 15 | @end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/Present/ComboCell.m
0 → 100644
| 1 | +// | ||
| 2 | +// ComboCell.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/17. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "ComboCell.h" | ||
| 10 | +#import "GiftModel.h" | ||
| 11 | + | ||
| 12 | +@interface ComboCell () | ||
| 13 | + | ||
| 14 | +@property (nonatomic ,strong) UIView * _Nullable bgView; | ||
| 15 | +@property (nonatomic ,strong) UIImageView * _Nullable icon; | ||
| 16 | +@property (nonatomic ,strong) UILabel * _Nullable senderNameLbl; | ||
| 17 | +@property (nonatomic ,strong) UILabel * _Nullable giftNameLbl; | ||
| 18 | +@property (nonatomic ,strong) UIImageView * _Nullable giftImage; | ||
| 19 | + | ||
| 20 | +@end | ||
| 21 | + | ||
| 22 | +@implementation ComboCell | ||
| 23 | + | ||
| 24 | +- (instancetype)initWithRow:(NSInteger)row | ||
| 25 | +{ | ||
| 26 | + if (self = [super initWithRow:row]) { | ||
| 27 | + | ||
| 28 | + [self addSubview:self.bgView]; | ||
| 29 | + [self addSubview:self.icon]; | ||
| 30 | + [self addSubview:self.senderNameLbl]; | ||
| 31 | + [self addSubview:self.giftNameLbl]; | ||
| 32 | + [self addSubview:self.giftImage]; | ||
| 33 | + } | ||
| 34 | + return self; | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +- (void)setModel:(GiftModel *)model | ||
| 38 | +{ | ||
| 39 | + _model = model; | ||
| 40 | + self.icon.image = [UIImage imageNamed:model.icon]; | ||
| 41 | + self.senderNameLbl.text = model.sender; | ||
| 42 | + self.giftNameLbl.text = [NSString stringWithFormat:@"送一个%@",model.giftName]; | ||
| 43 | + self.senderNameLbl.size = [self.senderNameLbl labelSize]; | ||
| 44 | + self.giftNameLbl.size = [self.giftNameLbl labelSize]; | ||
| 45 | + self.bgView.frame = CGRectMake(0, 0, self.width, self.height); | ||
| 46 | + self.bgView.layer.cornerRadius = self.height * 0.5; | ||
| 47 | + self.giftImage.frame = CGRectMake(self.width - self.height, 0, self.height, self.height); | ||
| 48 | + self.giftImage.image = [UIImage imageNamed:model.giftImageName]; | ||
| 49 | +} | ||
| 50 | + | ||
| 51 | +//自定义cell的展示动画 | ||
| 52 | +- (void)customDisplayAnimationOfShowShakeAnimation:(BOOL)flag | ||
| 53 | +{ | ||
| 54 | + //这里是直接使用父类中的动画,如果用户想自定义可这里实现动画,不调用父类的方法(这个方法在UIView动画的animations回调中执行) | ||
| 55 | + [super customDisplayAnimationOfShowShakeAnimation:flag]; | ||
| 56 | +} | ||
| 57 | + | ||
| 58 | +//自定义cell的隐藏动画 | ||
| 59 | +- (void)customHideAnimationOfShowShakeAnimation:(BOOL)flag | ||
| 60 | +{ | ||
| 61 | + [super customHideAnimationOfShowShakeAnimation:flag]; | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +#pragma mark - getter | ||
| 65 | +- (UILabel *)senderNameLbl | ||
| 66 | +{ | ||
| 67 | + if (!_senderNameLbl) | ||
| 68 | + { | ||
| 69 | + _senderNameLbl = [[UILabel alloc] initWithFrame:CGRectMake(self.icon.right + 5, 0, 100, 20)]; | ||
| 70 | + _senderNameLbl.font = [UIFont systemFontOfSize:kContentFont]; | ||
| 71 | + _senderNameLbl.textColor = [UIColor blackColor]; | ||
| 72 | + } | ||
| 73 | + return _senderNameLbl; | ||
| 74 | +} | ||
| 75 | + | ||
| 76 | +- (UILabel *)giftNameLbl | ||
| 77 | +{ | ||
| 78 | + if (!_giftNameLbl) | ||
| 79 | + { | ||
| 80 | + _giftNameLbl = [[UILabel alloc] initWithFrame:CGRectMake(self.icon.right + 5, self.senderNameLbl.bottom , 100, 20)]; | ||
| 81 | + _giftNameLbl.font = [UIFont systemFontOfSize:kContentFont]; | ||
| 82 | + _giftNameLbl.textColor = [UIColor blackColor]; | ||
| 83 | + } | ||
| 84 | + return _giftNameLbl; | ||
| 85 | +} | ||
| 86 | + | ||
| 87 | +- (UIImageView *)icon | ||
| 88 | +{ | ||
| 89 | + if (!_icon) | ||
| 90 | + { | ||
| 91 | + _icon = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; | ||
| 92 | + _icon.clipsToBounds = YES; | ||
| 93 | + _icon.layer.cornerRadius = 20; | ||
| 94 | + _icon.layer.borderWidth = 1; | ||
| 95 | + _icon.layer.borderColor = [UIColor cyanColor].CGColor; | ||
| 96 | + | ||
| 97 | + } | ||
| 98 | + return _icon; | ||
| 99 | +} | ||
| 100 | + | ||
| 101 | +- (UIImageView *)giftImage | ||
| 102 | +{ | ||
| 103 | + if (!_giftImage) | ||
| 104 | + { | ||
| 105 | + _giftImage = [[UIImageView alloc] init]; | ||
| 106 | + } | ||
| 107 | + return _giftImage; | ||
| 108 | +} | ||
| 109 | + | ||
| 110 | +- (UIView *)bgView | ||
| 111 | +{ | ||
| 112 | + if (!_bgView) | ||
| 113 | + { | ||
| 114 | + _bgView = [[UIView alloc] init]; | ||
| 115 | + _bgView.backgroundColor = [UIColor yellowColor]; | ||
| 116 | + _bgView.clipsToBounds = YES; | ||
| 117 | + } | ||
| 118 | + return _bgView; | ||
| 119 | +} | ||
| 120 | + | ||
| 121 | +/* | ||
| 122 | +// Only override drawRect: if you perform custom drawing. | ||
| 123 | +// An empty implementation adversely affects performance during animation. | ||
| 124 | +- (void)drawRect:(CGRect)rect { | ||
| 125 | + // Drawing code | ||
| 126 | +} | ||
| 127 | +*/ | ||
| 128 | + | ||
| 129 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/Present/PresentModelAble.h
0 → 100755
| 1 | +// | ||
| 2 | +// PresentModelAble.h | ||
| 3 | +// PresentDemo | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/17. | ||
| 6 | +// Copyright © 2017年 张旭. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +// 日志 | ||
| 12 | + | ||
| 13 | +#ifdef DEBUG | ||
| 14 | + | ||
| 15 | +#ifndef DebugLog | ||
| 16 | +#define DebugLog(fmt, ...) NSLog((@"[%s Line %d]" fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) | ||
| 17 | +#endif | ||
| 18 | + | ||
| 19 | +#else | ||
| 20 | + | ||
| 21 | +#ifndef DebugLog | ||
| 22 | +#define DebugLog(fmt, ...) | ||
| 23 | +#endif | ||
| 24 | + | ||
| 25 | +#define NSLog | ||
| 26 | + | ||
| 27 | + | ||
| 28 | +#endif | ||
| 29 | + | ||
| 30 | +/** | ||
| 31 | + * 礼物模型必须遵守的协议 | ||
| 32 | + */ | ||
| 33 | +@protocol PresentModelAble <NSObject> | ||
| 34 | + | ||
| 35 | +@required | ||
| 36 | +/** | ||
| 37 | + * 发送者 | ||
| 38 | + */ | ||
| 39 | +@property (copy, nonatomic) NSString *sender; | ||
| 40 | +/** | ||
| 41 | + * 礼物名(或礼物编号) | ||
| 42 | + */ | ||
| 43 | +@property (copy, nonatomic) NSString *giftName; | ||
| 44 | + | ||
| 45 | +@optional | ||
| 46 | + | ||
| 47 | +/** | ||
| 48 | + 需要展示的礼物连乘数 默认为0 | ||
| 49 | + | ||
| 50 | + @discussion 用于解决当前礼物消息消息展示到一半时,新加入到聊天室的人看到的礼物消息不是从1开始,如果要使用,消息体中必须包含当前礼物个数 | ||
| 51 | + */ | ||
| 52 | +@property (assign, nonatomic) NSInteger giftNumber; | ||
| 53 | + | ||
| 54 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/Present/PresentView.h
0 → 100755
| 1 | +// | ||
| 2 | +// PresentView.h | ||
| 3 | +// PresentDemo | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/17. | ||
| 6 | +// Copyright © 2017年 张旭. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +#import "PresentViewCell.h" | ||
| 11 | + | ||
| 12 | +@protocol PresentViewDelegate; | ||
| 13 | + | ||
| 14 | +@interface PresentView : UIView | ||
| 15 | + | ||
| 16 | +/** | ||
| 17 | + * cell高度(默认40) | ||
| 18 | + */ | ||
| 19 | +@property (assign, nonatomic) CGFloat cellHeight; | ||
| 20 | +/** | ||
| 21 | + * 礼物动画展示时间(默认3秒) | ||
| 22 | + */ | ||
| 23 | +@property (assign, nonatomic)NSTimeInterval showTime; | ||
| 24 | +/** | ||
| 25 | + * 轨道总数 | ||
| 26 | + */ | ||
| 27 | +@property (assign, nonatomic, readonly) NSInteger rows; | ||
| 28 | +@property (weak, nonatomic) id<PresentViewDelegate> delegate; | ||
| 29 | +/** | ||
| 30 | + * 获取对应轨道上的cell | ||
| 31 | + */ | ||
| 32 | +- (__kindof PresentViewCell *)cellForRowAtIndex:(NSUInteger)index; | ||
| 33 | +/** | ||
| 34 | + * 插入送礼消息 | ||
| 35 | + * | ||
| 36 | + * @param models 礼物模型数组中的模型必须遵守PresentModelAble协议 | ||
| 37 | + * @param flag 是否需要连乘动画 | ||
| 38 | + */ | ||
| 39 | +- (void)insertPresentMessages:(NSArray<id <PresentModelAble>> *)models showShakeAnimation:(BOOL)flag; | ||
| 40 | +/** | ||
| 41 | + 释放相关引用变量 | ||
| 42 | + */ | ||
| 43 | +- (void)releaseVariable; | ||
| 44 | + | ||
| 45 | +@end | ||
| 46 | + | ||
| 47 | +@protocol PresentViewDelegate <NSObject> | ||
| 48 | + | ||
| 49 | +@required | ||
| 50 | +/** | ||
| 51 | + * 返回自定义cell样式 | ||
| 52 | + */ | ||
| 53 | +- (PresentViewCell *)presentView:(PresentView *)presentView cellOfRow:(NSInteger)row; | ||
| 54 | +/** | ||
| 55 | + * 礼物动画即将展示的时调用,根据礼物消息类型为自定义的cell设置对应的模型数据用于展示 | ||
| 56 | + * | ||
| 57 | + * @param cell 用来展示动画的cell | ||
| 58 | + * @param model 礼物模型 | ||
| 59 | + */ | ||
| 60 | +- (void)presentView:(PresentView *)presentView | ||
| 61 | + configCell:(PresentViewCell *)cell | ||
| 62 | + model:(id<PresentModelAble>)model; | ||
| 63 | + | ||
| 64 | +@optional | ||
| 65 | + | ||
| 66 | +/** | ||
| 67 | + * cell点击事件 | ||
| 68 | + */ | ||
| 69 | +- (void)presentView:(PresentView *)presentView didSelectedCellOfRowAtIndex:(NSUInteger)index; | ||
| 70 | + | ||
| 71 | +/** | ||
| 72 | + 一组连乘动画执行完成回调 | ||
| 73 | + */ | ||
| 74 | +- (void)presentView:(PresentView *)presentView animationCompleted:(NSInteger)shakeNumber model:(id<PresentModelAble>)model; | ||
| 75 | + | ||
| 76 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/Present/PresentView.m
0 → 100755
| 1 | +// | ||
| 2 | +// PresentView.m | ||
| 3 | +// PresentDemo | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/17. | ||
| 6 | +// Copyright © 2017年 张旭. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "PresentView.h" | ||
| 10 | + | ||
| 11 | +#define Margin 20 | ||
| 12 | + | ||
| 13 | +@interface PresentView ()<PresentViewCellDelegate> | ||
| 14 | + | ||
| 15 | +/** | ||
| 16 | + * 带连乘动画的消息缓存数组 | ||
| 17 | + */ | ||
| 18 | +@property (strong, nonatomic) NSMutableArray *dataCaches; | ||
| 19 | +/** | ||
| 20 | + * 不带连乘动画的消息缓存数组 | ||
| 21 | + */ | ||
| 22 | +@property (strong, nonatomic)NSMutableArray *nonshakeDataCaches; | ||
| 23 | +/** | ||
| 24 | + * 记录presentView上的cell | ||
| 25 | + */ | ||
| 26 | +@property (strong, nonatomic) NSMutableArray *showCells; | ||
| 27 | + | ||
| 28 | +@end | ||
| 29 | + | ||
| 30 | +@implementation PresentView | ||
| 31 | + | ||
| 32 | +#pragma mark - Setter/Getter | ||
| 33 | + | ||
| 34 | +- (void)setCellHeight:(CGFloat)cellHeight | ||
| 35 | +{ | ||
| 36 | + _cellHeight = cellHeight; | ||
| 37 | + | ||
| 38 | + [self setNeedsDisplay]; | ||
| 39 | +} | ||
| 40 | + | ||
| 41 | +- (NSMutableArray *)dataCaches | ||
| 42 | +{ | ||
| 43 | + if (!_dataCaches) { | ||
| 44 | + _dataCaches = [NSMutableArray array]; | ||
| 45 | + } | ||
| 46 | + return _dataCaches; | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +- (NSMutableArray *)nonshakeDataCaches | ||
| 50 | +{ | ||
| 51 | + if (!_nonshakeDataCaches) { | ||
| 52 | + _nonshakeDataCaches = [NSMutableArray array]; | ||
| 53 | + } | ||
| 54 | + return _nonshakeDataCaches; | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +- (NSMutableArray *)showCells | ||
| 58 | +{ | ||
| 59 | + if (!_showCells) { | ||
| 60 | + _showCells = [NSMutableArray array]; | ||
| 61 | + } | ||
| 62 | + return _showCells; | ||
| 63 | +} | ||
| 64 | + | ||
| 65 | +#pragma mark - Initial | ||
| 66 | + | ||
| 67 | +- (instancetype)init | ||
| 68 | +{ | ||
| 69 | + if (self = [super init]) { | ||
| 70 | + self.userInteractionEnabled = NO; | ||
| 71 | + } | ||
| 72 | + return self; | ||
| 73 | +} | ||
| 74 | + | ||
| 75 | +- (void)awakeFromNib | ||
| 76 | +{ | ||
| 77 | + [super awakeFromNib]; | ||
| 78 | + | ||
| 79 | + self.userInteractionEnabled = NO; | ||
| 80 | +} | ||
| 81 | + | ||
| 82 | +- (void)drawRect:(CGRect)rect | ||
| 83 | +{ | ||
| 84 | + [super drawRect:rect]; | ||
| 85 | + | ||
| 86 | + //初始值 | ||
| 87 | + self.showTime = 3; | ||
| 88 | + | ||
| 89 | + //添加cell | ||
| 90 | + self.cellHeight = self.cellHeight ? self.cellHeight : 40; | ||
| 91 | + _rows = (int)floor(rect.size.height / (self.cellHeight + Margin)); | ||
| 92 | + CGFloat inset = rect.size.height - (self.cellHeight + Margin) * _rows + Margin; | ||
| 93 | + inset = MAX(0, inset) * 0.5; | ||
| 94 | + for (int index = 0; index < _rows; index++) { | ||
| 95 | + CGFloat w = rect.size.width; | ||
| 96 | + CGFloat y = inset + (self.cellHeight + Margin) * index; | ||
| 97 | + CGFloat x = -w; | ||
| 98 | + PresentViewCell *cell = [self.delegate presentView:self cellOfRow:index]; | ||
| 99 | + cell.frame = CGRectMake(x, y, w, self.cellHeight); | ||
| 100 | + cell.delegate = self; | ||
| 101 | + [self addSubview:cell]; | ||
| 102 | + [self.showCells addObject:cell]; | ||
| 103 | + } | ||
| 104 | +} | ||
| 105 | + | ||
| 106 | +- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event | ||
| 107 | +{ | ||
| 108 | + UITouch *touch = touches.anyObject; | ||
| 109 | + CGPoint point = [touch locationInView:self]; | ||
| 110 | + for (int index = 0; index < self.showCells.count; index++) { | ||
| 111 | + PresentViewCell *cell = self.showCells[index]; | ||
| 112 | + if (CGRectContainsPoint(cell.frame, point)) { | ||
| 113 | + if ([self.delegate respondsToSelector:@selector(presentView:didSelectedCellOfRowAtIndex:)]) { | ||
| 114 | + [self.delegate presentView:self didSelectedCellOfRowAtIndex:index]; | ||
| 115 | + } | ||
| 116 | + break; | ||
| 117 | + } | ||
| 118 | + } | ||
| 119 | +} | ||
| 120 | + | ||
| 121 | +#pragma mark - Private | ||
| 122 | + | ||
| 123 | +//问题一:如果展示动画还在执行,就收到了新的连乘动画消息,这时会判定为去执行连乘动画,因为展示动画还没有执行完成,所以连乘lable还没有被创建,所以会导致连乘动画会消失 | ||
| 124 | +//解决办法:等连展示动画执行完成了,才能开始连乘动画,否则连乘动画消息就被缓存 | ||
| 125 | + | ||
| 126 | +//问题二:点击礼物4,等礼物4快要消失的时候,点击礼物1。会出现两个礼物1,并且下面的cell不会消失,导致礼物1的消息都会被缓存起来 | ||
| 127 | +//问题原因:当礼物4将要隐藏时,这时接收到礼物1的消息,就会利用空闲的cell来展示礼物1,但这是没有马上删除礼物1的缓存,而是等到礼物1展示完成才删除的,所以礼物4展示完成就会检测缓存,这时礼物1并没有被删除,所以这里又会展示礼物1,这就导致了礼物一被展示了两次 | ||
| 128 | +//解决办法:当礼物4执行完成了,去取缓存的时候,如果取到了缓存,还需要判断这个缓存当前有没有在展示,如果在展示就不做处理,如果没有在展示就利用当前的cell去展示它 | ||
| 129 | + | ||
| 130 | +//问题三:连续快速点击礼物1,会分两次动画展示 | ||
| 131 | +//问题原因:因为两次送的礼物相同,如果快速点击,会发生用于展示第一个礼物的cell还处在AnimationStateShowing状态时,就收到第二个礼物,这个是时候的逻辑处理是将第二个消息缓存了起来(为了解决上述的问题一) | ||
| 132 | + | ||
| 133 | +/** | ||
| 134 | + * 插入带连乘动画的消息 | ||
| 135 | + */ | ||
| 136 | +- (void)insertShowShakeAnimationMessages:(NSArray<id<PresentModelAble>> *)models | ||
| 137 | +{ | ||
| 138 | + for (int index = 0; index < models.count; index++) { | ||
| 139 | + id<PresentModelAble> obj = models[index]; | ||
| 140 | + PresentViewCell *cell = [self examinePresentingCell:obj]; | ||
| 141 | + if (cell) { | ||
| 142 | + if (cell.state == AnimationStateShowing) { | ||
| 143 | + //在执行展示动画期间如果收到了连乘动画礼物消息,就将消息缓存 | ||
| 144 | + [self.dataCaches addObject:obj]; | ||
| 145 | + }else { | ||
| 146 | + if ([obj giftNumber] > 0) { | ||
| 147 | + [cell shakeAnimationWithModels:@[obj]]; | ||
| 148 | + } else { | ||
| 149 | + [cell shakeAnimationWithNumber:1]; | ||
| 150 | + } | ||
| 151 | + } | ||
| 152 | + }else { | ||
| 153 | + [self.dataCaches addObject:obj];//将当前消息加到缓存中 | ||
| 154 | + NSArray *cells = [self examinePresentViewCells]; | ||
| 155 | + if (cells.count) { | ||
| 156 | + cell = cells.firstObject; | ||
| 157 | + //设置后,再次展示的动画才会生效 | ||
| 158 | + cell.showTime = self.showTime; | ||
| 159 | + __weak typeof(self) ws = self; | ||
| 160 | + [cell showAnimationWithModel:obj showShakeAnimation:YES prepare:^{ | ||
| 161 | + if ([ws.delegate respondsToSelector:@selector(presentView:configCell:model:)]) { | ||
| 162 | + [ws.delegate presentView:ws configCell:cell model:obj]; | ||
| 163 | + } | ||
| 164 | + } completion:^(BOOL flag) { | ||
| 165 | + if (flag) { | ||
| 166 | + //如果相同礼物类型的消息缓存在执行展示动画之前就删除了,这就会造成在cell执行展示动画期间收到的相同类型的消息会被缓存到下一个cell中展示 | ||
| 167 | + if ([obj giftNumber] > 0) { | ||
| 168 | + [cell shakeAnimationWithModels:[self subarrayWithObj:obj]]; | ||
| 169 | + }else { | ||
| 170 | + [cell shakeAnimationWithNumber:[self subarrayWithObj:obj].count]; | ||
| 171 | + } | ||
| 172 | + } | ||
| 173 | + }]; | ||
| 174 | + } | ||
| 175 | + } | ||
| 176 | + } | ||
| 177 | +} | ||
| 178 | + | ||
| 179 | +/** | ||
| 180 | + * 插入不带连城动画的消息 | ||
| 181 | + */ | ||
| 182 | +- (void)insertNonshakeAnimationMessages:(NSArray<id<PresentModelAble>> *)models | ||
| 183 | +{ | ||
| 184 | + if (models) { | ||
| 185 | + [self.nonshakeDataCaches addObjectsFromArray:models]; | ||
| 186 | + } | ||
| 187 | + NSArray *freeCells = [self examinePresentViewCells]; | ||
| 188 | + if (self.nonshakeDataCaches.count > 0 && freeCells.count > 0) { | ||
| 189 | + id<PresentModelAble> obj = self.nonshakeDataCaches.firstObject; | ||
| 190 | + [self.nonshakeDataCaches removeObjectAtIndex:0]; | ||
| 191 | + PresentViewCell *cell = freeCells.firstObject; | ||
| 192 | + cell.showTime = self.showTime; | ||
| 193 | + __weak typeof(self) ws = self; | ||
| 194 | + [cell showAnimationWithModel:obj showShakeAnimation:NO prepare:^{ | ||
| 195 | + if ([ws.delegate respondsToSelector:@selector(presentView:configCell:model:)]) { | ||
| 196 | + [ws.delegate presentView:ws configCell:cell model:obj]; | ||
| 197 | + } | ||
| 198 | + } completion:^(BOOL flag) { | ||
| 199 | + if (!flag) { | ||
| 200 | + [cell performSelector:@selector(hiddenAnimationOfShowShake:) withObject:@(NO) afterDelay:self.showTime]; | ||
| 201 | + } | ||
| 202 | + }]; | ||
| 203 | + } | ||
| 204 | +} | ||
| 205 | + | ||
| 206 | +/** | ||
| 207 | + * 检测插入的消息模型 | ||
| 208 | + */ | ||
| 209 | +- (NSArray *)checkElementOfModels:(NSArray<id<PresentModelAble>> *)models | ||
| 210 | +{ | ||
| 211 | + NSMutableArray *siftArray = [NSMutableArray array]; | ||
| 212 | + for (id obj in models) { | ||
| 213 | + if (![obj conformsToProtocol:@protocol(PresentModelAble)]) { | ||
| 214 | + DebugLog(@"%@对象没有遵守PresentModelAble协议", obj); | ||
| 215 | + }else { | ||
| 216 | + [siftArray addObject:obj]; | ||
| 217 | + } | ||
| 218 | + } | ||
| 219 | + return siftArray; | ||
| 220 | +} | ||
| 221 | + | ||
| 222 | +/** | ||
| 223 | + * 检测当前是否有obj类型的礼物消息在展示 | ||
| 224 | + */ | ||
| 225 | +- (PresentViewCell *)examinePresentingCell:(id<PresentModelAble>)obj | ||
| 226 | +{ | ||
| 227 | + for (PresentViewCell *cell in self.showCells) { | ||
| 228 | + if ([cell.sender isEqualToString:[obj sender]] && [cell.giftName isEqualToString:[obj giftName]]) { | ||
| 229 | + //当前正在展示动画并且不是隐藏动画 | ||
| 230 | + if (cell.state != AnimationStateNone && cell.state != AnimationStateHiding ) return cell; | ||
| 231 | + } | ||
| 232 | + } | ||
| 233 | + return nil; | ||
| 234 | +} | ||
| 235 | + | ||
| 236 | +/** | ||
| 237 | + * 检测空闲cell | ||
| 238 | + */ | ||
| 239 | +- (NSArray<PresentViewCell *> *)examinePresentViewCells | ||
| 240 | +{ | ||
| 241 | + NSMutableArray *freeCells = [NSMutableArray array]; | ||
| 242 | + for (PresentViewCell *cell in self.showCells) { | ||
| 243 | + if (cell.state == AnimationStateNone) { | ||
| 244 | + [freeCells addObject:cell]; | ||
| 245 | + } | ||
| 246 | + } | ||
| 247 | + return freeCells; | ||
| 248 | +} | ||
| 249 | + | ||
| 250 | +/** | ||
| 251 | + * 从缓存中截取与obj类型相同的消息 | ||
| 252 | + */ | ||
| 253 | +- (NSArray<id<PresentModelAble>> *)subarrayWithObj:(id<PresentModelAble>)obj | ||
| 254 | +{ | ||
| 255 | + NSMutableArray *array = [NSMutableArray array]; | ||
| 256 | + for (id<PresentModelAble> cache in self.dataCaches) { | ||
| 257 | + if ([[cache sender] isEqualToString:[obj sender]] && [[cache giftName] isEqualToString:[obj giftName]]) { | ||
| 258 | + [array addObject:cache]; | ||
| 259 | + } | ||
| 260 | + } | ||
| 261 | + [self.dataCaches removeObjectsInArray:array];//取出的数据从缓存中移除 | ||
| 262 | + return array; | ||
| 263 | +} | ||
| 264 | + | ||
| 265 | +#pragma mark - Public | ||
| 266 | + | ||
| 267 | +- (void)insertPresentMessages:(NSArray<id<PresentModelAble>> *)models showShakeAnimation:(BOOL)flag | ||
| 268 | +{ | ||
| 269 | + NSArray *siftArray = [self checkElementOfModels:models]; | ||
| 270 | + if (!siftArray.count) return; | ||
| 271 | + if (flag) { | ||
| 272 | + [self insertShowShakeAnimationMessages:siftArray]; | ||
| 273 | + }else { | ||
| 274 | + [self insertNonshakeAnimationMessages:siftArray]; | ||
| 275 | + } | ||
| 276 | +} | ||
| 277 | + | ||
| 278 | +- (PresentViewCell *)cellForRowAtIndex:(NSUInteger)index | ||
| 279 | +{ | ||
| 280 | + if (index < self.showCells.count) | ||
| 281 | + { | ||
| 282 | + return self.showCells[index]; | ||
| 283 | + } | ||
| 284 | + return nil; | ||
| 285 | +} | ||
| 286 | + | ||
| 287 | +- (void)releaseVariable | ||
| 288 | +{ | ||
| 289 | + [self.dataCaches removeAllObjects]; | ||
| 290 | + [self.nonshakeDataCaches removeAllObjects]; | ||
| 291 | + [self.showCells makeObjectsPerformSelector:@selector(removeFromSuperview)]; | ||
| 292 | + [self.showCells removeAllObjects]; | ||
| 293 | +} | ||
| 294 | + | ||
| 295 | +#pragma mark - PresentViewCellDelegate | ||
| 296 | + | ||
| 297 | +- (void)presentViewCell:(PresentViewCell *)cell showShakeAnimation:(BOOL)flag shakeNumber:(NSInteger)number | ||
| 298 | +{ | ||
| 299 | + if ([self.delegate respondsToSelector:@selector(presentView:animationCompleted:model:)]) { | ||
| 300 | + [self.delegate presentView:self animationCompleted:number model:cell.baseModel]; | ||
| 301 | + } | ||
| 302 | + if (self.dataCaches.count) { | ||
| 303 | + id<PresentModelAble> obj = self.dataCaches.firstObject; | ||
| 304 | + if (![self examinePresentingCell:obj]) { | ||
| 305 | + //取到的缓存当前没有在展示 | ||
| 306 | + __weak typeof(self) ws = self; | ||
| 307 | + [cell showAnimationWithModel:obj showShakeAnimation:YES prepare:^{ | ||
| 308 | + if ([ws.delegate respondsToSelector:@selector(presentView:configCell:model:)]) { | ||
| 309 | + [ws.delegate presentView:ws configCell:cell model:obj]; | ||
| 310 | + } | ||
| 311 | + } completion:^(BOOL flag) { | ||
| 312 | + if (flag) { | ||
| 313 | + if ([obj giftNumber] > 0) { | ||
| 314 | + [cell shakeAnimationWithModels:[self subarrayWithObj:obj]]; | ||
| 315 | + }else { | ||
| 316 | + [cell shakeAnimationWithNumber:[self subarrayWithObj:obj].count]; | ||
| 317 | + } | ||
| 318 | + } | ||
| 319 | + }]; | ||
| 320 | + } | ||
| 321 | + }else if (self.nonshakeDataCaches.count) { | ||
| 322 | + //带连乘的缓存优先处理 | ||
| 323 | + [self insertNonshakeAnimationMessages:nil]; | ||
| 324 | + }else { | ||
| 325 | + [cell releaseVariable]; | ||
| 326 | + } | ||
| 327 | +} | ||
| 328 | + | ||
| 329 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/Present/PresentViewCell.h
0 → 100755
| 1 | +// | ||
| 2 | +// PresentViewCell.h | ||
| 3 | +// PresentDemo | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/17. | ||
| 6 | +// Copyright © 2017年 张旭. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +#import "PresentModelAble.h" | ||
| 11 | + | ||
| 12 | +//动画状态 | ||
| 13 | +typedef NS_ENUM(NSUInteger, AnimationState) { | ||
| 14 | + AnimationStateNone = 0, | ||
| 15 | + AnimationStateShowing, | ||
| 16 | + AnimationStateShaking, | ||
| 17 | + AnimationStateShaked, | ||
| 18 | + AnimationStateHiding | ||
| 19 | +}; | ||
| 20 | + | ||
| 21 | +@protocol PresentViewCellDelegate; | ||
| 22 | + | ||
| 23 | +@interface PresentViewCell : UIView | ||
| 24 | + | ||
| 25 | +@property (weak, nonatomic) id<PresentViewCellDelegate> delegate; | ||
| 26 | +/** | ||
| 27 | + * cell展示时间 | ||
| 28 | + */ | ||
| 29 | +@property (assign, nonatomic)NSTimeInterval showTime; | ||
| 30 | +/** | ||
| 31 | + * 轨道编号 | ||
| 32 | + */ | ||
| 33 | +@property (assign, nonatomic, readonly) NSInteger row; | ||
| 34 | +/** | ||
| 35 | + * cell当前的动画状态 | ||
| 36 | + */ | ||
| 37 | +@property (assign, nonatomic, readonly) AnimationState state; | ||
| 38 | +/** | ||
| 39 | + 礼物模型 | ||
| 40 | + */ | ||
| 41 | +@property (strong, nonatomic, readonly)id<PresentModelAble> baseModel; | ||
| 42 | +/** | ||
| 43 | + * 礼物发送者 | ||
| 44 | + */ | ||
| 45 | +@property (copy, nonatomic, readonly) NSString *sender; | ||
| 46 | +/** | ||
| 47 | + * 礼物名 | ||
| 48 | + */ | ||
| 49 | +@property (copy, nonatomic, readonly) NSString *giftName; | ||
| 50 | + | ||
| 51 | +- (instancetype)initWithRow:(NSInteger)row; | ||
| 52 | +/** | ||
| 53 | + * 显示cell动画 | ||
| 54 | + * | ||
| 55 | + * @param model 礼物模型 | ||
| 56 | + * @param flag 是否带连乘动画 | ||
| 57 | + * @param prepare 准备动画回调 | ||
| 58 | + * @param completion 动画完成回调 | ||
| 59 | + */ | ||
| 60 | +- (void)showAnimationWithModel:(id<PresentModelAble> )model | ||
| 61 | + showShakeAnimation:(BOOL)flag | ||
| 62 | + prepare:(void (^)(void))prepare | ||
| 63 | + completion:(void (^)(BOOL flag))completion; | ||
| 64 | +/** | ||
| 65 | + * 连乘动画 | ||
| 66 | + * | ||
| 67 | + * @param number 连乘次数 | ||
| 68 | + */ | ||
| 69 | +- (void)shakeAnimationWithNumber:(NSInteger)number; | ||
| 70 | +/** | ||
| 71 | + 连乘动画 | ||
| 72 | + | ||
| 73 | + @discussion 当礼物模型中拥有礼物个数时,才调用此接口 | ||
| 74 | + @param model 礼物模型 | ||
| 75 | + */ | ||
| 76 | +- (void)shakeAnimationWithModels:(NSArray<id<PresentModelAble>> *)models; | ||
| 77 | +/** | ||
| 78 | + * 隐藏cell动画 | ||
| 79 | + * | ||
| 80 | + * @param flag 是否带有连城动画 | ||
| 81 | + */ | ||
| 82 | +- (void)hiddenAnimationOfShowShake:(BOOL)flag; | ||
| 83 | +/** | ||
| 84 | + * 释放引用变量 | ||
| 85 | + */ | ||
| 86 | +- (void)releaseVariable; | ||
| 87 | + | ||
| 88 | +@end | ||
| 89 | + | ||
| 90 | + | ||
| 91 | + | ||
| 92 | +//供子类重写的接口 | ||
| 93 | +@interface PresentViewCell (OverWrite) | ||
| 94 | + | ||
| 95 | +/** | ||
| 96 | + * 自定义展示动画 | ||
| 97 | + * | ||
| 98 | + * @param flag 是否带有连乘动画 | ||
| 99 | + */ | ||
| 100 | +- (void)customDisplayAnimationOfShowShakeAnimation:(BOOL)flag; | ||
| 101 | +/** | ||
| 102 | + * 自定义隐藏动画 | ||
| 103 | + * | ||
| 104 | + * @param flag 是否带有连乘动画 | ||
| 105 | + */ | ||
| 106 | +- (void)customHideAnimationOfShowShakeAnimation:(BOOL)flag; | ||
| 107 | + | ||
| 108 | +@end | ||
| 109 | + | ||
| 110 | + | ||
| 111 | + | ||
| 112 | +@interface PresentLable : UILabel | ||
| 113 | + | ||
| 114 | +/** | ||
| 115 | + * 数字描边颜色 | ||
| 116 | + */ | ||
| 117 | +@property (strong, nonatomic) UIColor *borderColor; | ||
| 118 | +/** | ||
| 119 | + * 开始连乘动画 | ||
| 120 | + * | ||
| 121 | + * @param interval 动画时间 | ||
| 122 | + * @param completion 动画完成回调 | ||
| 123 | + */ | ||
| 124 | +- (void)startAnimationDuration:(NSTimeInterval)interval | ||
| 125 | + completion:(void (^)(BOOL finish))completion; | ||
| 126 | + | ||
| 127 | +@end | ||
| 128 | + | ||
| 129 | + | ||
| 130 | + | ||
| 131 | +@protocol PresentViewCellDelegate <NSObject> | ||
| 132 | + | ||
| 133 | +@optional | ||
| 134 | +/** | ||
| 135 | + * 一组动画组完成回调 | ||
| 136 | + * | ||
| 137 | + * @param flag 是否带连乘动画 | ||
| 138 | + * @param number 最终连乘数,如果flag为NO number就为0 | ||
| 139 | + */ | ||
| 140 | +- (void)presentViewCell:(PresentViewCell *)cell | ||
| 141 | + showShakeAnimation:(BOOL)flag | ||
| 142 | + shakeNumber:(NSInteger)number; | ||
| 143 | + | ||
| 144 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/Gift/Present/PresentViewCell.m
0 → 100755
| 1 | +// | ||
| 2 | +// PresentViewCell.m | ||
| 3 | +// PresentDemo | ||
| 4 | +// | ||
| 5 | +// Created by 张旭 on 2017/3/17. | ||
| 6 | +// Copyright © 2017年 张旭. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "PresentViewCell.h" | ||
| 10 | + | ||
| 11 | +#define Duration 0.3 | ||
| 12 | + | ||
| 13 | +@interface PresentViewCell () | ||
| 14 | + | ||
| 15 | +@property (weak, nonatomic) PresentLable *shakeLable; | ||
| 16 | +/** | ||
| 17 | + * 记录礼物连乘数 | ||
| 18 | + */ | ||
| 19 | +@property (assign, nonatomic) NSInteger number; | ||
| 20 | +/** | ||
| 21 | + * 记录cell最初始的frame(即开始展示动画前的frame) | ||
| 22 | + */ | ||
| 23 | +@property (assign, nonatomic) CGRect originalFrame; | ||
| 24 | +/** | ||
| 25 | + * shake动画的缓存数组 | ||
| 26 | + */ | ||
| 27 | +@property (strong, nonatomic) NSMutableArray *caches; | ||
| 28 | +/** | ||
| 29 | + shake动画模型的缓存数组 | ||
| 30 | + */ | ||
| 31 | +@property (strong, nonatomic) NSMutableArray *modelCaches; | ||
| 32 | + | ||
| 33 | +@end | ||
| 34 | + | ||
| 35 | +@implementation PresentViewCell | ||
| 36 | + | ||
| 37 | +#pragma mark - Setter/Getter | ||
| 38 | + | ||
| 39 | +- (NSMutableArray *)caches | ||
| 40 | +{ | ||
| 41 | + if (!_caches) { | ||
| 42 | + _caches = [NSMutableArray array]; | ||
| 43 | + } | ||
| 44 | + return _caches; | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +- (NSMutableArray *)modelCaches | ||
| 48 | +{ | ||
| 49 | + if (!_modelCaches) { | ||
| 50 | + _modelCaches = [NSMutableArray array]; | ||
| 51 | + } | ||
| 52 | + return _modelCaches; | ||
| 53 | +} | ||
| 54 | + | ||
| 55 | +#pragma mark - Initial | ||
| 56 | + | ||
| 57 | +- (instancetype)initWithRow:(NSInteger)row | ||
| 58 | +{ | ||
| 59 | + if (self = [super init]) { | ||
| 60 | + _row = row; | ||
| 61 | + _state = AnimationStateNone; | ||
| 62 | + } | ||
| 63 | + return self; | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | +#pragma mark - Private | ||
| 67 | + | ||
| 68 | +/** | ||
| 69 | + * 添加连乘lable | ||
| 70 | + */ | ||
| 71 | +- (void)addShakeLable | ||
| 72 | +{ | ||
| 73 | + PresentLable *lable = [[PresentLable alloc] init]; | ||
| 74 | + lable.backgroundColor = [UIColor clearColor]; | ||
| 75 | + lable.borderColor = [UIColor yellowColor]; | ||
| 76 | + lable.textColor = [UIColor greenColor]; | ||
| 77 | + lable.font = [UIFont systemFontOfSize:17.0]; | ||
| 78 | + lable.textAlignment = NSTextAlignmentCenter; | ||
| 79 | + lable.alpha = 0.0; | ||
| 80 | + CGFloat w = 60; | ||
| 81 | + CGFloat h = 20; | ||
| 82 | + CGFloat x = CGRectGetWidth(self.frame); | ||
| 83 | + CGFloat y = - h * 0.5 + self.frame.size.height * 0.5; | ||
| 84 | + lable.frame = CGRectMake(x, y, w, h); | ||
| 85 | + self.shakeLable = lable; | ||
| 86 | + [self addSubview:lable]; | ||
| 87 | +} | ||
| 88 | + | ||
| 89 | +/** | ||
| 90 | + * 开始连乘动画(利用递归实现连乘动画) | ||
| 91 | + * | ||
| 92 | + * @param number 连乘次数 | ||
| 93 | + * @param block 当前number次连乘动画执行完成回调 | ||
| 94 | + */ | ||
| 95 | +- (void)startShakeAnimationWithNumber:(NSInteger)number completion:(void (^)(BOOL finished))block | ||
| 96 | +{ | ||
| 97 | + self.superview.userInteractionEnabled = YES; | ||
| 98 | + _state = AnimationStateShaking; | ||
| 99 | + self.shakeLable.text = [NSString stringWithFormat:@"X%ld", ++self.number]; | ||
| 100 | + __weak typeof(self) ws = self; | ||
| 101 | + [self.shakeLable startAnimationDuration:Duration completion:^(BOOL finish) { | ||
| 102 | + if (number > 1) { | ||
| 103 | + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | ||
| 104 | + [ws startShakeAnimationWithNumber:(number - 1) completion:block]; | ||
| 105 | + }); | ||
| 106 | + }else { | ||
| 107 | + _state = AnimationStateShaked; | ||
| 108 | + if (block) { | ||
| 109 | + block(YES); | ||
| 110 | + } | ||
| 111 | + } | ||
| 112 | + }]; | ||
| 113 | +} | ||
| 114 | + | ||
| 115 | +#pragma mark - Public | ||
| 116 | + | ||
| 117 | +- (void)showAnimationWithModel:(id<PresentModelAble>)model showShakeAnimation:(BOOL)flag prepare:(void (^)(void))prepare completion:(void (^)(BOOL))completion | ||
| 118 | +{ | ||
| 119 | + _state = AnimationStateShowing; | ||
| 120 | + _baseModel = model; | ||
| 121 | + _sender = [model sender]; | ||
| 122 | + _giftName = [model giftName]; | ||
| 123 | + self.originalFrame = self.frame; | ||
| 124 | + self.number = 0; | ||
| 125 | + if (prepare) { | ||
| 126 | + prepare(); | ||
| 127 | + } | ||
| 128 | + [UIView animateWithDuration:Duration delay:0 usingSpringWithDamping:1.0 initialSpringVelocity:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{ | ||
| 129 | + [self customDisplayAnimationOfShowShakeAnimation:flag]; | ||
| 130 | + } completion:^(BOOL finished) { | ||
| 131 | + if (flag) { | ||
| 132 | + if (!self.shakeLable) { | ||
| 133 | + [self addShakeLable]; | ||
| 134 | + } | ||
| 135 | + self.shakeLable.alpha = 1.0; | ||
| 136 | + } | ||
| 137 | + if (completion) { | ||
| 138 | + completion(flag); | ||
| 139 | + } | ||
| 140 | + }]; | ||
| 141 | +} | ||
| 142 | + | ||
| 143 | +- (void)shakeAnimationWithNumber:(NSInteger)number | ||
| 144 | +{ | ||
| 145 | + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(hiddenAnimationOfShowShake:) object:@(YES)]; | ||
| 146 | + [self performSelector:@selector(hiddenAnimationOfShowShake:) withObject:@(YES) afterDelay:self.showTime]; | ||
| 147 | + if (number > 0) [self.caches addObject:@(number)]; | ||
| 148 | + if (self.caches.count > 0 && _state != AnimationStateShaking) { | ||
| 149 | + NSInteger cache = [self.caches.firstObject integerValue]; | ||
| 150 | + [self.caches removeObjectAtIndex:0];//不能删除对象,因为可能有相同的对象 | ||
| 151 | + __weak typeof(self) ws = self;// | ||
| 152 | + [self startShakeAnimationWithNumber:cache completion:^(BOOL finished) { | ||
| 153 | + [ws shakeAnimationWithNumber:-1];//传-1是为了缓存不被重复添加 | ||
| 154 | + }]; | ||
| 155 | + } | ||
| 156 | +} | ||
| 157 | + | ||
| 158 | +- (void)shakeAnimationWithModels:(NSArray<id<PresentModelAble>> *)models | ||
| 159 | +{ | ||
| 160 | + [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(hiddenAnimationOfShowShake:) object:@(YES)]; | ||
| 161 | + [self performSelector:@selector(hiddenAnimationOfShowShake:) withObject:@(YES) afterDelay:self.showTime]; | ||
| 162 | + if (models.count > 0) [self.modelCaches addObjectsFromArray:models]; | ||
| 163 | + if (self.modelCaches.count > 0 && _state != AnimationStateShaking) { | ||
| 164 | + _state = AnimationStateShaking; | ||
| 165 | + id<PresentModelAble> obj = self.modelCaches.firstObject; | ||
| 166 | + self.shakeLable.text = [NSString stringWithFormat:@"X%ld", [obj giftNumber]]; | ||
| 167 | + [self.modelCaches removeObjectAtIndex:0]; | ||
| 168 | + __weak typeof(self) ws = self; | ||
| 169 | + [self.shakeLable startAnimationDuration:Duration completion:^(BOOL finish) { | ||
| 170 | + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | ||
| 171 | + _state = AnimationStateShaked; | ||
| 172 | + if (ws.modelCaches.count > 0) { | ||
| 173 | + [ws shakeAnimationWithModels:nil]; | ||
| 174 | + } | ||
| 175 | + }); | ||
| 176 | + }]; | ||
| 177 | + } | ||
| 178 | +} | ||
| 179 | + | ||
| 180 | +- (void)hiddenAnimationOfShowShake:(BOOL)flag | ||
| 181 | +{ | ||
| 182 | + self.superview.userInteractionEnabled = NO; | ||
| 183 | + _state = AnimationStateHiding; | ||
| 184 | + [UIView animateWithDuration:Duration delay:0 usingSpringWithDamping:1.0 initialSpringVelocity:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{ | ||
| 185 | + [self customHideAnimationOfShowShakeAnimation:flag]; | ||
| 186 | + } completion:^(BOOL finished) { | ||
| 187 | + | ||
| 188 | + //恢复cell的初始状态 | ||
| 189 | + self.frame = self.originalFrame; | ||
| 190 | + _state = AnimationStateNone; | ||
| 191 | + self.shakeLable.alpha = 0.0; | ||
| 192 | + [self.caches removeAllObjects]; | ||
| 193 | + [self.modelCaches removeAllObjects]; | ||
| 194 | + | ||
| 195 | + //通知代理 | ||
| 196 | + if ([self.delegate respondsToSelector:@selector(presentViewCell:showShakeAnimation:shakeNumber:)]) { | ||
| 197 | + [self.delegate presentViewCell:self showShakeAnimation:flag shakeNumber:self.number]; | ||
| 198 | + | ||
| 199 | + } | ||
| 200 | + }]; | ||
| 201 | +} | ||
| 202 | + | ||
| 203 | +//目前还没有使用 | ||
| 204 | +- (void)releaseVariable | ||
| 205 | +{ | ||
| 206 | +// [self.shakeLable removeFromSuperview]; | ||
| 207 | +} | ||
| 208 | + | ||
| 209 | +@end | ||
| 210 | + | ||
| 211 | +@implementation PresentViewCell (OverWrite) | ||
| 212 | + | ||
| 213 | +- (void)customDisplayAnimationOfShowShakeAnimation:(BOOL)flag | ||
| 214 | +{ | ||
| 215 | + self.alpha = 1.0; | ||
| 216 | + CGRect selfF = self.frame; | ||
| 217 | + selfF.origin.x = 0; | ||
| 218 | + self.frame = selfF; | ||
| 219 | +} | ||
| 220 | + | ||
| 221 | +- (void)customHideAnimationOfShowShakeAnimation:(BOOL)flag | ||
| 222 | +{ | ||
| 223 | + self.alpha = 0.0; | ||
| 224 | + CGRect selfF = self.frame; | ||
| 225 | + selfF.origin.y -= (CGRectGetHeight(selfF) * 0.5); | ||
| 226 | + self.frame = selfF; | ||
| 227 | +} | ||
| 228 | + | ||
| 229 | +@end | ||
| 230 | + | ||
| 231 | +@implementation PresentLable | ||
| 232 | + | ||
| 233 | +- (void)drawTextInRect:(CGRect)rect | ||
| 234 | +{ | ||
| 235 | + UIColor *textColor = self.textColor; | ||
| 236 | + | ||
| 237 | + CGContextRef c = UIGraphicsGetCurrentContext(); | ||
| 238 | + CGContextSetLineWidth(c, 5); | ||
| 239 | + CGContextSetLineJoin(c, kCGLineJoinRound); | ||
| 240 | + | ||
| 241 | + CGContextSetTextDrawingMode(c, kCGTextStroke); | ||
| 242 | + self.textColor = self.borderColor; | ||
| 243 | + [super drawTextInRect:rect]; | ||
| 244 | + | ||
| 245 | + CGContextSetTextDrawingMode(c, kCGTextFill); | ||
| 246 | + self.textColor = textColor; | ||
| 247 | + self.shadowOffset = CGSizeMake(0, 0); | ||
| 248 | + [super drawTextInRect:rect]; | ||
| 249 | +} | ||
| 250 | + | ||
| 251 | +- (void)startAnimationDuration:(NSTimeInterval)interval completion:(void (^)(BOOL finish))completion | ||
| 252 | +{ | ||
| 253 | + [UIView animateKeyframesWithDuration:interval delay:0 options:0 animations:^{ | ||
| 254 | + | ||
| 255 | + [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:1/2.0 animations:^{ | ||
| 256 | + self.transform = CGAffineTransformMakeScale(4, 4); | ||
| 257 | + }]; | ||
| 258 | + [UIView addKeyframeWithRelativeStartTime:1/2.0 relativeDuration:1/2.0 animations:^{ | ||
| 259 | + self.transform = CGAffineTransformMakeScale(0.8, 0.8); | ||
| 260 | + }]; | ||
| 261 | + | ||
| 262 | + } completion:^(BOOL finished) { | ||
| 263 | + | ||
| 264 | + [UIView animateWithDuration:0.25 delay:0 usingSpringWithDamping:0.4 initialSpringVelocity:10 options:UIViewAnimationOptionCurveEaseInOut animations:^{ | ||
| 265 | + self.transform = CGAffineTransformMakeScale(1.0, 1.0); | ||
| 266 | + } completion:^(BOOL finished) { | ||
| 267 | + if (completion) { | ||
| 268 | + completion(finished); | ||
| 269 | + } | ||
| 270 | + }]; | ||
| 271 | + | ||
| 272 | + }]; | ||
| 273 | +} | ||
| 274 | + | ||
| 275 | +@end | ||
| 276 | + |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/LVCAnimationManager.m
| @@ -65,7 +65,7 @@ static LVCAnimationManager * __singleton__; | @@ -65,7 +65,7 @@ static LVCAnimationManager * __singleton__; | ||
| 65 | */ | 65 | */ |
| 66 | - (void)bubblingWithCenterPoint:(CGPoint)centerPoint toView:(UIView *_Nonnull)toView speed:(CGFloat)speed | 66 | - (void)bubblingWithCenterPoint:(CGPoint)centerPoint toView:(UIView *_Nonnull)toView speed:(CGFloat)speed |
| 67 | { | 67 | { |
| 68 | - CGFloat defSpeed = 2; | 68 | + CGFloat defSpeed = 1; |
| 69 | if (speed != 0) { | 69 | if (speed != 0) { |
| 70 | defSpeed = speed; | 70 | defSpeed = speed; |
| 71 | } | 71 | } |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/LiveBaseView.h
| @@ -7,9 +7,11 @@ | @@ -7,9 +7,11 @@ | ||
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | #import "BaseView.h" | 9 | #import "BaseView.h" |
| 10 | +@class PresentView; | ||
| 10 | 11 | ||
| 11 | @interface LiveBaseView : BaseView | 12 | @interface LiveBaseView : BaseView |
| 12 | 13 | ||
| 13 | @property (nonatomic ,strong) UIViewController * _Nullable viewController; | 14 | @property (nonatomic ,strong) UIViewController * _Nullable viewController; |
| 14 | - | 15 | +@property (nonatomic ,strong ,readonly) PresentView * _Nullable presentView; |
| 16 | +@property (nonatomic ,strong ,readonly) UIView * _Nullable animationBaseView; | ||
| 15 | @end | 17 | @end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/InteractionSections/LiveBaseView.m
| @@ -11,12 +11,31 @@ | @@ -11,12 +11,31 @@ | ||
| 11 | #import "BottomToolView.h" | 11 | #import "BottomToolView.h" |
| 12 | #import "GiftListView.h" | 12 | #import "GiftListView.h" |
| 13 | #import "GiftModel.h" | 13 | #import "GiftModel.h" |
| 14 | -@interface LiveBaseView ()<bottomBtnDeledate> | 14 | +#import "PresentView.h" |
| 15 | +#import "ComboCell.h" | ||
| 16 | +#import "LVCAnimationManager.h" | ||
| 17 | +#import "chatListCell.h" | ||
| 18 | +#import "chatMsgModel.h" | ||
| 15 | 19 | ||
| 16 | -@property (nonatomic ,strong) UIScrollView * _Nullable scrollView; | ||
| 17 | -@property (nonatomic ,strong) BottomToolView* _Nullable bottomToolView; | ||
| 18 | -@property (nonatomic ,strong) UIButton * _Nullable closeBtn; | ||
| 19 | -@property (nonatomic ,strong) UIView * _Nullable currentPopView; | 20 | +#define BottomToolHeight 60 |
| 21 | + | ||
| 22 | +typedef NS_ENUM(NSInteger, PopType) {//弹窗类型 | ||
| 23 | + PopTypeGift = 1,//礼物弹窗 | ||
| 24 | + PopTypeChat ,//聊天弹窗 | ||
| 25 | + PopTypePriMessage //私信弹窗 | ||
| 26 | +}; | ||
| 27 | + | ||
| 28 | +@interface LiveBaseView ()<bottomBtnDeledate,PresentViewDelegate,UIScrollViewDelegate,UITableViewDelegate,UITableViewDataSource> | ||
| 29 | + | ||
| 30 | +@property (nonatomic ,strong ) UIScrollView * _Nullable scrollView; | ||
| 31 | +@property (nonatomic ,strong ,readwrite) UIView * _Nullable animationBaseView;//展示层View | ||
| 32 | +@property (nonatomic ,strong ) BottomToolView* _Nullable bottomToolView; | ||
| 33 | +@property (nonatomic ,strong ) UIButton * _Nullable closeBtn; | ||
| 34 | +@property (nonatomic ,strong ) UIView * _Nullable giftPopView; | ||
| 35 | +@property (nonatomic ,strong ,readwrite) PresentView * _Nullable presentView;//连击View | ||
| 36 | +@property (nonatomic ,assign ) PopType popType; | ||
| 37 | +@property (nonatomic ,strong) UITableView * _Nullable chatTableView; | ||
| 38 | +@property (nonatomic ,strong) NSMutableArray * _Nullable chatMsgArray;//聊天消息数组 | ||
| 20 | 39 | ||
| 21 | @end | 40 | @end |
| 22 | 41 | ||
| @@ -27,9 +46,20 @@ | @@ -27,9 +46,20 @@ | ||
| 27 | if (self = [super initWithFrame:frame]) { | 46 | if (self = [super initWithFrame:frame]) { |
| 28 | 47 | ||
| 29 | [self addSubview:self.scrollView]; | 48 | [self addSubview:self.scrollView]; |
| 30 | - [self.scrollView addSubview:self.bottomToolView]; | 49 | + [self.scrollView addSubview:self.animationBaseView]; |
| 50 | + [self.animationBaseView addSubview:self.bottomToolView]; | ||
| 51 | + [self.animationBaseView addSubview:self.presentView]; | ||
| 31 | [self addSubview:self.closeBtn]; | 52 | [self addSubview:self.closeBtn]; |
| 32 | [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureClick:)]]; | 53 | [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureClick:)]]; |
| 54 | + [[LVCAnimationManager shareManager] bubblingWithCenterPoint:CGPointMake(SCREEN_WIDTH - 50, SCREEN_HEIGHT - 50) toView:self.animationBaseView speed:1]; | ||
| 55 | +// ChatView *chatView = [[ChatView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT - 150, 200, 100)]; | ||
| 56 | +// chatView.backgroundColor = ZXRandomColor; | ||
| 57 | +// [self addSubview:chatView]; | ||
| 58 | + [self.animationBaseView addSubview:self.chatTableView]; | ||
| 59 | + self.chatTableView.backgroundColor = ZXRandomColor; | ||
| 60 | + chatMsgModel *model = [[chatMsgModel alloc] init]; | ||
| 61 | + model.name = @"张旭"; | ||
| 62 | + [self.chatMsgArray addObject:model]; | ||
| 33 | } | 63 | } |
| 34 | return self; | 64 | return self; |
| 35 | } | 65 | } |
| @@ -37,25 +67,34 @@ | @@ -37,25 +67,34 @@ | ||
| 37 | #pragma mark - bottomBtnDelegate | 67 | #pragma mark - bottomBtnDelegate |
| 38 | - (void)bottomActionWithType:(BtnClickType)btnType | 68 | - (void)bottomActionWithType:(BtnClickType)btnType |
| 39 | { | 69 | { |
| 40 | - [self hiddenView:YES]; | ||
| 41 | switch (btnType) { | 70 | switch (btnType) { |
| 42 | case BtnClickTypeChat: | 71 | case BtnClickTypeChat: |
| 43 | { | 72 | { |
| 73 | + self.popType = PopTypeChat; | ||
| 44 | 74 | ||
| 45 | } | 75 | } |
| 46 | break; | 76 | break; |
| 47 | case BtnClickTypePriChat: | 77 | case BtnClickTypePriChat: |
| 48 | { | 78 | { |
| 49 | - | 79 | + self.popType = PopTypePriMessage; |
| 50 | } | 80 | } |
| 51 | break; | 81 | break; |
| 52 | case BtnClickTypeGift: | 82 | case BtnClickTypeGift: |
| 53 | { | 83 | { |
| 54 | - GiftListView *giftListView = [[GiftListView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT - 230, SCREEN_WIDTH, 230) liveBaseView:self]; | ||
| 55 | - giftListView.backgroundColor = [UIColor lightGrayColor]; | 84 | + self.popType = PopTypeGift; |
| 85 | + [self hiddenView:YES]; | ||
| 86 | + GiftListView *giftListView = [[GiftListView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT - 250, SCREEN_WIDTH, 250) liveBaseView:self]; | ||
| 56 | [self addSubview:giftListView]; | 87 | [self addSubview:giftListView]; |
| 57 | - self.currentPopView = giftListView; | ||
| 58 | - | 88 | + self.giftPopView = giftListView; |
| 89 | + | ||
| 90 | + UIImageView *giftBg = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, giftListView.width, giftListView.height)]; | ||
| 91 | + giftBg.image = [UIImage imageNamed:@"背景400x300"]; | ||
| 92 | + giftBg.centerX = giftListView.width * 0.5; | ||
| 93 | + giftBg.centerY = giftListView.height * 0.5; | ||
| 94 | + giftBg.alpha = 0.4; | ||
| 95 | + [giftListView addSubview:giftBg]; | ||
| 96 | + | ||
| 97 | + | ||
| 59 | } | 98 | } |
| 60 | break; | 99 | break; |
| 61 | default: | 100 | default: |
| @@ -67,22 +106,87 @@ | @@ -67,22 +106,87 @@ | ||
| 67 | { | 106 | { |
| 68 | self.bottomToolView.hidden = isHidden; | 107 | self.bottomToolView.hidden = isHidden; |
| 69 | self.closeBtn.hidden = isHidden; | 108 | self.closeBtn.hidden = isHidden; |
| 109 | + self.chatTableView.hidden = isHidden; | ||
| 70 | } | 110 | } |
| 71 | 111 | ||
| 72 | - (void)clearCurrentPopView | 112 | - (void)clearCurrentPopView |
| 73 | { | 113 | { |
| 74 | - [UIView animateWithDuration:0.25 animations:^{ | ||
| 75 | - | ||
| 76 | - self.currentPopView.frame = CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT); | ||
| 77 | - [self hiddenView:NO]; | ||
| 78 | - } completion:^(BOOL finished) { | ||
| 79 | - [self.currentPopView removeFromSuperview]; | ||
| 80 | - }]; | 114 | + switch (self.popType) { |
| 115 | + case PopTypeGift: | ||
| 116 | + { | ||
| 117 | + [UIView animateWithDuration:0.25 animations:^{ | ||
| 118 | + | ||
| 119 | + self.giftPopView.frame = CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT); | ||
| 120 | + [self hiddenView:NO]; | ||
| 121 | + } completion:^(BOOL finished) { | ||
| 122 | + [self.giftPopView removeFromSuperview]; | ||
| 123 | + }]; | ||
| 124 | + } | ||
| 125 | + break; | ||
| 126 | + case PopTypeChat: | ||
| 127 | + { | ||
| 128 | + | ||
| 129 | + } | ||
| 130 | + break; | ||
| 131 | + case PopTypePriMessage: | ||
| 132 | + { | ||
| 133 | + | ||
| 134 | + } | ||
| 135 | + break; | ||
| 136 | + default: | ||
| 137 | + break; | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | +} | ||
| 141 | +#pragma mark - 聊天消息列表 | ||
| 142 | +#pragma mark - UITableViewDataSource | ||
| 143 | + | ||
| 144 | +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section | ||
| 145 | +{ | ||
| 146 | + return self.chatMsgArray.count; | ||
| 147 | +} | ||
| 148 | + | ||
| 149 | +-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath | ||
| 150 | +{ | ||
| 151 | + chatListCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([chatListCell class]) forIndexPath:indexPath]; | ||
| 152 | + [cell loadUIWithModel:self.chatMsgArray[indexPath.row]]; | ||
| 153 | + return cell; | ||
| 154 | +} | ||
| 155 | + | ||
| 156 | +#pragma mark - UITableViewDelegate | ||
| 157 | +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath | ||
| 158 | +{ | ||
| 159 | + return [self.chatMsgArray[indexPath.row] cellHeight]; | ||
| 160 | +} | ||
| 161 | + | ||
| 162 | +#pragma mark - PresentViewDelegate | ||
| 163 | + | ||
| 164 | +- (PresentViewCell *)presentView:(PresentView *)presentView cellOfRow:(NSInteger)row | ||
| 165 | +{ | ||
| 166 | + return [[ComboCell alloc] initWithRow:row]; | ||
| 167 | +} | ||
| 168 | + | ||
| 169 | +- (void)presentView:(PresentView *)presentView configCell:(PresentViewCell *)cell model:(id<PresentModelAble>)model | ||
| 170 | +{ | ||
| 171 | + ComboCell *comboCell = (ComboCell *)cell; | ||
| 172 | + comboCell.model = (GiftModel *)model; | ||
| 173 | +} | ||
| 174 | + | ||
| 175 | +- (void)presentView:(PresentView *)presentView didSelectedCellOfRowAtIndex:(NSUInteger)index | ||
| 176 | +{ | ||
| 177 | + ComboCell *cell = [presentView cellForRowAtIndex:index]; | ||
| 178 | + NSLog(@"你点击了:%@", cell.model.giftName); | ||
| 179 | +} | ||
| 180 | + | ||
| 181 | +- (void)presentView:(PresentView *)presentView animationCompleted:(NSInteger)shakeNumber model:(id<PresentModelAble>)model | ||
| 182 | +{ | ||
| 183 | + NSLog(@"%@礼物的连送动画执行完成", model.giftName); | ||
| 81 | } | 184 | } |
| 82 | 185 | ||
| 83 | #pragma mark - buttonClick | 186 | #pragma mark - buttonClick |
| 84 | - (void)tapGestureClick:(UITapGestureRecognizer *)gesture | 187 | - (void)tapGestureClick:(UITapGestureRecognizer *)gesture |
| 85 | { | 188 | { |
| 189 | + [[LVCAnimationManager shareManager] bubblingWithCenterPoint:CGPointMake(SCREEN_WIDTH - 50, SCREEN_HEIGHT - 50) toView:self.animationBaseView]; | ||
| 86 | [self clearCurrentPopView]; | 190 | [self clearCurrentPopView]; |
| 87 | } | 191 | } |
| 88 | 192 | ||
| @@ -91,6 +195,12 @@ | @@ -91,6 +195,12 @@ | ||
| 91 | [self.viewController.navigationController popViewControllerAnimated:YES]; | 195 | [self.viewController.navigationController popViewControllerAnimated:YES]; |
| 92 | } | 196 | } |
| 93 | 197 | ||
| 198 | +#pragma mark - UIScrollViewDelegate | ||
| 199 | +- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView | ||
| 200 | +{ | ||
| 201 | + [self clearCurrentPopView]; | ||
| 202 | +} | ||
| 203 | + | ||
| 94 | #pragma mark - setter | 204 | #pragma mark - setter |
| 95 | -(void)setViewController:(UIViewController *)viewController | 205 | -(void)setViewController:(UIViewController *)viewController |
| 96 | { | 206 | { |
| @@ -110,15 +220,38 @@ | @@ -110,15 +220,38 @@ | ||
| 110 | _scrollView.showsVerticalScrollIndicator = NO; | 220 | _scrollView.showsVerticalScrollIndicator = NO; |
| 111 | _scrollView.showsHorizontalScrollIndicator = NO; | 221 | _scrollView.showsHorizontalScrollIndicator = NO; |
| 112 | _scrollView.backgroundColor = [UIColor clearColor]; | 222 | _scrollView.backgroundColor = [UIColor clearColor]; |
| 223 | + _scrollView.delegate = self; | ||
| 113 | } | 224 | } |
| 114 | return _scrollView; | 225 | return _scrollView; |
| 115 | } | 226 | } |
| 116 | 227 | ||
| 228 | +- (UIView *)animationBaseView | ||
| 229 | +{ | ||
| 230 | + if (!_animationBaseView) | ||
| 231 | + { | ||
| 232 | + _animationBaseView = [[UIView alloc] initWithFrame:CGRectMake(self.scrollView.width, 0, self.scrollView.width, self.scrollView.height)]; | ||
| 233 | + _animationBaseView.backgroundColor = [UIColor redColor]; | ||
| 234 | + _animationBaseView.clipsToBounds = YES; | ||
| 235 | + } | ||
| 236 | + return _animationBaseView; | ||
| 237 | +} | ||
| 238 | + | ||
| 239 | +- (PresentView *)presentView | ||
| 240 | +{ | ||
| 241 | + if (!_presentView) | ||
| 242 | + { | ||
| 243 | + _presentView = [[PresentView alloc] initWithFrame:CGRectMake(0, 200, 220, 200)]; | ||
| 244 | + _presentView.delegate = self; | ||
| 245 | + _presentView.backgroundColor = [UIColor clearColor]; | ||
| 246 | + } | ||
| 247 | + return _presentView; | ||
| 248 | +} | ||
| 249 | + | ||
| 117 | - (BottomToolView *)bottomToolView | 250 | - (BottomToolView *)bottomToolView |
| 118 | { | 251 | { |
| 119 | if (!_bottomToolView) | 252 | if (!_bottomToolView) |
| 120 | { | 253 | { |
| 121 | - _bottomToolView = [[BottomToolView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH, SCREEN_HEIGHT - 60, SCREEN_WIDTH, 60)]; | 254 | + _bottomToolView = [[BottomToolView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT - BottomToolHeight, SCREEN_WIDTH, BottomToolHeight)]; |
| 122 | _bottomToolView.delegate = self; | 255 | _bottomToolView.delegate = self; |
| 123 | _bottomToolView.backgroundColor = [UIColor lightGrayColor]; | 256 | _bottomToolView.backgroundColor = [UIColor lightGrayColor]; |
| 124 | _bottomToolView.alpha = 0.7; | 257 | _bottomToolView.alpha = 0.7; |
| @@ -126,6 +259,31 @@ | @@ -126,6 +259,31 @@ | ||
| 126 | return _bottomToolView; | 259 | return _bottomToolView; |
| 127 | } | 260 | } |
| 128 | 261 | ||
| 262 | +- (UITableView *)chatTableView | ||
| 263 | +{ | ||
| 264 | + if (!_chatTableView) { | ||
| 265 | + UITableView *tableView = [[UITableView alloc]initWithFrame:CGRectMake(10, SCREEN_HEIGHT - 150 - BottomToolHeight - 10, 300, 150)]; | ||
| 266 | + tableView.delegate = self; | ||
| 267 | + tableView.dataSource = self; | ||
| 268 | + tableView.separatorStyle = UITableViewCellSeparatorStyleNone; | ||
| 269 | + [tableView registerClass:[chatListCell class] forCellReuseIdentifier:NSStringFromClass([chatListCell class])]; | ||
| 270 | + tableView.showsVerticalScrollIndicator = NO; | ||
| 271 | + tableView.showsHorizontalScrollIndicator = NO; | ||
| 272 | + tableView.backgroundColor = [UIColor clearColor]; | ||
| 273 | + tableView.separatorStyle = UITableViewCellSeparatorStyleNone; | ||
| 274 | + _chatTableView = tableView; | ||
| 275 | + } | ||
| 276 | + return _chatTableView; | ||
| 277 | +} | ||
| 278 | + | ||
| 279 | +- (NSMutableArray *)chatMsgArray | ||
| 280 | +{ | ||
| 281 | + if (!_chatMsgArray) { | ||
| 282 | + _chatMsgArray = [NSMutableArray array]; | ||
| 283 | + } | ||
| 284 | + return _chatMsgArray; | ||
| 285 | +} | ||
| 286 | + | ||
| 129 | - (UIButton *)closeBtn | 287 | - (UIButton *)closeBtn |
| 130 | { | 288 | { |
| 131 | if (!_closeBtn) | 289 | if (!_closeBtn) |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/Contents.json
0 → 100644
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/beer.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "beer.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/beer.imageset/beer.png
0 → 100644
5.11 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/chicken.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "chicken.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/chicken.imageset/chicken.png
0 → 100644
4.37 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/continuous.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "continuous.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/continuous.imageset/continuous.png
0 → 100644
1.94 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/cucumber.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "cucumber.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/cucumber.imageset/cucumber.png
0 → 100644
7.15 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/diamond.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "diamond.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/diamond.imageset/diamond.png
0 → 100644
1.01 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/fighter_small80.imageset/Contents.json
0 → 100644
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/fighter_small80.imageset/fighter_small80.png
0 → 100644
7.91 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/flower.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "flower.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/flower.imageset/flower.png
0 → 100644
4.82 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/hug.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "hug.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/hug.imageset/hug.png
0 → 100644
4.34 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/love_gift.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "love_gift.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/love_gift.imageset/love_gift.png
0 → 100644
2.14 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/mouth.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "mouth.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/mouth.imageset/mouth.png
0 → 100644
5.06 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/plane_small80.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "plane_small80.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/plane_small80.imageset/plane_small80.png
0 → 100644
6.96 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/porsch_small80.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "porsch_small80.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/porsch_small80.imageset/porsch_small80.png
0 → 100644
8.48 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/ring.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "ring.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/ring.imageset/ring.png
0 → 100644
6.54 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/rose.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "rose.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/rose.imageset/rose.png
0 → 100644
5.39 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/sticks.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "sticks.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/sticks.imageset/sticks.png
0 → 100644
4.44 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/背景100x100.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "背景100x100.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/背景100x100.imageset/背景100x100.png
0 → 100644
1.46 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/背景150x100.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "背景150x100.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/背景150x100.imageset/背景150x100.png
0 → 100644
1.56 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/背景200x50.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "背景200x50.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/背景200x50.imageset/背景200x50.png
0 → 100644
1.4 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/背景400x30.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "背景400x30.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/背景400x30.imageset/背景400x30.png
0 → 100644
1.45 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/背景400x300.imageset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "universal", | ||
| 5 | + "filename" : "背景400x300.png", | ||
| 6 | + "scale" : "1x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "universal", | ||
| 10 | + "scale" : "2x" | ||
| 11 | + }, | ||
| 12 | + { | ||
| 13 | + "idiom" : "universal", | ||
| 14 | + "scale" : "3x" | ||
| 15 | + } | ||
| 16 | + ], | ||
| 17 | + "info" : { | ||
| 18 | + "version" : 1, | ||
| 19 | + "author" : "xcode" | ||
| 20 | + } | ||
| 21 | +} | ||
| 0 | \ No newline at end of file | 22 | \ No newline at end of file |
LiveVideoCloud/LiveVideoCloud/animation.xcassets/Interaction/Gift/背景400x300.imageset/背景400x300.png
0 → 100644
3.76 KB
LiveVideoCloud/LiveVideoCloud/animation.xcassets/LaunchImage.launchimage/Contents.json
| @@ -3,43 +3,30 @@ | @@ -3,43 +3,30 @@ | ||
| 3 | { | 3 | { |
| 4 | "orientation" : "portrait", | 4 | "orientation" : "portrait", |
| 5 | "idiom" : "ipad", | 5 | "idiom" : "ipad", |
| 6 | - "minimum-system-version" : "7.0", | ||
| 7 | "extent" : "full-screen", | 6 | "extent" : "full-screen", |
| 8 | - "scale" : "2x" | ||
| 9 | - }, | ||
| 10 | - { | ||
| 11 | - "orientation" : "landscape", | ||
| 12 | - "idiom" : "ipad", | ||
| 13 | "minimum-system-version" : "7.0", | 7 | "minimum-system-version" : "7.0", |
| 14 | - "extent" : "full-screen", | ||
| 15 | "scale" : "1x" | 8 | "scale" : "1x" |
| 16 | }, | 9 | }, |
| 17 | { | 10 | { |
| 18 | "orientation" : "landscape", | 11 | "orientation" : "landscape", |
| 19 | "idiom" : "ipad", | 12 | "idiom" : "ipad", |
| 20 | - "minimum-system-version" : "7.0", | ||
| 21 | "extent" : "full-screen", | 13 | "extent" : "full-screen", |
| 22 | - "scale" : "2x" | ||
| 23 | - }, | ||
| 24 | - { | ||
| 25 | - "orientation" : "portrait", | ||
| 26 | - "idiom" : "iphone", | ||
| 27 | "minimum-system-version" : "7.0", | 14 | "minimum-system-version" : "7.0", |
| 28 | - "scale" : "2x" | 15 | + "scale" : "1x" |
| 29 | }, | 16 | }, |
| 30 | { | 17 | { |
| 31 | "orientation" : "portrait", | 18 | "orientation" : "portrait", |
| 32 | - "idiom" : "iphone", | 19 | + "idiom" : "ipad", |
| 20 | + "extent" : "full-screen", | ||
| 33 | "minimum-system-version" : "7.0", | 21 | "minimum-system-version" : "7.0", |
| 34 | - "subtype" : "retina4", | ||
| 35 | "scale" : "2x" | 22 | "scale" : "2x" |
| 36 | }, | 23 | }, |
| 37 | { | 24 | { |
| 38 | - "orientation" : "portrait", | 25 | + "orientation" : "landscape", |
| 39 | "idiom" : "ipad", | 26 | "idiom" : "ipad", |
| 40 | - "minimum-system-version" : "7.0", | ||
| 41 | "extent" : "full-screen", | 27 | "extent" : "full-screen", |
| 42 | - "scale" : "1x" | 28 | + "minimum-system-version" : "7.0", |
| 29 | + "scale" : "2x" | ||
| 43 | } | 30 | } |
| 44 | ], | 31 | ], |
| 45 | "info" : { | 32 | "info" : { |