Created
August 14, 2019 10:54
-
-
Save hanfengs/17d4b6fffd50f4ae586d0daff116a061 to your computer and use it in GitHub Desktop.
[UIButton文字和图片间距随意调整]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
UIButton category | |
-----------------------------------------.h | |
// 定义一个枚举(包含了四种类型的button) | |
typedef NS_ENUM(NSUInteger, GLButtonEdgeInsetsStyle) { | |
GLButtonEdgeInsetsStyleTop, // image在上,label在下 | |
GLButtonEdgeInsetsStyleLeft, // image在左,label在右 | |
GLButtonEdgeInsetsStyleBottom, // image在下,label在上 | |
GLButtonEdgeInsetsStyleRight // image在右,label在左 | |
}; | |
/** | |
* 设置button的titleLabel和imageView的布局样式,及间距 | |
* | |
* @param style titleLabel和imageView的布局样式 | |
* @param space titleLabel和imageView的间距 | |
*/ | |
- (void)layoutButtonWithEdgeInsetsStyle:(GLButtonEdgeInsetsStyle)style | |
imageTitleSpace:(CGFloat)space; | |
-----------------------------------------.m | |
- (void)layoutButtonWithEdgeInsetsStyle:(GLButtonEdgeInsetsStyle)style | |
imageTitleSpace:(CGFloat)space { | |
/** | |
* 知识点:titleEdgeInsets是title相对于其上下左右的inset,跟tableView的contentInset是类似的, | |
* 如果只有title,那它上下左右都是相对于button的,image也是一样; | |
* 如果同时有image和label,那这时候image的上左下是相对于button,右边是相对于label的;title的上右下是相对于button,左边是相对于image的。 | |
*/ | |
// 1. 得到imageView和titleLabel的宽、高 | |
CGFloat imageWith = self.imageView.image.size.width; | |
CGFloat imageHeight = self.imageView.image.size.height; | |
CGFloat labelWidth = 0.0; | |
CGFloat labelHeight = 0.0; | |
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) { | |
// 由于iOS8中titleLabel的size为0,用下面的这种设置 | |
labelWidth = self.titleLabel.intrinsicContentSize.width; | |
labelHeight = self.titleLabel.intrinsicContentSize.height; | |
} else { | |
labelWidth = self.titleLabel.frame.size.width; | |
labelHeight = self.titleLabel.frame.size.height; | |
} | |
// 2. 声明全局的imageEdgeInsets和labelEdgeInsets | |
UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero; | |
UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero; | |
// 3. 根据style和space得到imageEdgeInsets和labelEdgeInsets的值 | |
switch (style) { | |
case GLButtonEdgeInsetsStyleTop: | |
{ | |
imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth); | |
labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0); | |
} | |
break; | |
case GLButtonEdgeInsetsStyleLeft: | |
{ | |
imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0); | |
labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0); | |
} | |
break; | |
case GLButtonEdgeInsetsStyleBottom: | |
{ | |
imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth); | |
labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0); | |
} | |
break; | |
case GLButtonEdgeInsetsStyleRight: | |
{ | |
imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+space/2.0, 0, -labelWidth-space/2.0); | |
labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith-space/2.0, 0, imageWith+space/2.0); | |
} | |
break; | |
default: | |
break; | |
} | |
// 4. 赋值 | |
self.titleEdgeInsets = labelEdgeInsets; | |
self.imageEdgeInsets = imageEdgeInsets; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment