UIButton中图片、文本的位置

2017-12-14  本文已影响32人  流光还铅华

在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; 
上一篇下一篇

猜你喜欢

热点阅读