button图文 发表于 Oct 3 2017 Button是我们平时用的最多的控件之一,经常会遇到图片文字位置的问题,用下面的方法一行代码就可以搞定创建UIButton分类.h1234567891011121314151617181920#import <UIKit/UIKit.h>typedef NS_ENUM(NSUInteger, DCDButtonEdgeInsetsStyle) { DCDButtonEdgeInsetsStyleTop, // image在上,label在下 DCDButtonEdgeInsetsStyleLeft, // image在左,label在右 DCDButtonEdgeInsetsStyleBottom, // image在下,label在上 DCDButtonEdgeInsetsStyleRight // image在右,label在左};@interface UIButton (TitleImageSpacing)/** * 设置button的titleLabel和imageView的布局样式,及间距 * * @param style titleLabel和imageView的布局样式 * @param space titleLabel和imageView的间距 */- (void)layoutButtonWithEdgeInsetsStyle:(DCDButtonEdgeInsetsStyle)style imageTitleSpace:(CGFloat)space;@end .m12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#import "UIButton+TitleImageSpacing.h"@implementation UIButton (TitleImageSpacing)- (void)layoutButtonWithEdgeInsetsStyle:(DCDButtonEdgeInsetsStyle)style imageTitleSpace:(CGFloat)space{ // self.backgroundColor = [UIColor cyanColor]; /** * 前置知识点:titleEdgeInsets是title相对于其上下左右的inset,跟tableView的contentInset是类似的, * 如果只有title,那它上下左右都是相对于button的,image也是一样; * 如果同时有image和label,那这时候image的上左下是相对于button,右边是相对于label的;title的上右下是相对于button,左边是相对于image的。 */ // 1. 得到imageView和titleLabel的宽、高 CGFloat imageWith = self.imageView.frame.size.width; CGFloat imageHeight = self.imageView.frame.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 DCDButtonEdgeInsetsStyleTop: { imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth); labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0); } break; case DCDButtonEdgeInsetsStyleLeft: { imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0); labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0); } break; case DCDButtonEdgeInsetsStyleBottom: { imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth); labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0); } break; case DCDButtonEdgeInsetsStyleRight: { 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;} 实现12345678910111213141516for (int i = 1; i < 5; i ++) { UIButton *goBtn = [[UIButton alloc] initWithFrame:CGRectMake(100, 150 * i , 200, 100)]; goBtn.backgroundColor = [UIColor redColor]; [goBtn setTitle:@"👆微信好友👆" forState:UIControlStateNormal]; [goBtn setImage:[UIImage imageNamed:@"img_wechat"] forState:UIControlStateNormal]; if (i == 1) { [goBtn layoutButtonWithEdgeInsetsStyle:DCDButtonEdgeInsetsStyleTop imageTitleSpace:10]; }else if (i == 2){ [goBtn layoutButtonWithEdgeInsetsStyle:DCDButtonEdgeInsetsStyleLeft imageTitleSpace:10]; }else if (i == 3){ [goBtn layoutButtonWithEdgeInsetsStyle:DCDButtonEdgeInsetsStyleBottom imageTitleSpace:10]; }else if (i == 4){ [goBtn layoutButtonWithEdgeInsetsStyle:DCDButtonEdgeInsetsStyleRight imageTitleSpace:10]; } [self.view addSubview:goBtn]; } 效果图