@@ -120,7 +120,7 @@ - (void)sizeToFit {
120120 default :
121121 break ;
122122 }
123-
123+
124124 self.frame = myFrame;
125125}
126126
@@ -178,7 +178,7 @@ - (CGRect)titleRectImageAtLeftForContentRect:(CGRect)contentRect titleRect:(CGRe
178178 default : // 剩下的就是右对齐,右对齐titleLabel不用做任何改变
179179 break ;
180180 }
181-
181+
182182 titleRect.size = titleSize;
183183 titleRect.origin = titleOrigin;
184184 return titleRect;
@@ -196,15 +196,15 @@ - (CGRect)imageRectImageAtRightForContentRect:(CGRect)contentRect imageRect:(CGR
196196 CGPoint imageOrigin = imageRect.origin ;
197197 CGSize imageSize = imageRect.size ;
198198 CGSize titleSize = titleRect.size ;
199-
199+
200200 // 这里水平中心对齐,跟图片在右边时的中心对齐时差别在于:图片在右边时中心对齐考虑了titleLabel+imageView这个整体,而这里只单独考虑imageView
201201 if (imageSize.width + titleSize.width > imageSafeWidth) {
202202 imageSize.width = imageSize.width - (imageSize.width + titleSize.width - imageSafeWidth);
203203 }
204204
205205 CGFloat buttonWidth = contentRect.size .width + self.contentEdgeInsets .left + self.contentEdgeInsets .right ;
206206 titleSize = [self calculateTitleSizeForSystemTitleSize: titleSize];
207-
207+
208208 switch (self.contentHorizontalAlignment ) {
209209 case UIControlContentHorizontalAlignmentCenter: // 中心对齐
210210 // (contentRect.size.width - self.imageEdgeInsets.left - self.imageEdgeInsets.right - (imageSize.width + titleSize.width))/2.0+titleSize.width指的是imageView在其有效区域内联合titleLabel整体居中时的x值,有效区域指的是contentRect内缩imageEdgeInsets后的区域
@@ -233,9 +233,9 @@ - (CGRect)titleRectImageAtRightForContentRect:(CGRect)contentRect titleRect:(CGR
233233 CGPoint titleOrigin = titleRect.origin ;
234234 CGSize titleSize = titleRect.size ;
235235 CGSize imageSize = imageRect.size ;
236-
236+
237237 CGFloat buttonWidth = contentRect.size .width + self.contentEdgeInsets .left + self.contentEdgeInsets .right ;
238-
238+
239239 switch (self.contentHorizontalAlignment ) {
240240 case UIControlContentHorizontalAlignmentCenter: // 中心对齐
241241 // (contentRect.size.width - self.titleEdgeInsets.left - self.titleEdgeInsets.right - (imageSize.width + titleSize.width))/2.0的意思是titleLabel在其有效区域内联合imageView整体居中时的x值,有效区域指的是contentRect内缩titleEdgeInsets后的区域
@@ -263,19 +263,23 @@ - (CGRect)titleRectImageAtRightForContentRect:(CGRect)contentRect titleRect:(CGR
263263
264264- (CGRect)imageRectImageAtTopForContentRect : (CGRect)contentRect imageRect : (CGRect)imageRect titleRect : (CGRect)titleRect {
265265 CGPoint imageOrigin = imageRect.origin ;
266- CGSize imageSize = imageRect .size ;
267- CGSize titleSize = titleRect.size ;
268-
266+ CGSize imageSize = self. currentImage .size ;
267+ CGSize titleSize = [ self calculateTitleSizeForSystemTitleSize: titleRect.size] ;
268+
269269 CGFloat imageSafeWidth = contentRect.size .width - self.imageEdgeInsets .left - self.imageEdgeInsets .right ;
270+ CGFloat imageSafeHeight = contentRect.size .height - self.imageEdgeInsets .top - self.imageEdgeInsets .bottom ;
270271
271272 // 这里水平中心对齐,跟图片在右边时的中心对齐时差别在于:图片在右边时中心对齐考虑了titleLabel+imageView这个整体,而这里只单独考虑imageView
272273 if (imageSize.width > imageSafeWidth) {
273274 imageSize.width = imageSafeWidth;
274275 }
276+ if (imageSize.height > imageSafeHeight) {
277+ imageSize.height = imageSafeHeight;
278+ }
275279
276280 CGFloat buttonWidth = contentRect.size .width + self.contentEdgeInsets .left + self.contentEdgeInsets .right ;
277281 CGFloat buttonHeight = contentRect.size .height + self.contentEdgeInsets .top + self.contentEdgeInsets .bottom ;
278-
282+
279283 // 水平方向
280284 switch (self.contentHorizontalAlignment ) {
281285 case UIControlContentHorizontalAlignmentCenter: {// 中心对齐
@@ -299,14 +303,12 @@ - (CGRect)imageRectImageAtTopForContentRect:(CGRect)contentRect imageRect:(CGRec
299303 // 给图片高度作最大限制,超出限制对高度进行压缩,这样还可以保证titeLabel不会超出其有效区域
300304 CGFloat imageTitleLimitMaxH = contentRect.size .height - self.imageEdgeInsets .top - self.imageEdgeInsets .bottom ;
301305 if (imageSize.height < imageTitleLimitMaxH) {
302- if (titleSize.height + self. currentImage . size .height > imageTitleLimitMaxH) {
306+ if (titleSize.height + imageSize .height > imageTitleLimitMaxH) {
303307 CGFloat beyondValue = titleSize.height + self.currentImage .size .height - imageTitleLimitMaxH;
304308 imageSize.height = imageSize.height - beyondValue;
305309 }
306- // 之所以采用自己计算的结果,是因为当sizeToFit且titleLabel的numberOfLines > 0时,系统内部会按照2行计算
307- titleSize = [self calculateTitleSizeForSystemTitleSize: titleSize];
308310 }
309-
311+
310312 // 垂直方向
311313 switch (self.contentVerticalAlignment ) {
312314 case UIControlContentVerticalAlignmentCenter: // 中心对齐
@@ -331,28 +333,26 @@ - (CGRect)imageRectImageAtTopForContentRect:(CGRect)contentRect imageRect:(CGRec
331333
332334- (CGRect)titleRectImageAtTopForContentRect : (CGRect)contentRect titleRect : (CGRect)titleRect imageRect : (CGRect)imageRect {
333335 CGPoint titleOrigin = titleRect.origin ;
334- CGSize titleSize = titleRect.size ;
336+ CGSize imageSize = self.currentImage .size ;
337+ CGSize titleSize = [self calculateTitleSizeForSystemTitleSize: titleRect.size];
335338
336339 CGFloat buttonWidth = contentRect.size .width + self.contentEdgeInsets .left + self.contentEdgeInsets .right ;
337340 CGFloat buttonHeight = contentRect.size .height + self.contentEdgeInsets .top + self.contentEdgeInsets .bottom ;
338341
339- CGSize imageSize = imageRect.size ;
340342 // 这个if语句的含义是:计算图片由于设置了contentEdgeInsets而被压缩的高度,设置imageEdgeInsets被压缩的高度不计算在内。这样做的目的是,当设置了contentEdgeInsets时,图片可能会被压缩,此时titleLabel的y值依赖于图片压缩后的高度,当设置了imageEdgeInsets时,图片也可能被压缩,此时titleLabel的y值依赖于图片压缩前的高度,这样以来,设置imageEdgeInsets就不会对titleLabel的y值产生影响
341- if (self. currentImage . size .height + titleSize.height > contentRect.size .height ) {
343+ if (imageSize .height + titleSize.height > contentRect.size .height ) {
342344 imageSize.height = self.currentImage .size .height - (self.currentImage .size .height + titleSize.height - contentRect.size .height );
343345 }
344-
345- titleSize = [self calculateTitleSizeForSystemTitleSize: titleSize];
346346 // titleLabel的安全宽度,这里一定要改变宽度值,因为当外界设置了titleEdgeInsets值时,系统计算出来的所有值都是在”左图右文“的基础上进行的,这个基础上可能会导致titleLabel的宽度被压缩,所以我们在此自己重新计算
347347 CGFloat titleSafeWidth = contentRect.size .width - self.titleEdgeInsets .left - self.titleEdgeInsets .right ;
348348 if (titleSize.width > titleSafeWidth) {
349349 titleSize.width = titleSafeWidth;
350350 }
351-
351+
352352 // 水平方向
353353 switch (self.contentHorizontalAlignment ) {
354354 case UIControlContentHorizontalAlignmentCenter: {// 中心对齐
355-
355+
356356 titleOrigin.x = (titleSafeWidth - titleSize.width ) / 2.0 + self.contentEdgeInsets .left + self.titleEdgeInsets .left ;
357357 }
358358 break ;
@@ -391,7 +391,7 @@ - (CGRect)titleRectImageAtTopForContentRect:(CGRect)contentRect titleRect:(CGRec
391391 titleOrigin.y = buttonHeight - titleSize.height - self.contentEdgeInsets .bottom - self.titleEdgeInsets .bottom + _imageTitleSpace * 0.5 ;
392392 break ;
393393 }
394-
394+
395395 titleRect.size = titleSize;
396396 titleRect.origin = titleOrigin;
397397 return titleRect;
@@ -401,14 +401,19 @@ - (CGRect)titleRectImageAtTopForContentRect:(CGRect)contentRect titleRect:(CGRec
401401
402402- (CGRect)imageRectImageAtBottomForContentRect : (CGRect)contentRect imageRect : (CGRect)imageRect titleRect : (CGRect)titleRect {
403403 CGPoint imageOrigin = imageRect.origin ;
404- CGSize imageSize = imageRect .size ;
405- CGSize titleSize = titleRect.size ;
404+ CGSize imageSize = self. currentImage .size ;
405+ CGSize titleSize = [ self calculateTitleSizeForSystemTitleSize: titleRect.size] ;
406406
407407 CGFloat imageSafeWidth = contentRect.size .width - self.imageEdgeInsets .left - self.imageEdgeInsets .right ;
408+ CGFloat imageSafeHeight = contentRect.size .height - self.imageEdgeInsets .top - self.imageEdgeInsets .bottom ;
409+
408410 // 这里水平中心对齐,跟图片在右边时的中心对齐时差别在于:图片在右边时中心对齐考虑了titleLabel+imageView这个整体,而这里只单独考虑imageView
409411 if (imageSize.width > imageSafeWidth) {
410412 imageSize.width = imageSafeWidth;
411413 }
414+ if (imageSize.height > imageSafeHeight) {
415+ imageSize.height = imageSafeHeight;
416+ }
412417
413418 CGFloat buttonWidth = contentRect.size .width + self.contentEdgeInsets .left + self.contentEdgeInsets .right ;
414419 CGFloat buttonHeight = contentRect.size .height + self.contentEdgeInsets .top + self.contentEdgeInsets .bottom ;
@@ -436,12 +441,10 @@ - (CGRect)imageRectImageAtBottomForContentRect:(CGRect)contentRect imageRect:(CG
436441 // 给图片高度作最大限制,超出限制对高度进行压缩,这样还可以保证titeLabel不会超出其有效区域
437442 CGFloat imageTitleLimitMaxH = contentRect.size .height - self.imageEdgeInsets .top - self.imageEdgeInsets .bottom ;
438443 if (imageSize.height < imageTitleLimitMaxH) {
439- if (titleSize.height + self. currentImage . size .height > imageTitleLimitMaxH) {
444+ if (titleSize.height + imageSize .height > imageTitleLimitMaxH) {
440445 CGFloat beyondValue = titleSize.height + self.currentImage .size .height - imageTitleLimitMaxH;
441446 imageSize.height = imageSize.height - beyondValue;
442447 }
443- // 之所以采用自己计算的结果,是因为当sizeToFit且titleLabel的numberOfLines > 0时,系统内部会按照2行计算
444- titleSize = [self calculateTitleSizeForSystemTitleSize: titleSize];
445448 }
446449 // 垂直方向
447450 switch (self.contentVerticalAlignment ) {
@@ -461,23 +464,22 @@ - (CGRect)imageRectImageAtBottomForContentRect:(CGRect)contentRect imageRect:(CG
461464 imageOrigin.y = buttonHeight - imageSize.height - self.contentEdgeInsets .bottom - self.imageEdgeInsets .bottom + _imageTitleSpace * 0.5 ;
462465 break ;
463466 }
464-
467+
465468 imageRect.size = imageSize;
466469 imageRect.origin = imageOrigin;
467470 return imageRect;
468471}
469472
470473- (CGRect)titleRectImageAtBottomForContentRect : (CGRect)contentRect titleRect : (CGRect)titleRect imageRect : (CGRect)imageRect {
471474 CGPoint titleOrigin = titleRect.origin ;
472- CGSize titleSize = titleRect.size ;
475+ CGSize imageSize = self.currentImage .size ;
476+ CGSize titleSize = [self calculateTitleSizeForSystemTitleSize: titleRect.size];
473477
474- CGSize imageSize = imageRect.size ;
475478 // 这个if语句的含义是:计算图片由于设置了contentEdgeInsets而被压缩的高度,设置imageEdgeInsets被压缩的高度不计算在内。这样做的目的是,当设置了contentEdgeInsets时,图片可能会被压缩,此时titleLabel的y值依赖于图片压缩后的高度,当设置了imageEdgeInsets时,图片也可能被压缩,此时titleLabel的y值依赖于图片压缩前的高度,这样一来,设置imageEdgeInsets就不会对titleLabel的y值产生影响
476479 if (self.currentImage .size .height + titleSize.height > contentRect.size .height ) {
477480 imageSize.height = self.currentImage .size .height - (self.currentImage .size .height + titleSize.height - contentRect.size .height );
478481 }
479-
480- titleSize = [self calculateTitleSizeForSystemTitleSize: titleSize];
482+
481483 // titleLabel的安全宽度,因为当外界设置了titleEdgeInsets值时,系统计算出来的所有值都是在”左图右文“的基础上进行的,这个基础上可能会导致titleLabel的宽度被压缩,所以我们在此自己重新计算
482484 CGFloat titleSafeWidth = contentRect.size .width - self.titleEdgeInsets .left - self.titleEdgeInsets .right ;
483485 if (titleSize.width > titleSafeWidth) {
@@ -527,7 +529,7 @@ - (CGRect)titleRectImageAtBottomForContentRect:(CGRect)contentRect titleRect:(CG
527529 titleOrigin.y = self.contentEdgeInsets .top + self.titleEdgeInsets .top - _imageTitleSpace * 0.5 ;
528530 break ;
529531 }
530-
532+
531533 titleRect.size = titleSize;
532534 titleRect.origin = titleOrigin;
533535 return titleRect;
0 commit comments