@@ -120,7 +120,7 @@ - (void)sizeToFit {
120
120
default :
121
121
break ;
122
122
}
123
-
123
+
124
124
self.frame = myFrame;
125
125
}
126
126
@@ -178,7 +178,7 @@ - (CGRect)titleRectImageAtLeftForContentRect:(CGRect)contentRect titleRect:(CGRe
178
178
default : // 剩下的就是右对齐,右对齐titleLabel不用做任何改变
179
179
break ;
180
180
}
181
-
181
+
182
182
titleRect.size = titleSize;
183
183
titleRect.origin = titleOrigin;
184
184
return titleRect;
@@ -196,15 +196,15 @@ - (CGRect)imageRectImageAtRightForContentRect:(CGRect)contentRect imageRect:(CGR
196
196
CGPoint imageOrigin = imageRect.origin ;
197
197
CGSize imageSize = imageRect.size ;
198
198
CGSize titleSize = titleRect.size ;
199
-
199
+
200
200
// 这里水平中心对齐,跟图片在右边时的中心对齐时差别在于:图片在右边时中心对齐考虑了titleLabel+imageView这个整体,而这里只单独考虑imageView
201
201
if (imageSize.width + titleSize.width > imageSafeWidth) {
202
202
imageSize.width = imageSize.width - (imageSize.width + titleSize.width - imageSafeWidth);
203
203
}
204
204
205
205
CGFloat buttonWidth = contentRect.size .width + self.contentEdgeInsets .left + self.contentEdgeInsets .right ;
206
206
titleSize = [self calculateTitleSizeForSystemTitleSize: titleSize];
207
-
207
+
208
208
switch (self.contentHorizontalAlignment ) {
209
209
case UIControlContentHorizontalAlignmentCenter: // 中心对齐
210
210
// (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
233
233
CGPoint titleOrigin = titleRect.origin ;
234
234
CGSize titleSize = titleRect.size ;
235
235
CGSize imageSize = imageRect.size ;
236
-
236
+
237
237
CGFloat buttonWidth = contentRect.size .width + self.contentEdgeInsets .left + self.contentEdgeInsets .right ;
238
-
238
+
239
239
switch (self.contentHorizontalAlignment ) {
240
240
case UIControlContentHorizontalAlignmentCenter: // 中心对齐
241
241
// (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
263
263
264
264
- (CGRect)imageRectImageAtTopForContentRect : (CGRect)contentRect imageRect : (CGRect)imageRect titleRect : (CGRect)titleRect {
265
265
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
+
269
269
CGFloat imageSafeWidth = contentRect.size .width - self.imageEdgeInsets .left - self.imageEdgeInsets .right ;
270
+ CGFloat imageSafeHeight = contentRect.size .height - self.imageEdgeInsets .top - self.imageEdgeInsets .bottom ;
270
271
271
272
// 这里水平中心对齐,跟图片在右边时的中心对齐时差别在于:图片在右边时中心对齐考虑了titleLabel+imageView这个整体,而这里只单独考虑imageView
272
273
if (imageSize.width > imageSafeWidth) {
273
274
imageSize.width = imageSafeWidth;
274
275
}
276
+ if (imageSize.height > imageSafeHeight) {
277
+ imageSize.height = imageSafeHeight;
278
+ }
275
279
276
280
CGFloat buttonWidth = contentRect.size .width + self.contentEdgeInsets .left + self.contentEdgeInsets .right ;
277
281
CGFloat buttonHeight = contentRect.size .height + self.contentEdgeInsets .top + self.contentEdgeInsets .bottom ;
278
-
282
+
279
283
// 水平方向
280
284
switch (self.contentHorizontalAlignment ) {
281
285
case UIControlContentHorizontalAlignmentCenter: {// 中心对齐
@@ -299,14 +303,12 @@ - (CGRect)imageRectImageAtTopForContentRect:(CGRect)contentRect imageRect:(CGRec
299
303
// 给图片高度作最大限制,超出限制对高度进行压缩,这样还可以保证titeLabel不会超出其有效区域
300
304
CGFloat imageTitleLimitMaxH = contentRect.size .height - self.imageEdgeInsets .top - self.imageEdgeInsets .bottom ;
301
305
if (imageSize.height < imageTitleLimitMaxH) {
302
- if (titleSize.height + self. currentImage . size .height > imageTitleLimitMaxH) {
306
+ if (titleSize.height + imageSize .height > imageTitleLimitMaxH) {
303
307
CGFloat beyondValue = titleSize.height + self.currentImage .size .height - imageTitleLimitMaxH;
304
308
imageSize.height = imageSize.height - beyondValue;
305
309
}
306
- // 之所以采用自己计算的结果,是因为当sizeToFit且titleLabel的numberOfLines > 0时,系统内部会按照2行计算
307
- titleSize = [self calculateTitleSizeForSystemTitleSize: titleSize];
308
310
}
309
-
311
+
310
312
// 垂直方向
311
313
switch (self.contentVerticalAlignment ) {
312
314
case UIControlContentVerticalAlignmentCenter: // 中心对齐
@@ -331,28 +333,26 @@ - (CGRect)imageRectImageAtTopForContentRect:(CGRect)contentRect imageRect:(CGRec
331
333
332
334
- (CGRect)titleRectImageAtTopForContentRect : (CGRect)contentRect titleRect : (CGRect)titleRect imageRect : (CGRect)imageRect {
333
335
CGPoint titleOrigin = titleRect.origin ;
334
- CGSize titleSize = titleRect.size ;
336
+ CGSize imageSize = self.currentImage .size ;
337
+ CGSize titleSize = [self calculateTitleSizeForSystemTitleSize: titleRect.size];
335
338
336
339
CGFloat buttonWidth = contentRect.size .width + self.contentEdgeInsets .left + self.contentEdgeInsets .right ;
337
340
CGFloat buttonHeight = contentRect.size .height + self.contentEdgeInsets .top + self.contentEdgeInsets .bottom ;
338
341
339
- CGSize imageSize = imageRect.size ;
340
342
// 这个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 ) {
342
344
imageSize.height = self.currentImage .size .height - (self.currentImage .size .height + titleSize.height - contentRect.size .height );
343
345
}
344
-
345
- titleSize = [self calculateTitleSizeForSystemTitleSize: titleSize];
346
346
// titleLabel的安全宽度,这里一定要改变宽度值,因为当外界设置了titleEdgeInsets值时,系统计算出来的所有值都是在”左图右文“的基础上进行的,这个基础上可能会导致titleLabel的宽度被压缩,所以我们在此自己重新计算
347
347
CGFloat titleSafeWidth = contentRect.size .width - self.titleEdgeInsets .left - self.titleEdgeInsets .right ;
348
348
if (titleSize.width > titleSafeWidth) {
349
349
titleSize.width = titleSafeWidth;
350
350
}
351
-
351
+
352
352
// 水平方向
353
353
switch (self.contentHorizontalAlignment ) {
354
354
case UIControlContentHorizontalAlignmentCenter: {// 中心对齐
355
-
355
+
356
356
titleOrigin.x = (titleSafeWidth - titleSize.width ) / 2.0 + self.contentEdgeInsets .left + self.titleEdgeInsets .left ;
357
357
}
358
358
break ;
@@ -391,7 +391,7 @@ - (CGRect)titleRectImageAtTopForContentRect:(CGRect)contentRect titleRect:(CGRec
391
391
titleOrigin.y = buttonHeight - titleSize.height - self.contentEdgeInsets .bottom - self.titleEdgeInsets .bottom + _imageTitleSpace * 0.5 ;
392
392
break ;
393
393
}
394
-
394
+
395
395
titleRect.size = titleSize;
396
396
titleRect.origin = titleOrigin;
397
397
return titleRect;
@@ -401,14 +401,19 @@ - (CGRect)titleRectImageAtTopForContentRect:(CGRect)contentRect titleRect:(CGRec
401
401
402
402
- (CGRect)imageRectImageAtBottomForContentRect : (CGRect)contentRect imageRect : (CGRect)imageRect titleRect : (CGRect)titleRect {
403
403
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] ;
406
406
407
407
CGFloat imageSafeWidth = contentRect.size .width - self.imageEdgeInsets .left - self.imageEdgeInsets .right ;
408
+ CGFloat imageSafeHeight = contentRect.size .height - self.imageEdgeInsets .top - self.imageEdgeInsets .bottom ;
409
+
408
410
// 这里水平中心对齐,跟图片在右边时的中心对齐时差别在于:图片在右边时中心对齐考虑了titleLabel+imageView这个整体,而这里只单独考虑imageView
409
411
if (imageSize.width > imageSafeWidth) {
410
412
imageSize.width = imageSafeWidth;
411
413
}
414
+ if (imageSize.height > imageSafeHeight) {
415
+ imageSize.height = imageSafeHeight;
416
+ }
412
417
413
418
CGFloat buttonWidth = contentRect.size .width + self.contentEdgeInsets .left + self.contentEdgeInsets .right ;
414
419
CGFloat buttonHeight = contentRect.size .height + self.contentEdgeInsets .top + self.contentEdgeInsets .bottom ;
@@ -436,12 +441,10 @@ - (CGRect)imageRectImageAtBottomForContentRect:(CGRect)contentRect imageRect:(CG
436
441
// 给图片高度作最大限制,超出限制对高度进行压缩,这样还可以保证titeLabel不会超出其有效区域
437
442
CGFloat imageTitleLimitMaxH = contentRect.size .height - self.imageEdgeInsets .top - self.imageEdgeInsets .bottom ;
438
443
if (imageSize.height < imageTitleLimitMaxH) {
439
- if (titleSize.height + self. currentImage . size .height > imageTitleLimitMaxH) {
444
+ if (titleSize.height + imageSize .height > imageTitleLimitMaxH) {
440
445
CGFloat beyondValue = titleSize.height + self.currentImage .size .height - imageTitleLimitMaxH;
441
446
imageSize.height = imageSize.height - beyondValue;
442
447
}
443
- // 之所以采用自己计算的结果,是因为当sizeToFit且titleLabel的numberOfLines > 0时,系统内部会按照2行计算
444
- titleSize = [self calculateTitleSizeForSystemTitleSize: titleSize];
445
448
}
446
449
// 垂直方向
447
450
switch (self.contentVerticalAlignment ) {
@@ -461,23 +464,22 @@ - (CGRect)imageRectImageAtBottomForContentRect:(CGRect)contentRect imageRect:(CG
461
464
imageOrigin.y = buttonHeight - imageSize.height - self.contentEdgeInsets .bottom - self.imageEdgeInsets .bottom + _imageTitleSpace * 0.5 ;
462
465
break ;
463
466
}
464
-
467
+
465
468
imageRect.size = imageSize;
466
469
imageRect.origin = imageOrigin;
467
470
return imageRect;
468
471
}
469
472
470
473
- (CGRect)titleRectImageAtBottomForContentRect : (CGRect)contentRect titleRect : (CGRect)titleRect imageRect : (CGRect)imageRect {
471
474
CGPoint titleOrigin = titleRect.origin ;
472
- CGSize titleSize = titleRect.size ;
475
+ CGSize imageSize = self.currentImage .size ;
476
+ CGSize titleSize = [self calculateTitleSizeForSystemTitleSize: titleRect.size];
473
477
474
- CGSize imageSize = imageRect.size ;
475
478
// 这个if语句的含义是:计算图片由于设置了contentEdgeInsets而被压缩的高度,设置imageEdgeInsets被压缩的高度不计算在内。这样做的目的是,当设置了contentEdgeInsets时,图片可能会被压缩,此时titleLabel的y值依赖于图片压缩后的高度,当设置了imageEdgeInsets时,图片也可能被压缩,此时titleLabel的y值依赖于图片压缩前的高度,这样一来,设置imageEdgeInsets就不会对titleLabel的y值产生影响
476
479
if (self.currentImage .size .height + titleSize.height > contentRect.size .height ) {
477
480
imageSize.height = self.currentImage .size .height - (self.currentImage .size .height + titleSize.height - contentRect.size .height );
478
481
}
479
-
480
- titleSize = [self calculateTitleSizeForSystemTitleSize: titleSize];
482
+
481
483
// titleLabel的安全宽度,因为当外界设置了titleEdgeInsets值时,系统计算出来的所有值都是在”左图右文“的基础上进行的,这个基础上可能会导致titleLabel的宽度被压缩,所以我们在此自己重新计算
482
484
CGFloat titleSafeWidth = contentRect.size .width - self.titleEdgeInsets .left - self.titleEdgeInsets .right ;
483
485
if (titleSize.width > titleSafeWidth) {
@@ -527,7 +529,7 @@ - (CGRect)titleRectImageAtBottomForContentRect:(CGRect)contentRect titleRect:(CG
527
529
titleOrigin.y = self.contentEdgeInsets .top + self.titleEdgeInsets .top - _imageTitleSpace * 0.5 ;
528
530
break ;
529
531
}
530
-
532
+
531
533
titleRect.size = titleSize;
532
534
titleRect.origin = titleOrigin;
533
535
return titleRect;
0 commit comments