iOS开发之UIButton

本文主要是自定义UIButton,调整UIButton内部的文字和图标的位置(交换按钮和图标的位置)

新建一个继承自UIButton的类,在.m文件中实现UIButton自带的两个方法:titleRectForContentRect:和imageRectForContentRect:

来看一下正常的按钮样式:


下面开始自定义:

/**
 *  计算按钮文字的位置和尺寸
 */
- (CGRect)titleRectForContentRect:(CGRect)contentRect {
    
    CGFloat titleX = 0;// 文字的x坐标为0
    CGFloat titleY = 0;// 文字的y坐标为0
    CGFloat titleH = contentRect.size.height;// 文字的高度就等于按钮的高度
    // 根据文字计算文字的宽度
    NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
    attrs[NSFontAttributeName] = [UIFont systemFontOfSize:16.0];// 字体
    CGFloat titleW = [self.currentTitle boundingRectWithSize:CGSizeMake(MAXFLOAT, titleH) options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size.width;// iOS7之后
    return CGRectMake(titleX, titleY, titleW, titleH);
}

/**
 *  计算按钮图标的位置和尺寸
 */
- (CGRect)imageRectForContentRect:(CGRect)contentRect {
    
    // 图标的宽度
    CGFloat imageH = contentRect.size.height;// 图标的高度就等于按钮的高度
    CGFloat imageW = imageH;
    CGFloat imageX = contentRect.size.width - imageH;// 图标的x坐标
    CGFloat imageY = 0;// 图标的y坐标为0
    
    return CGRectMake(imageX, imageY, imageW, imageH);
    
}
接下来就是根据需要对按钮内部的文字和图标进行微调

// 如果按钮是从xib文件中加载的
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self setup];
    }
    return self;
}

// 如果是用代码创建按钮
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}
/**
 *  初始化方法
 */
- (void)setup {
    // 设置图片居中
    self.imageView.contentMode = UIViewContentModeCenter;
    
    // 按钮文字的字体一定要和计算的时候相同
    self.titleLabel.font = [UIFont systemFontOfSize:16.0];
    
    // 高亮时不需要调整图片
    self.adjustsImageWhenHighlighted = NO;

}
运行之后按钮就变成这样的了:


这样的按钮通常情况下都是显示在导航栏的标题中。

按钮的高亮状态会让按钮变的灰灰的,有时候我们需要取消按钮的高亮状态,这个时候我们需要重写setHighlighted:方法来覆盖父方法。

// 重写方法,覆盖父方法,取消按钮的高亮状态
- (void)setHighlighted:(BOOL)highlighted {
    
}
这样即可取消按钮的高亮状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值