QBPopupMenuItemView.m 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. //
  2. // QBPopupMenuItemView.m
  3. // QBPopupMenu
  4. //
  5. // Created by Tanaka Katsuma on 2013/11/22.
  6. // Copyright (c) 2013年 Katsuma Tanaka. All rights reserved.
  7. //
  8. #import "QBPopupMenuItemView.h"
  9. #import "QBPopupMenu.h"
  10. #import "QBPopupMenuItem.h"
  11. @interface QBPopupMenuItemView ()
  12. @property (nonatomic, strong, readwrite) UIButton *button;
  13. @end
  14. @implementation QBPopupMenuItemView
  15. + (instancetype)itemViewWithItem:(QBPopupMenuItem *)item
  16. {
  17. return [[self alloc] initWithItem:item];
  18. }
  19. - (instancetype)initWithItem:(QBPopupMenuItem *)item
  20. {
  21. self = [super initWithFrame:CGRectZero];
  22. if (self) {
  23. // View settings
  24. self.opaque = NO;
  25. self.backgroundColor = [UIColor clearColor];
  26. self.clipsToBounds = YES;
  27. // Create button
  28. self.button = ({
  29. UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
  30. button.frame = self.bounds;
  31. button.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  32. [button addTarget:self action:@selector(performAction) forControlEvents:UIControlEventTouchUpInside];
  33. // Set style
  34. button.contentMode = UIViewContentModeScaleAspectFit;
  35. button.titleLabel.font = [UIFont systemFontOfSize:14.0];
  36. button.imageView.contentMode = UIViewContentModeScaleAspectFit;
  37. [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  38. [button setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
  39. button;
  40. });
  41. [self addSubview:self.button];
  42. // Property settings
  43. self.item = item;
  44. }
  45. return self;
  46. }
  47. #pragma mark - Accessors
  48. - (void)setImage:(UIImage *)image
  49. {
  50. [self.button setBackgroundImage:image forState:UIControlStateNormal];
  51. }
  52. - (UIImage *)image
  53. {
  54. return [self.button backgroundImageForState:UIControlStateNormal];
  55. }
  56. - (void)setHighlightedImage:(UIImage *)highlightedImage
  57. {
  58. [self.button setBackgroundImage:highlightedImage forState:UIControlStateHighlighted];
  59. }
  60. - (UIImage *)highlightedImage
  61. {
  62. return [self.button backgroundImageForState:UIControlStateHighlighted];
  63. }
  64. - (void)setItem:(QBPopupMenuItem *)item
  65. {
  66. _item = item;
  67. // Update
  68. [self configureButton];
  69. }
  70. #pragma mark - Actions
  71. - (void)performAction
  72. {
  73. if (self.item.target && self.item.action) {
  74. [self.item.target performSelector:self.item.action withObject:nil afterDelay:0];
  75. }
  76. // Close popup menu
  77. [self.popupMenu dismissAnimated:YES];
  78. }
  79. #pragma mark - Updating the View
  80. - (void)sizeToFit
  81. {
  82. CGSize size = [self sizeThatFits:CGSizeZero];
  83. CGRect frame = self.frame;
  84. frame.size = size;
  85. self.frame = frame;
  86. }
  87. - (CGSize)sizeThatFits:(CGSize)size
  88. {
  89. CGSize buttonSize = [self.button sizeThatFits:CGSizeZero];
  90. buttonSize.width += 10 * 2;
  91. return buttonSize;
  92. }
  93. - (void)configureButton
  94. {
  95. // Title
  96. [self.button setTitle:self.item.title forState:UIControlStateNormal];
  97. // Image
  98. [self.button setImage:self.item.image forState:UIControlStateNormal];
  99. [self.button setImage:self.item.image forState:UIControlStateHighlighted];
  100. // Content edge insets
  101. if (self.item.title && self.item.image) {
  102. self.button.titleEdgeInsets = UIEdgeInsetsMake(0, 6, 0, 0);
  103. self.button.imageEdgeInsets = UIEdgeInsetsMake(0, -3, 0, 0);
  104. } else {
  105. self.button.titleEdgeInsets = UIEdgeInsetsZero;
  106. self.button.imageEdgeInsets = UIEdgeInsetsZero;
  107. }
  108. }
  109. @end