YMPopupView.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. //
  2. // YMPopupView.h
  3. // yuemoClient
  4. //
  5. // Created by YoMi on 2023/11/6.
  6. //
  7. #import <UIKit/UIKit.h>
  8. #import "YMPopupViewProtocol.h"
  9. #import "UIView+YMPopupView.h"
  10. #define YMPopupViewWK(object) __weak typeof(object) wk_##object = object;
  11. #define YMPopupViewSS(object) __strong typeof(object) object = weak##object;
  12. NS_ASSUME_NONNULL_BEGIN
  13. @interface YMPopupView : UIView
  14. /** 代理 支持多代理 */
  15. @property (nonatomic, weak) id<YMPopupViewProtocol> _Nullable delegate;
  16. /** 标识 默认为空 */
  17. @property (nonatomic, copy) NSString *_Nullable identifier;
  18. /** 弹窗容器 */
  19. @property (nonatomic, readonly) UIView *parentView;
  20. /** 自定义view */
  21. @property (nonatomic, readonly) UIView *currCustomView;
  22. /** 弹窗位置 默认YMPositionStyleCenter */
  23. @property (nonatomic, assign) YMPositionStyle positionStyle;
  24. /** 显示时动画弹窗样式 默认YMPopupStyleNO */
  25. @property (nonatomic, assign) YMPopupStyle popStyle;
  26. /** 移除时动画弹窗样式 默认YMDismissStyleNO */
  27. @property (nonatomic, assign) YMDismissStyle dismissStyle;
  28. /** 显示时动画时长,> 0。不设置则使用默认的动画时长 设置成YMPopupStyleNO, 该属性无效 */
  29. @property (nonatomic, assign) NSTimeInterval popDuration;
  30. /** 隐藏时动画时长,>0。不设置则使用默认的动画时长 设置成YMDismissStyleNO, 该属性无效 */
  31. @property (nonatomic, assign) NSTimeInterval dismissDuration;
  32. /** 弹窗水平方向(X)偏移量校准 默认0 */
  33. @property (nonatomic, assign) CGFloat adjustX;
  34. /** 弹窗垂直方向(Y)偏移量校准 默认0 */
  35. @property (nonatomic, assign) CGFloat adjustY;
  36. /** 背景颜色 默认rgb(0,0,0) 透明度0.3 */
  37. @property (nullable,nonatomic,strong) UIColor *bgColor;
  38. /** 显示时背景的透明度,取值(0.0~1.0),默认为0.3 */
  39. @property (nonatomic, assign) CGFloat bgAlpha;
  40. /** 是否隐藏背景 默认NO */
  41. @property (nonatomic, assign) BOOL isHideBg;
  42. /** 显示时点击背景是否移除弹窗,默认为NO。 */
  43. @property (nonatomic, assign) BOOL isClickBgDismiss;
  44. /** 是否监听屏幕旋转,默认为YES */
  45. @property (nonatomic, assign) BOOL isObserverScreenRotation;
  46. /** 是否支持点击回馈 默认NO (暂时关闭) */
  47. @property (nonatomic, assign) BOOL isClickFeedback;
  48. /** 是否规避键盘 默认YES */
  49. @property (nonatomic, assign) BOOL isAvoidKeyboard;
  50. /** 弹窗和键盘的距离 默认10 */
  51. @property (nonatomic, assign) CGFloat avoidKeyboardSpace;
  52. /** 显示多长时间 默认0 不会消失 */
  53. @property (nonatomic, assign) NSTimeInterval showTime;
  54. /** 自定view圆角方向设置 默认UIRectCornerAllCorners 当cornerRadius>0时生效*/
  55. @property (nonatomic, assign) UIRectCorner rectCorners;
  56. /** 自定义view圆角大小 */
  57. @property (nonatomic, assign) CGFloat cornerRadius;
  58. /** 弹出震动反馈 默认NO iOS10+ 系统才有此效果 */
  59. @property (nonatomic, assign) BOOL isImpactFeedback;
  60. //************ 群组相关属性 ****************
  61. /** 群组标识 统一给弹窗编队 方便独立管理 默认为nil,统一全局处理 */
  62. @property (nullable,nonatomic,strong) NSString *groupId;
  63. /** 是否堆叠 默认NO 如果是YES priority优先级不生效*/
  64. @property (nonatomic,assign) BOOL isStack;
  65. /** 单显示 默认NO 只会显示优先级最高的popView */
  66. @property (nonatomic, assign) BOOL isSingle;
  67. /** 优先级 范围0~1000 (默认0,遵循先进先出) isStack和isSingle为NO的时候生效 */
  68. @property (nonatomic, assign) CGFloat priority;
  69. //****************************************
  70. //************ 拖拽手势相关属性 ****************
  71. /** 拖拽方向 默认 不可拖拽 */
  72. @property (nonatomic, assign) YMDragStyle dragStyle;
  73. /** X轴或者Y轴拖拽移除临界距离 范围(0 ~ +∞) 默认0 不拖拽移除 基使用于dragStyle */
  74. @property (nonatomic, assign) CGFloat dragDistance;
  75. /** 拖拽移除动画类型 默认同dismissStyle */
  76. @property (nonatomic, assign) YMDismissStyle dragDismissStyle;
  77. /** 拖拽消失动画时间 默认同 dismissDuration */
  78. @property (nonatomic, assign) NSTimeInterval dragDismissDuration;
  79. /** 拖拽复原动画时间 默认0.25s */
  80. @property (nonatomic, assign) NSTimeInterval dragReboundTime;
  81. /** 轻扫方向 默认 不可轻扫 前提开启dragStyle */
  82. @property (nonatomic, assign) YMSweepStyle sweepStyle;
  83. /** 轻扫速率 控制轻扫移除 默认1000 基于使用sweepStyle */
  84. @property (nonatomic, assign) CGFloat swipeVelocity;
  85. /** 轻扫移除的动画 默认YMSweepDismissStyleVelocity */
  86. @property (nonatomic, assign) YMSweepDismissStyle sweepDismissStyle;
  87. /** 点击背景 */
  88. @property (nullable, nonatomic, copy) YmVoidBlock bgClickBlock;
  89. /** 长按背景 */
  90. @property (nullable, nonatomic, copy) YmVoidBlock bgLongPressBlock;
  91. /** 弹窗pan手势偏移量 */
  92. @property (nullable, nonatomic, copy) YmPointBlock panOffsetBlock;
  93. //以下键盘弹出/收起 第三方键盘会多次回调(百度,搜狗测试得出), 原生键盘回调一次
  94. /** 键盘将要弹出 */
  95. @property (nullable, nonatomic, copy) YmVoidBlock keyboardWillShowBlock;
  96. /** 键盘弹出完毕 */
  97. @property (nullable, nonatomic, copy) YmVoidBlock keyboardDidShowBlock;
  98. /** 键盘frame将要改变 */
  99. @property (nullable, nonatomic, copy) YmKeyBoardChangeBlock keyboardFrameWillChangeBlock;
  100. /** 键盘frame改变完毕 */
  101. @property (nullable, nonatomic, copy) YmKeyBoardChangeBlock keyboardFrameDidChangeBlock;
  102. /** 键盘将要收起 */
  103. @property (nullable, nonatomic, copy) YmVoidBlock keyboardWillHideBlock;
  104. /** 键盘收起完毕 */
  105. @property (nullable, nonatomic, copy) YmVoidBlock keyboardDidHideBlock;
  106. //************ 生命周期回调(Block) ************
  107. /** 将要显示 回调 */
  108. @property (nullable, nonatomic, copy) YmVoidBlock popViewWillPopBlock;
  109. /** 已经显示完毕 回调 */
  110. @property (nullable, nonatomic, copy) YmVoidBlock popViewDidPopBlock;
  111. /** 将要开始移除 回调 */
  112. @property (nullable, nonatomic, copy) YmVoidBlock popViewWillDismissBlock;
  113. /** 已经移除完毕 回调 */
  114. @property (nullable, nonatomic, copy) YmVoidBlock popViewDidDismissBlock;
  115. /** 倒计时 回调 */
  116. @property (nullable, nonatomic, copy) YmAlertCountDownBlock popViewCountDownBlock;
  117. /*
  118. 以下是构建方法
  119. customView: 已定义view
  120. popStyle: 弹出动画
  121. dismissStyle: 移除动画
  122. parentView: 弹窗父容器
  123. */
  124. + (nullable instancetype)initWithCustomView:(UIView *_Nonnull)customView;
  125. + (nullable instancetype)initWithCustomView:(UIView *)customView
  126. popStyle:(YMPopupStyle)popStyle
  127. dismissStyle:(YMDismissStyle)dismissStyle;
  128. + (nullable instancetype)initWithCustomView:(UIView *)customView
  129. parentView:(UIView *_Nullable)parentView
  130. popStyle:(YMPopupStyle)popStyle
  131. dismissStyle:(YMDismissStyle)dismissStyle;
  132. /*
  133. 以下是弹出方法
  134. popStyle: 弹出动画 优先级大于全局的popStyle 局部起作用
  135. duration: 弹出时间 优先级大于全局的popDuration 局部起作用
  136. */
  137. - (void)pop;
  138. - (void)popWithStyle:(YMPopupStyle)popStyle;
  139. - (void)popWithDuration:(NSTimeInterval)duration;
  140. - (void)popWithStyle:(YMPopupStyle)popStyle duration:(NSTimeInterval)duration;
  141. /*
  142. 以下是弹出方法
  143. dismissStyle: 弹出动画 优先级大于全局的dismissStyle 局部起作用
  144. duration: 弹出时间 优先级大于全局的dismissDuration 局部起作用
  145. */
  146. - (void)dismiss;
  147. - (void)dismissWithStyle:(YMDismissStyle)dismissStyle;
  148. - (void)dismissWithDuration:(NSTimeInterval)duration;
  149. - (void)dismissWithStyle:(YMDismissStyle)dismissStyle duration:(NSTimeInterval)duration;
  150. /** 删除指定代理 */
  151. - (void)removeForDelegate:(id<YMPopupViewProtocol>)delegate;
  152. /** 删除代理池 删除所有代理 */
  153. - (void)removeAllDelegate;
  154. #pragma mark - ***** 以下是 窗口管理api *****
  155. /** 获取全局(整个app内)所有popView */
  156. + (NSArray *)getAllPopView;
  157. /** 获取当前页面所有popView */
  158. + (NSArray *)getAllPopViewForParentView:(UIView *)parentView;
  159. /** 获取当前页面指定编队的所有popView */
  160. + (NSArray *)getAllPopViewForPopView:(UIView *)popView;
  161. /**
  162. 读取popView (有可能会跨编队读取弹窗)
  163. 建议使用getPopViewForGroupId:forkey: 方法进行精确读取
  164. */
  165. + (YMPopupView *)getPopViewForKey:(NSString *)key;
  166. /** 移除popView */
  167. + (void)removePopView:(YMPopupView *)popView;
  168. + (void)removePopView:(YMPopupView *)popView complete:(YmVoidBlock)complete;
  169. /**
  170. 移除popView 通过唯一key (有可能会跨编队误删弹窗)
  171. 建议使用removePopViewForGroupId:forkey: 方法进行精确删除
  172. */
  173. + (void)removePopViewForKey:(NSString *)key;
  174. + (void)removePopViewForKey:(NSString *)key complete:(YmVoidBlock)complete;
  175. /** 移除所有popView */
  176. + (void)removeAllPopView;
  177. + (void)removeAllPopViewComplete:(YmVoidBlock)complete;
  178. /** 移除 最后一个弹出的 popView */
  179. + (void)removeLastPopView;
  180. + (void)removeLastPopViewComplete:(YmVoidBlock)complete;
  181. /** 开启调试view 建议设置成 线上隐藏 测试打开 */
  182. + (void)setLogStyle:(YMPopupViewLogStyle)logStyle;
  183. @end
  184. NS_ASSUME_NONNULL_END