①创建子类继承UIButton,然后关联相应的UIButton控件
②重写initWithCoder 和 initWithFrame里面设置同样的代码,确保不管是通过代码还是xib,storyborad来创建Button都会执行
③重写titleRectForContentRect和imgeRectForContentRect
#import "MJTitleButton.h"
#import <Availability.h>
@interface MJTitleButton()
@property (nonatomic, strong) UIFont *titleFont;
@end
// initWithCoder ---> awakeFromNib
@implementation MJTitleButton
/**
* 从文件中解析一个对象的时候就会调用这个方法
*/
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super initWithCoder:decoder]) {
[self setup];
}
return self;
}
/**
* 通过代码创建控件的时候就会调用
*/
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
[self setup];
}
return self;
}
/**
* 初始化
*/
- (void)setup
{
self.titleFont = [UIFont systemFontOfSize:14];
self.titleLabel.font = self.titleFont;
// 图标居中
self.imageView.contentMode = UIViewContentModeCenter;
}
/**
* 控制器内部label的frame
* contentRect : 按钮自己的边框
*/
- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
CGFloat titleX = 0;
CGFloat titleY = 0;
NSDictionary *attrs = @{NSFontAttributeName : self.titleFont};
CGFloat titleW;
if (iOS7) {
// 只有Xcode5才会编译这段代码
#ifdef __IPHONE_7_0
titleW = [self.currentTitle boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size.width;
#else
titleW = [self.currentTitle sizeWithFont:self.titleFont].width;
#endif
} else {
titleW = [self.currentTitle sizeWithFont:self.titleFont].width;
}
CGFloat titleH = contentRect.size.height;
return CGRectMake(titleX, titleY, titleW, titleH);
}
/**
* 控制器内部imageView的frame
*/
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
CGFloat imageW = 30;
CGFloat imageX = contentRect.size.width - imageW;
CGFloat imageY = 0;
CGFloat imageH = contentRect.size.height;
return CGRectMake(imageX, imageY, imageW, imageH);
}
@end
在Button所在的控制器中,连线实现淡季事件
- (IBAction)titleClick:(UIButton *)sender {
// 1.按钮旋转
[UIView animateWithDuration:0.25 animations:^{
sender.imageView.transform = CGAffineTransformMakeRotation(-M_PI);
}];
// 2.添加uiview
UIView *temp = [[UIView alloc] init];
temp.frame = CGRectMake(10, 10, 100, 30);
temp.backgroundColor = [UIColor redColor];
[self.view addSubview:temp];
}