EffectSelectView.m 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. //
  2. // VideoEffectSlider.m
  3. // TXLiteAVDemo
  4. //
  5. // Created by xiang zhang on 2017/11/3.
  6. // Copyright © 2017年 Tencent. All rights reserved.
  7. //
  8. #import "EffectSelectView.h"
  9. #import "UIView+Additions.h"
  10. #import "ColorMacro.h"
  11. #define EFFCT_COUNT 4
  12. #define EFFCT_IMAGE_WIDTH 50 * kScaleY
  13. #define EFFCT_IMAGE_SPACE 20
  14. @implementation EffectInfo
  15. @end
  16. @implementation EffectSelectView
  17. {
  18. UIScrollView *_effectSelectView;
  19. NSMutableArray *_selectViewList;
  20. }
  21. - (instancetype)initWithFrame:(CGRect)frame
  22. {
  23. self = [super initWithFrame:frame];
  24. if (self) {
  25. _effectSelectView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0, self.width,EFFCT_IMAGE_WIDTH + 20)];
  26. [self addSubview:_effectSelectView];
  27. _selectViewList = [NSMutableArray array];
  28. }
  29. return self;
  30. }
  31. - (void)setSelectedIndex:(NSInteger)selectedIndex
  32. {
  33. if (self.momentary) return;
  34. if (selectedIndex < _selectViewList.count) {
  35. _selectedIndex = selectedIndex;
  36. for (UIImageView *view in _selectViewList) {
  37. if (view.tag == selectedIndex) {
  38. view.hidden = NO;
  39. }else{
  40. view.hidden = YES;
  41. }
  42. }
  43. }
  44. }
  45. - (void)setEffectList:(NSArray<EffectInfo *> *)effecList
  46. {
  47. [self setEffectList:effecList momentary:NO];
  48. }
  49. - (void)setEffectList:(NSArray<EffectInfo *> *)effecList momentary:(BOOL)momentary
  50. {
  51. self.momentary = momentary;
  52. [_effectSelectView removeAllSubViews];
  53. [_selectViewList removeAllObjects];
  54. CGFloat space = floorf(20 * kScaleX);
  55. CGFloat buttonSize = floorf(EFFCT_IMAGE_WIDTH);
  56. for (int i = 0 ; i < effecList.count ; i ++){
  57. EffectInfo *info = effecList[i];
  58. UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
  59. [btn setFrame:CGRectMake(space + (space + buttonSize) * i, 0, buttonSize, buttonSize)];
  60. if (info.animateIcons) {
  61. UIImageView* animatedImageView = [[UIImageView alloc] initWithFrame:btn.bounds];
  62. animatedImageView.animationImages = info.animateIcons;
  63. if (info.isSlow) {
  64. animatedImageView.animationDuration = 1.0 / 15 * effecList[i].animateIcons.count;
  65. }
  66. [animatedImageView startAnimating];
  67. [btn addSubview:animatedImageView];
  68. } else {
  69. [btn setImage:effecList[i].icon forState:UIControlStateNormal];
  70. }
  71. btn.layer.cornerRadius = EFFCT_IMAGE_WIDTH / 2.0;
  72. btn.layer.masksToBounds = YES;
  73. btn.titleLabel.numberOfLines = 0;
  74. btn.tag = i;
  75. [btn addTarget:self action:@selector(beginPress:) forControlEvents:UIControlEventTouchDown];
  76. [btn addTarget:self action:@selector(endPress:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
  77. [btn addTarget:self action:@selector(upInsidePress:) forControlEvents:UIControlEventTouchUpInside];
  78. UIImageView *selectView = [[UIImageView alloc]initWithFrame:btn.frame];
  79. [selectView setImage:effecList[i].selectIcon];
  80. selectView.hidden = YES;
  81. selectView.tag = i;
  82. [_selectViewList addObject:selectView];
  83. UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(btn.x - space/2, btn.bottom + 8, btn.width+space, 12)];
  84. label.text = effecList[i].name;
  85. label.adjustsFontSizeToFitWidth = YES;
  86. label.minimumScaleFactor = 0.5;
  87. label.textColor = [UIColor whiteColor];
  88. label.textAlignment = NSTextAlignmentCenter;
  89. label.font = [UIFont systemFontOfSize:10];
  90. [_effectSelectView addSubview:btn];
  91. [_effectSelectView addSubview:selectView];
  92. [_effectSelectView addSubview:label];
  93. _effectSelectView.contentSize = CGSizeMake(btn.right, buttonSize);
  94. }
  95. if (_effectSelectView.contentSize.width > self.width) {
  96. _effectSelectView.alwaysBounceHorizontal = YES;
  97. }else{
  98. _effectSelectView.alwaysBounceHorizontal = NO;
  99. }
  100. }
  101. //开始按压
  102. -(void) beginPress: (UIButton *) button {
  103. CGFloat offset = _effectSelectView.contentOffset.x;
  104. CGFloat diff = _effectSelectView.contentSize.width - _effectSelectView.bounds.size.width;
  105. if (offset < 0 || (diff > 0 && offset > diff)) {
  106. // 在回弹区域会触发button事件被cancel,导致收不到 TouchEnd 事件
  107. return;
  108. }
  109. [self.delegate onEffectBtnBeginSelect:button];
  110. for (UIImageView *view in _selectViewList) {
  111. if (view.tag == button.tag) {
  112. view.hidden = NO;
  113. }else{
  114. view.hidden = YES;
  115. }
  116. }
  117. }
  118. //结束按压
  119. -(void) endPress: (UIButton *) button {
  120. if (self.momentary) {
  121. [_selectViewList enumerateObjectsUsingBlock:^(UIImageView * obj, NSUInteger idx, BOOL * _Nonnull stop) {
  122. obj.hidden = YES;
  123. }];
  124. } else {
  125. _selectedIndex = button.tag;
  126. }
  127. [self.delegate onEffectBtnEndSelect:button];
  128. }
  129. //按压
  130. -(void) upInsidePress: (UIButton *) button {
  131. [self.delegate onEffectBtnSelected:button];
  132. }
  133. @end