IOS 利用 runtime 实现UIButton图片在上和文字在下

在IOS开发的过程中经常会遇到需要在button中既放置图片和文字,系统默认会将图片居左,文字居右; 但我们也常常会遇到 图片居上文字居下 或者图片居右文字居左的需求;网上也有很多方法来实现这样的需求, 但我在使用的过程中,也还是会有各种各样的问题,所以我也尝试着用一种方式来避免我所遇到的各种各样的问题!
摘要由CSDN通过智能技术生成

在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],
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值