自定义UIButton 实现图片和文字 之间距离和不同样式
Posted 宁静暖风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义UIButton 实现图片和文字 之间距离和不同样式相关的知识,希望对你有一定的参考价值。
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; }
以上是关于自定义UIButton 实现图片和文字 之间距离和不同样式的主要内容,如果未能解决你的问题,请参考以下文章