SWUtilityButtonView.m 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. //
  2. // SWUtilityButtonView.m
  3. // SWTableViewCell
  4. //
  5. // Created by Matt Bowman on 11/27/13.
  6. // Copyright (c) 2013 Chris Wendel. All rights reserved.
  7. //
  8. #import "SWUtilityButtonView.h"
  9. #import "SWUtilityButtonTapGestureRecognizer.h"
  10. @interface SWUtilityButtonView()
  11. @property (nonatomic, strong) NSLayoutConstraint *widthConstraint;
  12. @property (nonatomic, strong) NSMutableArray *buttonBackgroundColors;
  13. @end
  14. @implementation SWUtilityButtonView
  15. #pragma mark - SWUtilityButonView initializers
  16. - (id)initWithUtilityButtons:(NSArray *)utilityButtons parentCell:(SWTableViewCell *)parentCell utilityButtonSelector:(SEL)utilityButtonSelector
  17. {
  18. self = [self initWithFrame:CGRectZero utilityButtons:utilityButtons parentCell:parentCell utilityButtonSelector:utilityButtonSelector];
  19. return self;
  20. }
  21. - (id)initWithFrame:(CGRect)frame utilityButtons:(NSArray *)utilityButtons parentCell:(SWTableViewCell *)parentCell utilityButtonSelector:(SEL)utilityButtonSelector
  22. {
  23. self = [super initWithFrame:frame];
  24. if (self) {
  25. self.translatesAutoresizingMaskIntoConstraints = NO;
  26. self.widthConstraint = [NSLayoutConstraint constraintWithItem:self
  27. attribute:NSLayoutAttributeWidth
  28. relatedBy:NSLayoutRelationEqual
  29. toItem:nil
  30. attribute:NSLayoutAttributeNotAnAttribute
  31. multiplier:1.0
  32. constant:0.0]; // constant will be adjusted dynamically in -setUtilityButtons:.
  33. self.widthConstraint.priority = UILayoutPriorityDefaultHigh;
  34. [self addConstraint:self.widthConstraint];
  35. _parentCell = parentCell;
  36. self.utilityButtonSelector = utilityButtonSelector;
  37. self.utilityButtons = utilityButtons;
  38. }
  39. return self;
  40. }
  41. #pragma mark Populating utility buttons
  42. - (void)setUtilityButtons:(NSArray *)utilityButtons
  43. {
  44. // if no width specified, use the default width
  45. [self setUtilityButtons:utilityButtons WithButtonWidth:kUtilityButtonWidthDefault];
  46. }
  47. - (void)setUtilityButtons:(NSArray *)utilityButtons WithButtonWidth:(CGFloat)width
  48. {
  49. for (UIButton *button in _utilityButtons)
  50. {
  51. [button removeFromSuperview];
  52. }
  53. _utilityButtons = [utilityButtons copy];
  54. if (utilityButtons.count)
  55. {
  56. NSUInteger utilityButtonsCounter = 0;
  57. UIView *precedingView = nil;
  58. for (UIButton *button in _utilityButtons)
  59. {
  60. [self addSubview:button];
  61. button.translatesAutoresizingMaskIntoConstraints = NO;
  62. if (!precedingView)
  63. {
  64. // First button; pin it to the left edge.
  65. [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button]"
  66. options:0L
  67. metrics:nil
  68. views:NSDictionaryOfVariableBindings(button)]];
  69. }
  70. else
  71. {
  72. // Subsequent button; pin it to the right edge of the preceding one, with equal width.
  73. [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[precedingView][button(==precedingView)]"
  74. options:0L
  75. metrics:nil
  76. views:NSDictionaryOfVariableBindings(precedingView, button)]];
  77. }
  78. [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[button]|"
  79. options:0L
  80. metrics:nil
  81. views:NSDictionaryOfVariableBindings(button)]];
  82. SWUtilityButtonTapGestureRecognizer *utilityButtonTapGestureRecognizer = [[SWUtilityButtonTapGestureRecognizer alloc] initWithTarget:_parentCell action:_utilityButtonSelector];
  83. utilityButtonTapGestureRecognizer.buttonIndex = utilityButtonsCounter;
  84. [button addGestureRecognizer:utilityButtonTapGestureRecognizer];
  85. utilityButtonsCounter++;
  86. precedingView = button;
  87. }
  88. // Pin the last button to the right edge.
  89. [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[precedingView]|"
  90. options:0L
  91. metrics:nil
  92. views:NSDictionaryOfVariableBindings(precedingView)]];
  93. }
  94. self.widthConstraint.constant = (width * utilityButtons.count);
  95. [self setNeedsLayout];
  96. return;
  97. }
  98. #pragma mark -
  99. - (void)pushBackgroundColors
  100. {
  101. self.buttonBackgroundColors = [[NSMutableArray alloc] init];
  102. for (UIButton *button in self.utilityButtons)
  103. {
  104. [self.buttonBackgroundColors addObject:button.backgroundColor];
  105. }
  106. }
  107. - (void)popBackgroundColors
  108. {
  109. NSEnumerator *e = self.utilityButtons.objectEnumerator;
  110. for (UIColor *color in self.buttonBackgroundColors)
  111. {
  112. UIButton *button = [e nextObject];
  113. button.backgroundColor = color;
  114. }
  115. self.buttonBackgroundColors = nil;
  116. }
  117. @end