本文主要是自定义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 {
}
这样即可取消按钮的高亮状态。