在ios开发中UIButton是个很常用的控件。我们常常会遇到这样的需求,在一个按钮里面需要有文字和图片。如图:
添加按钮.png我们有三种方式可以实现:
1、UIButton自带属性imageEdgeInsets、titleEdgeInsets实现
2、其它控件组合实现
3、重写UIButton
第1,2两种实现方法大家都比较常用,我们主要讲第3种实现。
上代码:
h文件
#import <UIKit/UIKit.h>
@interface ZKButton : UIButton
@property (nonatomic,assign)CGRect imageFrame;
@property (nonatomic,assign)CGRect titleFrame;
-(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)UIControlState;
@end
m文件
#import "ZKButton.h"
@interface ZKButton ()
@property (nonatomic,strong)UIColor* hColor;
@property (nonatomic,strong)UIColor* nColor;
@end
@implementation ZKButton
-(instancetype)init{
self = [super init];
if (self) {
[self addObserver:self forKeyPath:@"highlighted" options:NSKeyValueObservingOptionNew context:nil];
}
return self;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
UIButton *button = (UIButton *)object;
if ([keyPath isEqualToString:@"highlighted"]) {
if (button.highlighted) {
if (self.hColor) {
[button setBackgroundColor:self.hColor];
}
return;
}
if (self.nColor) {
[button setBackgroundColor:self.nColor];
}
}
}
-(void)dealloc{
[self removeObserver:self forKeyPath:@"highlighted"];
}
-(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)UIControlState{
if (UIControlState == UIControlStateNormal ) {
[self setBackgroundColor:backgroundColor];
self.nColor = backgroundColor;
}
if (UIControlState == UIControlStateHighlighted) {
self.hColor = backgroundColor;
}
}
-(void)setImageFrame:(CGRect)imageFrame{
_imageFrame = imageFrame;
}
-(void)setTitleFrame:(CGRect)titleFrame{
_titleFrame = titleFrame;
}
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
if (self.imageFrame.size.width>0&&self.imageFrame.size.height>0) {
return self.imageFrame;//图片的位置大小
}else{
return [super imageRectForContentRect:contentRect];
}
}
-(CGRect)titleRectForContentRect:(CGRect)contentRect
{
ZKLog(@"%@",NSStringFromCGRect(contentRect));
if (self.titleFrame.size.width>0&&self.titleFrame.size.height>0) {
return self.titleFrame;//文本的位置大小
}else{
return [super titleRectForContentRect:contentRect];
}
}
@end
主要方法
//重写系统方法控制图片位置
- (CGRect)imageRectForContentRect:(CGRect)contentRect;
//重写系统方法控制文本位置
- (CGRect)titleRectForContentRect:(CGRect)contentRect;
功能和使用
1、设置imageFrame以控制图片位置
2、设置titleFrame以控制文本位置
3、设置高亮状态时的背景颜色
//设置高亮状态时的背景颜色
-(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)UIControlState;
网友评论