喜歡交朋友的加:微信號 dwjluck2013
1.UIButton+ImageTitleSpace.h
#import <UIKit/UIKit.h> // 定義一個枚舉(包含了四種類型的button) typedef NS_ENUM(NSUInteger, MKButtonEdgeInsetsStyle) { MKButtonEdgeInsetsStyleTop, // image在上,label在下 MKButtonEdgeInsetsStyleLeft, // image在左,label在右 MKButtonEdgeInsetsStyleBottom, // image在下,label在上 MKButtonEdgeInsetsStyleRight // image在右,label在左 }; @interface UIButton (ImageTitleSpace) /** * 設置button的titleLabel和imageView的布局樣式,及間距 * * @param style titleLabel和imageView的布局樣式 * @param space titleLabel和imageView的間距 */ - (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style imageTitleSpace:(CGFloat)space; @end
2.UIButton+ImageTitleSpace.m
#import "UIButton+ImageTitleSpace.h" @implementation UIButton (ImageTitleSpace) - (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)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.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的值 /** MKButtonEdgeInsetsStyleTop, // image在上,label在下 MKButtonEdgeInsetsStyleLeft, // image在左,label在右 MKButtonEdgeInsetsStyleBottom, // image在下,label在上 MKButtonEdgeInsetsStyleRight // image在右,label在左 */ switch (style) { case MKButtonEdgeInsetsStyleTop: { imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth); labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0); } break; case MKButtonEdgeInsetsStyleLeft: { imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0); labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0); } break; case MKButtonEdgeInsetsStyleBottom: { imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth); labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0); } break; case MKButtonEdgeInsetsStyleRight: { 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; } @end
3.使用
1.導入頭文件
#import "UIButton+ImageTitleSpace.h"
2.在懶加載 按鈕中調用
// 圖片標題 - (UIButton *)imageTitleButton { if (!_imageTitleButton) { _imageTitleButton = [[UIButton alloc]initWithFrame:CGRectZero]; _imageTitleButton.backgroundColor = [UIColor blackColor]; [_imageTitleButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [_imageTitleButton setImage:[UIImage imageNamed:@"nv"] forState:UIControlStateNormal]; _imageTitleButton.titleLabel.font = [UIFont systemFontOfSize:ImageTitleButtonFontSize]; //懶加載按鈕中 調用即可 [_imageTitleButton layoutButtonWithEdgeInsetsStyle:MKButtonEdgeInsetsStyleLeft imageTitleSpace:5]; [_imageTitleButton setContentEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)]; _imageTitleButton.clipsToBounds = YES; _imageTitleButton.layer.cornerRadius = 5; _imageTitleButton.alpha = 0.5; } return _imageTitleButton; }