UGCKitEditBottomMenu.m 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // Copyright (c) 2019 Tencent. All rights reserved.
  2. #import "UGCKitEditBottomMenu.h"
  3. #import "UGCKitColorMacro.h"
  4. #import "UGCKitVerticalButton.h"
  5. @implementation UGCKitEditBottomMenuItem
  6. + (instancetype)menuItemWithTitle:(NSString *)title icon:(UIImage *)icon highlightedIcon:(nullable UIImage *)highlightedIcon action:(void (^)(void))action
  7. {
  8. UGCKitEditBottomMenuItem *item = [[UGCKitEditBottomMenuItem alloc] init];
  9. item.title = title;
  10. item.icon = icon;
  11. item.highlightedIcon = highlightedIcon;
  12. item.action = action;
  13. return item;
  14. }
  15. @end
  16. @implementation UGCKitEditBottomMenu
  17. {
  18. NSMutableArray<UGCKitEditBottomMenuItem *> *_items;
  19. UIView* _contentView;
  20. NSArray<UIButton *> *_buttons;
  21. BOOL _needsSetupMenuItemView;
  22. BOOL _isHidden;
  23. }
  24. - (instancetype)initWithFrame:(CGRect)frame items:(NSArray<UGCKitEditBottomMenuItem *>*)items
  25. {
  26. if (self = [self initWithFrame:frame]) {
  27. _items = [NSMutableArray arrayWithArray:items];
  28. _textColor = [UIColor whiteColor];
  29. [self _setupMenuView];
  30. }
  31. return self;
  32. }
  33. - (UGCKitEditBottomMenuItem *)addItemWithTitle:(NSString *)title
  34. icon:(UIImage *)icon
  35. highlightedIcon:(nullable UIImage *)highlightedIcon
  36. action:(void (^)(void))action
  37. {
  38. UGCKitEditBottomMenuItem *item = [UGCKitEditBottomMenuItem menuItemWithTitle:title icon:icon highlightedIcon:highlightedIcon action:action];
  39. [_items addObject:item];
  40. _needsSetupMenuItemView = YES;
  41. [self setNeedsLayout];
  42. return item;
  43. }
  44. - (void)_setupMenuView
  45. {
  46. NSInteger index = 0;
  47. [_buttons makeObjectsPerformSelector:@selector(removeFromSuperview)];
  48. NSMutableArray *buttons = [[NSMutableArray alloc] initWithCapacity:_items.count];
  49. for (UGCKitEditBottomMenuItem *item in _items) {
  50. UGCKitVerticalButton *button = [[UGCKitVerticalButton alloc] initWithTitle:item.title];
  51. button.verticalSpacing = 1;
  52. [button setImage:item.icon forState:UIControlStateNormal];
  53. [button setTitle:item.title forState:UIControlStateNormal];
  54. button.tag = index;
  55. [button addTarget:self action:@selector(onTapMenuItem:) forControlEvents:UIControlEventTouchUpInside];
  56. [button setTitleColor:_textColor forState:UIControlStateNormal];
  57. button.titleLabel.textAlignment = NSTextAlignmentCenter;
  58. button.titleLabel.font = [UIFont systemFontOfSize:13];
  59. [buttons addObject:button];
  60. [_contentView addSubview:button];
  61. ++index;
  62. }
  63. _buttons = buttons;
  64. _needsSetupMenuItemView = NO;
  65. }
  66. - (void)onTapMenuItem:(UIButton *)sender
  67. {
  68. NSInteger index = sender.tag;
  69. if (index < _items.count) {
  70. UGCKitEditBottomMenuItem *item = _items[index];
  71. if (item.action) {
  72. item.action();
  73. }
  74. }
  75. }
  76. - (id)initWithFrame:(CGRect)frame
  77. {
  78. if (self = [super initWithFrame:frame]) {
  79. _contentView = [[UIView alloc] initWithFrame:self.bounds];
  80. _contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  81. [self addSubview:_contentView];
  82. }
  83. return self;
  84. }
  85. - (void)layoutSubviews
  86. {
  87. [super layoutSubviews];
  88. if (_needsSetupMenuItemView) {
  89. [self _setupMenuView];
  90. }
  91. CGFloat buttonWidth= CGRectGetWidth(self.bounds) / _buttons.count;
  92. CGFloat height = CGRectGetHeight(self.bounds);
  93. [_buttons enumerateObjectsUsingBlock:^(UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  94. obj.frame = CGRectMake(buttonWidth * idx, 0, buttonWidth, height);
  95. }];
  96. }
  97. - (void)setHidden:(BOOL)hidden
  98. {
  99. if (_isHidden == hidden) return;
  100. _isHidden = hidden;
  101. CGFloat height = self.frame.size.height;
  102. UIView *contentView = _contentView;
  103. CGFloat bottom = CGRectGetMaxY(_contentView.frame);
  104. if (hidden) {
  105. if (bottom > height) return;
  106. [UIView animateWithDuration:0.1 animations:^{
  107. contentView.frame = CGRectOffset(contentView.frame, 0, height);
  108. contentView.alpha = 0.0;
  109. }];
  110. }else{
  111. if (bottom <= height) return;
  112. [UIView animateWithDuration:0.5 animations:^{
  113. contentView.frame = CGRectOffset(contentView.frame, 0, -height);
  114. contentView.alpha = 1.0;
  115. }];
  116. }
  117. }
  118. - (BOOL)isHidden {
  119. return _isHidden;
  120. }
  121. @end