SuspenionWindow.m 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. //
  2. // SuspenionWindow.m
  3. // BuguLive
  4. //
  5. // Created by 岳克奎 on 16/9/24.
  6. // Copyright © 2016年 xfg. All rights reserved.
  7. //
  8. #import "SuspenionWindow.h"
  9. @implementation SuspenionWindow
  10. #pragma mark ------------处理pan移动问题
  11. /**
  12. *
  13. * @brief: 移动到边界处理
  14. * @discussion: 当移动屏幕超出 默认window(界面)时,结束手势状态下,动画设置回弹效果 确保在屏幕内部
  15. *
  16. *
  17. */
  18. - (void)setPanGesForSmallSuspenionWindow:(CGPoint)panPoint withModeValue:(CGPoint)moveVlue
  19. {
  20. self.transform = CGAffineTransformTranslate( self.transform, moveVlue.x, moveVlue.y);
  21. [self.window_Pan_Ges setTranslation:CGPointZero inView:self];
  22. if (self.window_Pan_Ges.state == UIGestureRecognizerStateBegan)
  23. {
  24. }
  25. if (self.window_Pan_Ges.state == UIGestureRecognizerStateChanged)
  26. {
  27. }
  28. if (self.window_Pan_Ges.state == UIGestureRecognizerStateEnded)
  29. {
  30. if(self.x<0)
  31. {
  32. [UIView animateWithDuration:0.2 animations:^{
  33. self.x = 0;
  34. }completion:^(BOOL finished) {
  35. }];
  36. }
  37. if(self.frame.origin.y<0)
  38. {
  39. [UIView animateWithDuration:0.2 animations:^{
  40. self.y = 0;
  41. }completion:^(BOOL finished) {
  42. }];
  43. }
  44. if(self.frame.origin.y> kScreenH-0.6*kScreenW)
  45. {
  46. [UIView animateWithDuration:0.2 animations:^{
  47. self.y = kScreenH-0.6*kScreenW;
  48. }completion:^(BOOL finished) {
  49. }];
  50. }
  51. if(self.x>kScreenW-0.4*kScreenW)
  52. {
  53. [UIView animateWithDuration:0.2 animations:^{
  54. self.x = kScreenW-0.4*kScreenW;
  55. }completion:^(BOOL finished) {
  56. }];
  57. }
  58. }
  59. }
  60. #pragma mark ---------------------------------------- 悬浮层开启 部分 ---------------------------------------
  61. #pragma mark - Geature Of Suswindow
  62. /**
  63. * 手势处理
  64. *
  65. * @Step: tap手势 动画
  66. * @Step: pan手势
  67. *
  68. *
  69. */
  70. + (void)showLoadGeatureOfSusWindow
  71. {
  72. [BGUtils closeKeyboard];
  73. //5.1
  74. SUS_WINDOW.susBaseWindowTapGesBlock =^(){
  75. // 这里进一步配置
  76. if(SUS_WINDOW.isSmallSusWindow)
  77. {
  78. SUS_WINDOW.isSmallSusWindow = NO;
  79. }
  80. [SuspenionWindow showAnimationOfSusWindowSizeBlock:^(BOOL finished) {
  81. if (finished)
  82. {
  83. }
  84. }];
  85. };
  86. SUS_WINDOW.susBaseWindowPanGesBlock = ^(){
  87. [SUS_WINDOW setPanGesForSmallSuspenionWindow:[SUS_WINDOW.window_Pan_Ges locationInView:SUS_WINDOW] withModeValue:[SUS_WINDOW.window_Pan_Ges translationInView:SUS_WINDOW]];
  88. };
  89. }
  90. #pragma mark - Animation of SusWindow Size
  91. /**
  92. * 悬浮动画
  93. *
  94. *
  95. *
  96. * @discusion: 1注意既然代码能走到这里 必定悬浮啦。VC可以delegate找!
  97. * 2 CGRectMake(kScreenW-kDefaultMargin-kLogoContainerViewHeight, kStatusBarHeight+kDefaultMargin/2, kLogoContainerViewHeight, kLogoContainerViewHeight)
  98. */
  99. + (void)showAnimationOfSusWindowSizeBlock:(void(^)(BOOL finished))block
  100. {
  101. //处理键盘 js 弹出键盘遗留在直播间问题
  102. if(!SUS_WINDOW.isSmallSusWindow)
  103. {
  104. [SuspenionWindow closeSanwichLayerOfNetRootVCStr:@"BGTabBarController" complete:^(BOOL finished) {
  105. }];
  106. }
  107. [BGUtils closeKeyboard];
  108. BGTLiveController *tLiveC;
  109. BGKSYLiveController *ksyLiveC;
  110. UIView *oneLiveView;
  111. UIButton *closeLiveBtn;
  112. if(SUS_WINDOW.sdkType == FW_LIVESDK_TYPE_TXY)
  113. {
  114. tLiveC = (BGTLiveController *)SUS_WINDOW.rootViewController.childViewControllers[0];
  115. closeLiveBtn = tLiveC.liveServiceController.closeBtn;
  116. oneLiveView = tLiveC.liveServiceController.liveUIViewController.liveView;
  117. }
  118. if (!tLiveC)
  119. {
  120. if (block)
  121. {
  122. block(NO);
  123. }
  124. }
  125. oneLiveView.hidden = SUS_WINDOW.isSmallSusWindow?YES:NO;
  126. SUS_WINDOW.layer.masksToBounds = YES;
  127. SUS_WINDOW.layer.cornerRadius = SUS_WINDOW.isSmallSusWindow == YES?8.0f:0;
  128. if((!SUS_WINDOW.reccordSusWidnowSale&&SUS_WINDOW.isSmallSusWindow)||(SUS_WINDOW.reccordSusWidnowSale && !SUS_WINDOW.isSmallSusWindow)){
  129. //缩放 后肚饿widnwo尺寸
  130. [UIView animateWithDuration:0.5 animations:^{
  131. //进行缩放 当前满屏幕 记录要求小屏幕
  132. if (!SUS_WINDOW.reccordSusWidnowSale&&SUS_WINDOW.isSmallSusWindow)
  133. {
  134. SUS_WINDOW.reccordSusWidnowSale = YES;
  135. SUS_WINDOW.transform = CGAffineTransformMakeScale(0.4, 0.6*kScreenW/kScreenH);
  136. SUS_WINDOW.x = 0.6*kScreenW;
  137. SUS_WINDOW.y = 0;
  138. closeLiveBtn.width = kLogoContainerViewHeight*2;
  139. closeLiveBtn.height = kLogoContainerViewHeight*2;
  140. closeLiveBtn.x =0.6*kScreenW -kLogoContainerViewHeight;
  141. }
  142. // 放大 当前是小屏幕 记录不是满屏
  143. if (SUS_WINDOW.reccordSusWidnowSale && !SUS_WINDOW.isSmallSusWindow)
  144. {
  145. [IQKeyboardManager sharedManager].enable = NO;
  146. [IQKeyboardManager sharedManager].enableAutoToolbar = NO;
  147. // 关闭键盘
  148. [BGUtils closeKeyboard];
  149. if ([IQKeyboardManager sharedManager].keyboardShowing)
  150. {
  151. [FanweMessage alert:ASLocalizedString(@"请先关闭键盘")];
  152. return;
  153. }
  154. SUS_WINDOW.transform = CGAffineTransformIdentity;
  155. SUS_WINDOW.x = 0;
  156. SUS_WINDOW.y = 0;
  157. SUS_WINDOW.layer.masksToBounds = NO;
  158. closeLiveBtn.frame = CGRectMake(kScreenW-kDefaultMargin-kLogoContainerViewHeight, kStatusBarHeight+kDefaultMargin/2, kLogoContainerViewHeight, kLogoContainerViewHeight);
  159. SUS_WINDOW.reccordSusWidnowSale = NO;
  160. }
  161. }completion:^(BOOL finished) {
  162. if (finished)
  163. {
  164. //动画完毕 suswindow的参数要调整
  165. SUS_WINDOW.window_Tap_Ges.enabled =SUS_WINDOW.isSmallSusWindow;
  166. SUS_WINDOW.window_Pan_Ges.enabled = SUS_WINDOW.isSmallSusWindow;
  167. }
  168. if (block)
  169. {
  170. block(finished);
  171. }
  172. }];
  173. }
  174. else
  175. {
  176. SUS_WINDOW.window_Tap_Ges.enabled =SUS_WINDOW.isSmallSusWindow;
  177. SUS_WINDOW.window_Pan_Ges.enabled = SUS_WINDOW.isSmallSusWindow;
  178. SUS_WINDOW.reccordSusWidnowSale = SUS_WINDOW.isSmallSusWindow;
  179. if (block)
  180. {
  181. block(YES);
  182. }
  183. }
  184. }
  185. #pragma mark ---------------------------------------- 悬浮层 关闭 部分 ---------------------------------------
  186. /**
  187. * @brief:悬浮层 直播间关闭 处理
  188. *
  189. * @Step: 1.小屏幕 先放大回来
  190. * @Step: 2.夹心层
  191. *
  192. */
  193. + (void)closeSuswindowUIComplete:(void(^)(BOOL finished))block
  194. {
  195. if (SUS_WINDOW.isSusWindow)
  196. {
  197. [APP_DELEGATE popViewController];
  198. }
  199. if (APP_DELEGATE.sus_window.isSmallSusWindow)
  200. {
  201. SUS_WINDOW.isSmallSusWindow = NO;
  202. [SuspenionWindow showAnimationOfSusWindowSizeBlock:^(BOOL finished) {
  203. [SuspenionWindow closeSanwichLayerOfNetRootVCStr:@"BGTabBarController" complete:^(BOOL finished) {
  204. if (block)
  205. {
  206. block(finished);
  207. }
  208. }];
  209. }];
  210. }
  211. else
  212. {
  213. [SuspenionWindow closeSanwichLayerOfNetRootVCStr:@"BGTabBarController" complete:^(BOOL finished) {
  214. if (block)
  215. {
  216. block(finished);
  217. }
  218. }];
  219. }
  220. }
  221. #pragma mark - 夹心层的退出
  222. /**
  223. * @brief: 竞拍层的退出
  224. *
  225. * @prama: nextRootVCStr 竞拍层退出的时候,悬浮widnow需要动画恢复满屏幕。底层widnwo需要将RootVC 由竞拍层恢复到主页上
  226. * @prama: block回调
  227. *
  228. * @discussion: 千万别写错 APP_DELEGATE.window 宏容易错写为宏Sus——widnow window 容易错写成suswindow
  229. *
  230. */
  231. + (void)closeSanwichLayerOfNetRootVCStr:(NSString *)nextRootVCStr complete:(void(^)(BOOL finished))block
  232. {
  233. if (SUS_WINDOW.isSusWindow)
  234. {
  235. [APP_DELEGATE popViewController];
  236. }
  237. Class tabBarClass = NSClassFromString(nextRootVCStr);
  238. if (![APP_DELEGATE.window.rootViewController isKindOfClass:[tabBarClass class]])
  239. {
  240. APP_DELEGATE.window.rootViewController = [BGTabBarController sharedInstance];
  241. }
  242. if (block)
  243. {
  244. block(YES);
  245. }
  246. }
  247. #pragma mark - 悬浮层真正退出后悬浮参数处理
  248. /**
  249. * @brief: 悬浮层真正退出后悬浮参数处理
  250. *
  251. * @discussion: 如果动画不执行 那是因为这个方法走了2次
  252. *
  253. * @user:直播间退出的时候
  254. */
  255. + (void)resetSusWindowPramaWhenLiveClosedComplete:(void(^)(BOOL finished))block
  256. {
  257. // 加动画移除 否则有点闪屏 感觉
  258. [UIView animateWithDuration:0.3 animations:^{
  259. SUS_WINDOW.x = kScreenW;
  260. SUS_WINDOW.hidden = YES;
  261. SUS_WINDOW.isHost = NO;
  262. SUS_WINDOW.isSmallSusWindow = NO;
  263. SUS_WINDOW.isPushStreamIng = NO;
  264. //SUS_WINDOW.isSusWindow 这个保留 千万别调整
  265. [SUS_WINDOW resignKeyWindow];
  266. //SUS_WINDOW.liveType 这个保留
  267. if (SUS_WINDOW.rootViewController)
  268. {
  269. SUS_WINDOW.rootViewController = nil;
  270. }
  271. SUS_WINDOW.isHostShowAlert = NO;
  272. SUS_WINDOW.isHostShowAlert = NO;
  273. SUS_WINDOW.x = 0;
  274. SUS_WINDOW.recordFWTLiveController = nil;
  275. SUS_WINDOW.threeFWKSYLiveController = nil;
  276. SUS_WINDOW.isShowMention = NO;
  277. SUS_WINDOW.isShowLivePay = NO;
  278. if ([[[BGTabBarController sharedInstance] selectedViewController].childViewControllers[0] isKindOfClass:[HMHomeViewController class]])
  279. {
  280. [[NSNotificationCenter defaultCenter] postNotificationName:kRefreshHome object:nil userInfo:nil];
  281. }
  282. } completion:^(BOOL finished) {
  283. if (block)
  284. {
  285. block(finished);
  286. }
  287. }];
  288. }
  289. @end