在IOS开发的过程中经常会遇到需要在button中既放置图片和文字,系统默认会将图片居左,文字居右; 但我们也常常会遇到 图片居上文字居下 或者图片居右文字居左的需求,网上也有很多方法来实现这样的需求, 无非是以下几种方式:
1. 设置imageEdgeInsets,titleEdgeInsets,调整图片跟文字的大小;
2. 写一个类继承 UIButton,在这个类里设置 它 imageView 跟 titleLabel 的frame;
3. 写一个自定义控件, button 上添加一个图片,一个label;
第一种方式,固然能实现需求,但是我们还是得计算 图片跟 文字的偏移量,当文字长短发生变化,图片大小发生变化或 通过网络加载的图片,无法固定图片位置的时候,我们又有一大堆的坑要填
第二种第三种 都需要自定义控件,我就不再多说了,我不喜欢这种方式
下面来看看我怎么简单实现Button 图片跟文字的任意布局的把。
我选择使用Category ,直接使用Button自带的titleLabel和imageView 来设置label和image的排列方式
.h 文件
#import <UIKit/UIKit.h>
typedef enum : NSUInteger {
ButtonImgViewStyleTop,
ButtonImgViewStyleLeft,
ButtonImgViewStyleBottom,
ButtonImgViewStyleRight,
} ButtonImgViewStyle;
@interface UIButton (Extensions)
/**
设置 按钮 图片所在的位置
@param style 图片位置类型(上、左、下、右)
@param size 图片的大小
@param space 图片跟文字间的间距
*/
- (void)setImgViewStyle:(ButtonImgViewStyle)style imageSize:(CGSize)size space:(CGFloat)space;
@end
.m 实现
#import "UIButton+Extensions.h"
#import <objc/runtime.h>
static const char Btn_ImgViewStyle_Key;
static const char Btn_ImgSize_key;
static const char Btn_ImgSpace_key;
@implementation UIButton (Extensions)
- (void)setImgViewStyle:(ButtonImgViewStyle)style imageSize:(CGSize)size space:(CGFloat)space
{
objc_setAssociatedObject(self, &Btn_ImgViewStyle_Key, @(style), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_setAssociatedObject(self, &Btn_ImgSpace_key, @(space), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_setAssociatedObject(self, &Btn_ImgSize_key, NSStringFromCGSize(size), OBJC_ASSOCIATION_COPY_NONATOMIC);
}
+ (void)load
{
Method m1 = class_getInstanceMethod([self class],