FUPopupMenu.m 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. //
  2. // FUPopupMenu.m
  3. // FULiveDemo
  4. //
  5. // Created by 孙慕 on 2019/10/11.
  6. // Copyright © 2019 FaceUnity. All rights reserved.
  7. //
  8. #import "FUPopupMenu.h"
  9. #import "FUSegmentedControl.h"
  10. #import "FULiveDefine.h"
  11. #import <FURenderKit/FUVideoComponentDefines.h>
  12. #define FUMainWindow [UIApplication sharedApplication].delegate.window
  13. #define LeftView 10.0f
  14. #define TopToView 10.0f
  15. @interface FUPopupMenu()
  16. @property (nonatomic, strong) UIView * menuBackView;
  17. @property (nonatomic) CGPoint point;
  18. @property (nonatomic,assign) int onlyTop;
  19. @property (nonatomic, copy) NSArray *dataSource;
  20. @end
  21. @implementation FUPopupMenu
  22. - (instancetype)initWithFrame:(CGRect)frame onlyTop:(BOOL)onlyTop defaultSelectedAtIndex:(int)index dataSource:(nullable NSArray *)dataSource
  23. {
  24. self = [super initWithFrame:frame];
  25. if (self) {
  26. _selIndex = index;
  27. _onlyTop = onlyTop;
  28. _dataSource = dataSource;
  29. [self setupView];
  30. }
  31. return self;
  32. }
  33. - (void)setupView{
  34. _menuBackView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, FUScreenWidth, FUScreenHeight)];
  35. _menuBackView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.1];
  36. _menuBackView.alpha = 0;
  37. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(touchOutSide)];
  38. [_menuBackView addGestureRecognizer: tap];
  39. self.alpha = 0;
  40. self.backgroundColor = [UIColor clearColor];
  41. UIView *bageView = [[UIView alloc] initWithFrame:CGRectMake(0, 10, self.frame.size.width, self.frame.size.height - 10)];
  42. bageView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.6];
  43. bageView.layer.cornerRadius = 5;
  44. [self addSubview:bageView];
  45. /* 分段控制器 */
  46. NSArray *array = self.dataSource.count > 0 ? self.dataSource : [NSArray arrayWithObjects:@"480×640",@"720×1280",@"1080×1920", nil];
  47. FUSegmentedControl *segment = [[FUSegmentedControl alloc] initWithFrame:CGRectMake(25, 28, self.frame.size.width-50, 32) items:array];
  48. segment.layer.masksToBounds = YES;
  49. segment.layer.cornerRadius = 4;
  50. segment.layer.borderWidth = 0.5;
  51. segment.layer.borderColor = [UIColor whiteColor].CGColor;
  52. segment.titleFont = [UIFont systemFontOfSize:13 weight:UIFontWeightMedium];
  53. segment.selectedIndex = _selIndex;
  54. @FUWeakify(segment)
  55. segment.selectHandler = ^(NSUInteger index) {
  56. @FUStrongify(segment)
  57. if ([self.delegate respondsToSelector:@selector(fuPopupMenuSegment:didSelectedAtIndex:)]) {
  58. [self.delegate fuPopupMenuSegment:segment didSelectedAtIndex:index];
  59. }
  60. };
  61. [self addSubview:segment];
  62. if (!_onlyTop) {
  63. UIView *view = [[UIView alloc] init];
  64. view.frame = CGRectMake(25 ,80, self.frame.size.width - 50, 0.5);
  65. view.layer.backgroundColor = [UIColor colorWithRed:229/255.0 green:229/255.0 blue:229/255.0 alpha:0.2].CGColor;
  66. [self addSubview:view];
  67. UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
  68. btn.frame = CGRectMake(25, 81, self.frame.size.width-50, 50);
  69. [btn setImage:[UIImage imageNamed:@"render_select_media"] forState:UIControlStateNormal];
  70. [btn setTitle:FULocalizedString(@"载入图片或视频") forState:UIControlStateNormal];
  71. [btn addTarget:self action:@selector(didClickBtn) forControlEvents:UIControlEventTouchUpInside];
  72. btn.titleLabel.font = [UIFont systemFontOfSize:13];
  73. btn.titleLabel.textAlignment = NSTextAlignmentLeft;
  74. [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  75. btn.imageEdgeInsets = UIEdgeInsetsMake(0, btn.frame.size.width - btn.imageView.frame.size.width , 0, 0);
  76. btn.titleEdgeInsets = UIEdgeInsetsMake(0, - btn.frame.size.width - btn.imageView.frame.size.width + btn.titleLabel.frame.size.width, 0, 0);
  77. [self addSubview:btn];
  78. }
  79. }
  80. + (FUPopupMenu *)showRelyOnView:(UIView *)view frame:(CGRect)frame defaultSelectedAtIndex:(int)index onlyTop:(BOOL)onlyTop delegate:(id<FUPopupMenuDelegate>)delegate{
  81. return [self showRelyOnView:view frame:frame defaultSelectedAtIndex:index onlyTop:onlyTop dataSource:nil delegate:delegate];
  82. }
  83. + (FUPopupMenu *)showRelyOnView:(UIView *)view frame:(CGRect)frame defaultSelectedAtIndex:(int)index onlyTop:(BOOL)onlyTop dataSource:(NSArray *)dataSource delegate:(id<FUPopupMenuDelegate>)delegate {
  84. CGRect absoluteRect = [view convertRect:view.bounds toView:FUMainWindow];
  85. CGPoint relyPoint = CGPointMake(absoluteRect.origin.x + absoluteRect.size.width / 2, absoluteRect.origin.y + absoluteRect.size.height);
  86. FUPopupMenu *popupMenu = [[FUPopupMenu alloc] initWithFrame:frame onlyTop:(BOOL)onlyTop defaultSelectedAtIndex:(int)index dataSource:dataSource];
  87. popupMenu.delegate = delegate;
  88. popupMenu.point = relyPoint;
  89. CGFloat anchorPointX= (relyPoint.x - frame.origin.x) / frame.size.width * 1.0;
  90. popupMenu.layer.anchorPoint = CGPointMake(anchorPointX, 0);
  91. popupMenu.layer.frame = frame;
  92. [popupMenu show];
  93. return popupMenu;
  94. }
  95. #pragma mark - privates
  96. - (void)show
  97. {
  98. [FUMainWindow addSubview:_menuBackView];
  99. [FUMainWindow addSubview:self];
  100. self.layer.affineTransform = CGAffineTransformMakeScale(0.1, 0.1);
  101. [UIView animateWithDuration: 0.25 animations:^{
  102. self.layer.affineTransform = CGAffineTransformMakeScale(1.0, 1.0);
  103. self.alpha = 1;
  104. self.menuBackView.alpha = 1;
  105. } completion:^(BOOL finished) {
  106. }];
  107. }
  108. - (void)dismiss{
  109. [UIView animateWithDuration: 0.25 animations:^{
  110. self.layer.affineTransform = CGAffineTransformMakeScale(0.1, 0.1);
  111. self.alpha = 0;
  112. self.menuBackView.alpha = 0;
  113. } completion:^(BOOL finished) {
  114. self.delegate = nil;
  115. [self removeFromSuperview];
  116. [self.menuBackView removeFromSuperview];
  117. }];
  118. }
  119. - (void)touchOutSide {
  120. [self dismiss];
  121. }
  122. -(void)didClickBtn{
  123. if ([self.delegate respondsToSelector:@selector(fuPopupMenuDidSelectedImage)]) {
  124. [self.delegate fuPopupMenuDidSelectedImage];
  125. [self dismiss];
  126. }
  127. }
  128. #pragma mark 绘制三角形
  129. - (void)drawRect:(CGRect)rect
  130. {
  131. // [colors[serie] setFill];
  132. // 设置背景色
  133. [[UIColor whiteColor] set];
  134. //拿到当前视图准备好的画板
  135. CGContextRef context = UIGraphicsGetCurrentContext();
  136. //利用path进行绘制三角形
  137. CGContextBeginPath(context);//标记
  138. CGContextMoveToPoint(context,
  139. self.point.x - self.frame.origin.x, 0);//设置起点
  140. CGContextAddLineToPoint(context,
  141. self.point.x - self.frame.origin.x - 10 , 10);
  142. CGContextAddLineToPoint(context,
  143. self.point.x - self.frame.origin.x + 10, 10);
  144. CGContextClosePath(context);//路径结束标志,不写默认封闭
  145. [[UIColor colorWithWhite:0.0 alpha:0.6] setFill]; //设置填充色
  146. [[UIColor clearColor] setStroke];
  147. CGContextDrawPath(context,
  148. kCGPathFillStroke);//绘制路径path
  149. // [self setNeedsDisplay];
  150. }
  151. @end