①创建子类继承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];
- }