Files
featherVoice/QXLive/Tools/Category/UIButton+QX.m

128 lines
5.9 KiB
Mathematica
Raw Normal View History

2025-08-08 10:49:36 +08:00
//
// UIButton+QX.m
// QXLive
//
// Created by on 2025/4/28.
//
#import "UIButton+QX.h"
@implementation UIButton (QX)
- (void)qx_layoutButtonWithEdgeInsetsStyle:(QXButtonEdgeInsetsStyle)style
imageTitleSpace:(CGFloat)space{
[self sizeToFit];
[self qx_layoutButtonNOSizeToFitWithEdgeInsetsStyle:style imageTitleSpace:space];
}
- (void)qx_layoutButtonNOSizeToFitWithEdgeInsetsStyle:(QXButtonEdgeInsetsStyle)style
imageTitleSpace:(CGFloat)space {
/**
* titleEdgeInsetstitleinsettableViewcontentInset
* titlebuttonimage
* imagelabelimagebuttonlabeltitlebuttonimage
*/
CGFloat spacef = ceilf(space);
// 1.imageViewtitleLabel
CGFloat imageWidth = self.imageView.frame.size.width;
CGFloat imageHeight = self.imageView.frame.size.height;
CGFloat labelWidth = 0.0;
CGFloat labelHeight = 0.0;
if (@available(iOS 8.0, *)) {
// iOS8titleLabelsize0
labelWidth = self.titleLabel.intrinsicContentSize.width;
labelHeight = self.titleLabel.intrinsicContentSize.height;
}else {
labelWidth = self.titleLabel.frame.size.width;
labelHeight = self.titleLabel.frame.size.height;
}
// 2.imageEdgeInsetslabelEdgeInsets
UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;
UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;
UIEdgeInsets contentEdgeInsets = UIEdgeInsetsZero;
CGFloat imageOffSetX = labelWidth / 2.0;
CGFloat labelOffSetX = imageWidth / 2.0;
CGFloat maxWidth = MAX(imageWidth,labelWidth); //
CGFloat changeWidth = imageWidth + labelWidth - maxWidth; //
CGFloat maxHeight = MAX(imageHeight,labelHeight); //
// 3.stylespacefimageEdgeInsetslabelEdgeInsets
switch (style) {
case QXButtonEdgeInsetsStyleTop:
{
CGFloat gap = (maxHeight - MIN(imageHeight, labelHeight))/2.0;
if (imageHeight >= labelHeight) {
imageEdgeInsets = UIEdgeInsetsMake(0, imageOffSetX, 0, -imageOffSetX);
labelEdgeInsets = UIEdgeInsetsMake(labelHeight + gap + spacef, -labelOffSetX, -(labelHeight + gap + spacef), labelOffSetX);
contentEdgeInsets = UIEdgeInsetsMake(0, - changeWidth / 2.0, spacef + labelHeight, -changeWidth / 2.0);
}else{
imageEdgeInsets = UIEdgeInsetsMake(-(gap + imageHeight + spacef), imageOffSetX, gap + imageHeight + spacef, -imageOffSetX);
labelEdgeInsets = UIEdgeInsetsMake(0, -labelOffSetX, 0, labelOffSetX);
contentEdgeInsets = UIEdgeInsetsMake(spacef + imageHeight, - changeWidth / 2.0, 0, -changeWidth / 2.0);
}
}
break;
case QXButtonEdgeInsetsStyleLeft:
{
imageEdgeInsets = UIEdgeInsetsMake(0, -spacef/2.0, 0, spacef/2.0);
labelEdgeInsets = UIEdgeInsetsMake(0, spacef/2.0, 0, -spacef/2.0);
contentEdgeInsets = UIEdgeInsetsMake(0, spacef/2.0, 0, spacef/2.0);
}
break;
case QXButtonEdgeInsetsStyleBottom:
{
CGFloat gap = (maxHeight - MIN(imageHeight, labelHeight))/2.0;
if (imageHeight >= labelHeight) {
imageEdgeInsets = UIEdgeInsetsMake(0,
imageOffSetX,
0,
-imageOffSetX);
labelEdgeInsets = UIEdgeInsetsMake(-(labelHeight + gap + spacef),
-labelOffSetX,
labelHeight + gap + spacef,
labelOffSetX);
contentEdgeInsets = UIEdgeInsetsMake(spacef + labelHeight,
- changeWidth / 2.0,
0,
-changeWidth / 2.0);
}else{
imageEdgeInsets = UIEdgeInsetsMake(gap + imageHeight + spacef,
imageOffSetX,
-(gap + imageHeight + spacef),
-imageOffSetX);
labelEdgeInsets = UIEdgeInsetsMake(0,
-labelOffSetX,
0,
labelOffSetX);
contentEdgeInsets = UIEdgeInsetsMake(0,
- changeWidth / 2.0,
spacef + imageHeight,
-changeWidth / 2.0);
}
}
break;
case QXButtonEdgeInsetsStyleRight:
{
imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+spacef/2.0, 0, -labelWidth-spacef/2.0);
labelEdgeInsets = UIEdgeInsetsMake(0, -imageWidth-spacef/2.0, 0, imageWidth+spacef/2.0);
contentEdgeInsets = UIEdgeInsetsMake(0, spacef/2.0, 0, spacef/2.0);
}
break;
default:
break;
}
// 4.
self.titleEdgeInsets = labelEdgeInsets;
self.imageEdgeInsets = imageEdgeInsets;
self.contentEdgeInsets = contentEdgeInsets;
}
@end