PCSModeList.m 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. //
  2. // PCSModeList.m
  3. // sampleSDK
  4. //
  5. // Created by 王昭威 on 2023/1/15.
  6. //
  7. #import "PCSModeList.h"
  8. #import <Masonry/Masonry.h>
  9. #import "PCSTools.h"
  10. #import "PCSThemeColorManager.h"
  11. #import "OperationNodeProtocol.h"
  12. @interface PCSModeList ()
  13. @property (nonatomic, strong) UIView* list;
  14. @property (nonatomic, assign, readonly) CGFloat space;
  15. @property (nonatomic, strong) NSArray<__kindof UILabel*>* itemViews;
  16. @property (nonatomic, copy) NSArray<id<OperationNodeProtocol>>* items;
  17. @property (nonatomic) CGPoint nextPoint;
  18. @end
  19. @implementation PCSModeList
  20. - (instancetype)init {
  21. if (self = [super init]) {
  22. }
  23. return self;
  24. }
  25. - (void)reloadWith:(NSArray<id<OperationNodeProtocol>>*)items{
  26. self.items = items;
  27. self.index = 0;
  28. self.itemViews = [self reloadItemViews];
  29. [self selectItemAt:self.index];
  30. }
  31. - (void)setMode:(SDKCaptureModeIndex)mode{
  32. __block NSUInteger index = NSUIntegerMax;
  33. [self.items enumerateObjectsUsingBlock:^(id<OperationNodeProtocol> _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  34. if(obj.modeIndex == mode){
  35. index = idx;
  36. *stop = YES;
  37. }
  38. }];
  39. if(_index == index){
  40. return;
  41. }
  42. if(NSUIntegerMax == index){
  43. return;
  44. }
  45. _index = index;
  46. [self updateItemsConstraints];
  47. }
  48. - (SDKCaptureModeIndex)mode{
  49. return (SDKCaptureModeIndex)self.index;
  50. }
  51. - (void)updateItemsConstraints{
  52. __block UILabel* previous = self.itemViews.firstObject;
  53. [self.itemViews enumerateObjectsUsingBlock:^(__kindof UILabel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  54. obj.textColor = UIColor.whiteColor;
  55. [obj mas_remakeConstraints:^(MASConstraintMaker *make) {
  56. if(idx != 0){
  57. make.left.equalTo(previous.mas_right).offset(self.space);
  58. }
  59. make.centerY.equalTo(self);
  60. }];
  61. previous = obj;
  62. }];
  63. [self selectItemAt:self.index];
  64. }
  65. - (CGFloat)space{
  66. return 40;
  67. }
  68. - (void)updateIndexByTanslation:(CGPoint)translation{
  69. NSUInteger oldIndex = self.index;
  70. if(self.index < self.items.count - 1 && translation.x < 0){
  71. self.index += 1;
  72. }
  73. else if(self.index > 0 && translation.x > 0){
  74. self.index -= 1;
  75. }
  76. if (oldIndex != self.index) {
  77. if(self.indexChangedHandler){
  78. if (self.indexChangedHandler(self.index, oldIndex)) {
  79. [self updateItemsConstraints];
  80. } else {
  81. self.index = oldIndex;
  82. }
  83. }
  84. [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
  85. [self layoutIfNeeded];
  86. } completion:^(BOOL finished) {}];
  87. }
  88. }
  89. - (void)selectItemAt: (NSUInteger)index{
  90. if(index >= self.itemViews.count){
  91. return;
  92. }
  93. self.itemViews[index].textColor = [PCSThemeColorManager orange];
  94. [self.itemViews[index] mas_makeConstraints:^(MASConstraintMaker *make) {
  95. make.centerX.equalTo(self);
  96. }];
  97. }
  98. - (NSMutableArray*)reloadItemViews{
  99. NSArray<id<OperationNodeProtocol>>* items = self.items;
  100. __block UILabel* previous = nil;
  101. NSMutableArray* labels = [NSMutableArray array];
  102. [items enumerateObjectsUsingBlock:^(id<OperationNodeProtocol> _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  103. UILabel* label = [[UILabel alloc] init];
  104. label.font = [UIFont systemFontOfSize:13];
  105. [labels addObject:label];
  106. label.translatesAutoresizingMaskIntoConstraints = NO;
  107. label.text = obj.modeItemString;
  108. label.textColor = UIColor.whiteColor;
  109. [self addSubview:label];
  110. [label mas_makeConstraints:^(MASConstraintMaker *make) {
  111. if(previous != nil){
  112. make.left.equalTo(previous.mas_right).offset(self.space);
  113. }
  114. make.centerY.equalTo(self);
  115. }];
  116. previous = label;
  117. }];
  118. return labels;
  119. }
  120. - (void)awakeFromNib{
  121. [super awakeFromNib];
  122. self.backgroundColor = UIColor.clearColor;
  123. UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandler:)];
  124. [self addGestureRecognizer:tap];
  125. if(self.items == nil || self.items.count == 0){
  126. return;
  127. }
  128. self.index = 0;
  129. NSMutableArray* labels = [self reloadItemViews];
  130. self.itemViews = [labels copy];
  131. [self selectItemAt:self.index];
  132. }
  133. - (void)tapHandler: (UITapGestureRecognizer*)gesture{
  134. CGPoint pt = [gesture locationInView:self];
  135. [self.itemViews enumerateObjectsUsingBlock:^(__kindof UILabel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  136. if(CGRectContainsPoint(obj.frame, pt)){
  137. *stop = YES;
  138. NSUInteger oldIndex = self.index;
  139. self.index = idx;
  140. if (oldIndex != self.index) {
  141. if(self.indexChangedHandler){
  142. if (self.indexChangedHandler(self.index, oldIndex)) {
  143. [self updateItemsConstraints];
  144. } else {
  145. self.index = oldIndex;
  146. }
  147. }
  148. [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
  149. [self layoutIfNeeded];
  150. } completion:^(BOOL finished) {}];
  151. }
  152. }
  153. }];
  154. }
  155. @end