ImageTitleButton.m 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. //
  2. // ImageTitleButton.m
  3. // CommonLibrary
  4. //
  5. // Created by Alexi on 3/21/14.
  6. // Copyright (c) 2014 Alexi. All rights reserved.
  7. //
  8. #import "ImageTitleButton.h"
  9. #import "UIImage+TintColor.h"
  10. @implementation ImageTitleButton
  11. - (instancetype)init
  12. {
  13. return [self initWithStyle:EImageLeftTitleRight];
  14. }
  15. - (instancetype)initWithStyle:(ImageTitleButtonStyle)style
  16. {
  17. return [self initWithStyle:style maggin:UIEdgeInsetsMake(0, 0, 0, 0)];
  18. }
  19. - (instancetype)initWithStyle:(ImageTitleButtonStyle)style maggin:(UIEdgeInsets)margin
  20. {
  21. return [self initWithStyle:style maggin:margin padding:CGSizeMake(2, 2)];
  22. }
  23. - (instancetype)initWithStyle:(ImageTitleButtonStyle)style maggin:(UIEdgeInsets)margin padding:(CGSize)padding
  24. {
  25. if (self = [super initWithFrame:CGRectZero])
  26. {
  27. _style = style;
  28. _margin = margin;
  29. _padding = padding;
  30. }
  31. return self;
  32. }
  33. - (void)setImage:(nullable UIImage *)image forState:(UIControlState)state
  34. {
  35. [super setImage:image forState:state];
  36. if (image && CGSizeEqualToSize(_imageSize, CGSizeZero))
  37. {
  38. _imageSize = image.size;
  39. }
  40. }
  41. - (void)setMargin:(UIEdgeInsets)margin
  42. {
  43. _margin = margin;
  44. [self setNeedsDisplay];
  45. }
  46. - (void)setPadding:(CGSize)padding
  47. {
  48. _padding = padding;
  49. [self setNeedsDisplay];
  50. }
  51. - (void)relayoutFrameOfSubViews
  52. {
  53. CGRect rect = self.bounds;
  54. rect.origin.x += _margin.left;
  55. rect.size.width -= _margin.left + _margin.right;
  56. rect.origin.y += _margin.top;
  57. rect.size.height -= _margin.top + _margin.bottom;
  58. UIImage *img = [self imageForState:UIControlStateNormal];
  59. CGFloat scale = [[UIScreen mainScreen] scale];
  60. CGSize size = CGSizeZero;
  61. if (CGSizeEqualToSize(self.imageSize, CGSizeZero))
  62. {
  63. size = CGSizeMake(img.size.width/scale, img.size.height/scale);
  64. }
  65. else
  66. {
  67. size = self.imageSize;
  68. }
  69. switch (_style)
  70. {
  71. case EImageTopTitleBottom:
  72. {
  73. CGRect imgRect = rect;
  74. imgRect.size.height = size.height;
  75. imgRect.origin.x += (imgRect.size.width - size.width)/2;
  76. imgRect.size.width = size.width;
  77. self.imageView.frame = imgRect;
  78. CGRect titleRect = rect;
  79. titleRect.origin.y += imgRect.size.height + _padding.height;
  80. titleRect.size.height -= imgRect.size.height + _padding.height;
  81. self.titleLabel.frame = titleRect;
  82. }
  83. break;
  84. case ETitleTopImageBottom:
  85. {
  86. CGRect imgRect = rect;
  87. imgRect.origin.x += (imgRect.size.width - size.width)/2;
  88. imgRect.size.width = size.width;
  89. imgRect.size.height = size.height;
  90. imgRect.origin.y += rect.size.height - imgRect.size.height;
  91. self.imageView.frame = imgRect;
  92. CGRect titleRect = rect;
  93. titleRect.size.height -= imgRect.size.height + _padding.height;
  94. self.titleLabel.frame = titleRect;
  95. }
  96. break;
  97. case EImageLeftTitleRight:
  98. {
  99. CGRect imgRect = rect;
  100. imgRect.size.width = size.width;
  101. imgRect.size.height = size.height;
  102. imgRect.origin.y += (rect.size.height - size.height)/2;
  103. self.imageView.frame = imgRect;
  104. CGRect titleRect = rect;
  105. titleRect.origin.x += imgRect.size.width + _padding.width;
  106. titleRect.size.width -= imgRect.size.width + _padding.width;
  107. self.titleLabel.frame = titleRect;
  108. }
  109. break;
  110. case ETitleLeftImageRight:
  111. {
  112. CGRect imgRect = rect;
  113. imgRect.size.width = size.width;
  114. imgRect.origin.x += rect.size.width - imgRect.size.width;
  115. imgRect.size.height = size.height;
  116. imgRect.origin.y += (rect.size.height - size.height)/2;
  117. self.imageView.frame = imgRect;
  118. CGRect titleRect = rect;
  119. titleRect.size.width -= imgRect.size.width + _padding.width;
  120. self.titleLabel.frame = titleRect;
  121. }
  122. break;
  123. case EImageLeftTitleRightLeft:
  124. {
  125. CGRect imgRect = rect;
  126. imgRect.size = self.imageSize;
  127. imgRect.origin.y += (rect.size.height - imgRect.size.height)/2;
  128. self.imageView.frame = imgRect;
  129. rect.origin.x += imgRect.size.width + self.padding.width;
  130. rect.size.width -= imgRect.size.width + self.padding.width;
  131. self.titleLabel.textAlignment = NSTextAlignmentLeft;
  132. self.titleLabel.frame = rect;
  133. }
  134. break;
  135. case ETitleLeftImageRightLeft:
  136. {
  137. CGRect imgRect = rect;
  138. imgRect.size = self.imageSize;
  139. imgRect.origin.y += (rect.size.height - imgRect.size.height)/2;
  140. imgRect.origin.x += rect.size.width - (imgRect.size.width + self.padding.width);
  141. self.imageView.frame = imgRect;
  142. rect.size.width -= imgRect.size.width + self.padding.width;
  143. self.titleLabel.frame = rect;
  144. }
  145. break;
  146. case EImageLeftTitleRightCenter:
  147. {
  148. CGSize titleSize = [self.titleLabel textSizeIn:rect.size];
  149. CGRect middleRect = CGRectInset(rect, (rect.size.width - (titleSize.width + self.imageSize.width + self.padding.width))/2, 0);
  150. CGRect imgRect = middleRect;
  151. imgRect.size = self.imageSize;
  152. imgRect.origin.y += (middleRect.size.height - imgRect.size.height)/2;
  153. self.imageView.frame = imgRect;
  154. middleRect.origin.x += imgRect.size.width + self.padding.width;
  155. middleRect.size.width -= imgRect.size.width + self.padding.width;
  156. self.titleLabel.frame = middleRect;
  157. }
  158. break;
  159. case ETitleLeftImageRightCenter:
  160. {
  161. CGSize titleSize = [self.titleLabel textSizeIn:rect.size];
  162. CGRect middleRect = CGRectInset(rect, (rect.size.width - (titleSize.width + self.imageSize.width + self.padding.width))/2, 0);
  163. CGRect titlerect = middleRect;
  164. titlerect.size.width = titleSize.width;
  165. self.titleLabel.frame = titlerect;
  166. middleRect.origin.x += titlerect.size.width + self.padding.width;
  167. middleRect.size.width -= titlerect.size.width + self.padding.width;
  168. middleRect.origin.y += (middleRect.size.height - self.imageSize.height)/2;
  169. middleRect.size = self.imageSize;
  170. self.imageView.frame = middleRect;
  171. }
  172. break;
  173. case EFitTitleLeftImageRight:
  174. {
  175. CGSize titleSize = [self.titleLabel textSizeIn:rect.size];
  176. CGRect titleRect = rect;
  177. titleRect.origin.y = rect.origin.y + (rect.size.height - titleSize.height)/2;
  178. titleRect.size = titleSize;
  179. self.titleLabel.frame = titleRect;
  180. titleRect.origin.x += titleRect.size.width + self.padding.width;
  181. titleRect.size = self.imageSize;
  182. titleRect.origin.y = rect.origin.y + (rect.size.height - self.imageSize.height)/2;
  183. self.imageView.frame = titleRect;
  184. break;
  185. }
  186. break;
  187. default:
  188. break;
  189. }
  190. }
  191. - (void)layoutSubviews
  192. {
  193. if (CGRectEqualToRect(self.bounds, CGRectZero))
  194. {
  195. return;
  196. }
  197. [super layoutSubviews];
  198. // // 单独设置title或image的时候只用
  199. // NSString *title = [self titleForState:UIControlStateNormal];
  200. // UIImage *image = [self imageForState:UIControlStateNormal];
  201. // if ([NSString isEmpty:title] && image)
  202. // {
  203. [self relayoutFrameOfSubViews];
  204. // }
  205. }
  206. - (void)setTintColor:(UIColor *)color
  207. {
  208. if (color)
  209. {
  210. UIImage *img = [self imageForState:UIControlStateNormal];
  211. img = [img imageWithTintColor:color];
  212. [self setImage:img forState:UIControlStateNormal];
  213. [self setTitleColor:color forState:UIControlStateNormal];
  214. }
  215. }
  216. @end