Skip to content

Commit c69762f

Browse files
committed
Release 3.1.0
Release 3.1.0
1 parent da30412 commit c69762f

File tree

4 files changed

+41
-34
lines changed

4 files changed

+41
-34
lines changed

Demo/SPButton.xcodeproj/xcuserdata/leshengping.xcuserdatad/xcschemes/xcschememanagement.plist

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
<key>orderHint</key>
1010
<integer>0</integer>
1111
</dict>
12+
<key>SPButton.xcscheme_^#shared#^_</key>
13+
<dict>
14+
<key>orderHint</key>
15+
<integer>0</integer>
16+
</dict>
1217
</dict>
1318
</dict>
1419
</plist>

SPButton.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Pod::Spec.new do |s|
1616
#
1717

1818
s.name = "SPButton"
19-
s.version = "3.0.2"
19+
s.version = "3.1.0"
2020
s.summary = "自定义按钮."
2121

2222
# This description is used to generate tags and improve search results.

SPButton/SPButton.m

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)