自定义按钮 图片标题位置随意放置

栏目: IOS · 发布时间: 6年前

#图标和文字在一起是开发难免的问题,系统的按钮默认是图片居左的文字居右的,
且图片和文字的距离不好调整,图片的位置更是让人头疼,
故在闲暇之余封装了一个控件。
复制代码

所用到知识的

# 1、苹果系统自带的自动布局,减少第三方的依赖
# 2、kvo监听UIControl的状态
# 3、富文本的使用,如何更新约束,如何获取一段文字的宽高

复制代码

先看看效果

自定义按钮 图片标题位置随意放置

拥有功能

1、任意调整图片和文字的间距。
2、图片的位置可以放置在上下左右不同位置。
3、支持富文本,自定义布局,高亮和选中状态。
复制代码

如何使用

/**
 自定义按钮初始化方法

 @param image 默认的图片
 @param title 标题
 @param titleFond 标题大小
 @param imageMargin 标题与图标的距离
 @param imageAlignmentTYpe 图片的显示类型
 @return 自定义按钮的实例
 */
- (instancetype)initWithImage:(UIImage  *) image
                        title:(NSString *) title
                    titleFond:(UIFont *)   titleFond
                  imageMargin:(CGFloat)    imageMargin
           imageAlignmentTYpe:(MyButtonImageAlignmentTYpe )imageAlignmentTYpe;
   
   _myButton = [[MyButton alloc]initWithImage:[UIImage imageNamed:@"cache_pause"]
                                             title:@"来点我啊"
                                         titleFond:[UIFont systemFontOfSize:14]
                                       imageMargin:10
                                imageAlignmentTYpe:MyButtonImageAlignmentLeft];
                                
    [self.view addSubview:_myButton];
    self.myButton.frame = CGRectMake(20, 100, 120, 40);
    self.myButton.backgroundColor = UIColor.grayColor;
    [self.myButton setImage:[UIImage imageNamed:@"cache_delete"] withState:UIControlStateSelected];
    [self.myButton setImage:[UIImage imageNamed:@"cache_pause"] withState:UIControlStateHighlighted];
    [self.myButton setTitle:@"选中了" withState:UIControlStateSelected];
    [self.myButton setTitle:@"正在按下..." withState:UIControlStateHighlighted];
    [self.myButton setTitleColor:UIColor.blueColor withState:UIControlStateSelected];
    [self.myButton setTitleColor:UIColor.yellowColor withState:UIControlStateHighlighted];
  这样就可以了,和普通的按钮用法一样。
   
复制代码

关键代码

1、自定义布局(只列出了一种)
//图片居左
- (void)setImageLeftLayoutConstraint {
    CGFloat imageWidth  = self.normalImage.size.width;
    CGFloat titleWidth = [self sizeWithText:self.titleLabel.text font:self.titleLabel.font].width;
    CGFloat imageCenterXMargin = (imageWidth /2.0 - (imageWidth + titleWidth + self.imageMargin) / 2.0);
    //创建Image约束
    NSLayoutConstraint *imageCenterYLc = [NSLayoutConstraint constraintWithItem:self.imageView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0];
    NSLayoutConstraint *imageCenterXLc = [NSLayoutConstraint constraintWithItem:self.imageView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:imageCenterXMargin];
    [self addConstraints:@[imageCenterYLc,imageCenterXLc]];
    //创建title约束
    NSLayoutConstraint *titleCenterYLc = [NSLayoutConstraint constraintWithItem:self.titleLabel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0];
    NSLayoutConstraint *titleLeftLc = [NSLayoutConstraint constraintWithItem:self.titleLabel attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.imageView attribute:NSLayoutAttributeRight multiplier:1.0 constant:self.imageMargin];
     [self addConstraints:@[titleCenterYLc,titleLeftLc]];
}

//获取文字的宽高
- (CGSize)sizeWithText:(NSString *)text font:(UIFont *)font {
    NSDictionary *attrs = @{NSFontAttributeName : font};
    return [text boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
}

//kvo监听
- (void)addObserver {
    [self addObserver:self
           forKeyPath:@"enabled"
              options: NSKeyValueObservingOptionNew
              context:nil];
    [self addObserver:self
           forKeyPath:@"selected"
              options: NSKeyValueObservingOptionNew
              context:nil];
    [self addObserver:self
           forKeyPath:@"highlighted"
              options: NSKeyValueObservingOptionNew
              context:nil];
    [self.titleLabel addObserver:self
                      forKeyPath:@"text"
                         options:NSKeyValueObservingOptionNew
                         context:nil];
}

//kvo 监听处理(只列出了部分)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
   if ([keyPath isEqualToString:@"selected"]) {
        if(self.selected) {
            self.imageView.image           = self.selectedImage ? self.selectedImage : self.normalImage;
            self.backgroundColor           = self.selectedBackgroundColor  ? self.selectedBackgroundColor : self.normalBackgroundColor;
            if (!self.selectedTitleAttribute && !self.normalTitleAttribute) {
                self.titleLabel.text       = self.selectedTitle ? self.selectedTitle : self.normalTitle;
                self.titleLabel.textColor  = self.selectedTitleColor ? self.selectedTitleColor : self.normalTitleColor;
                return;
            }
            self.titleLabel.attributedText = self.selectedTitleAttribute ? self.selectedTitleAttribute : self.normalTitleAttribute;
        } else {
            self.imageView.image           = self.normalImage;
            self.backgroundColor           = self.normalBackgroundColor;
            if (!self.normalTitleAttribute) {
                self.titleLabel.text       = self.normalTitle;
                self.titleLabel.textColor  = self.normalTitleColor;
                return;
            }
            self.titleLabel.attributedText = self.normalTitleAttribute;
        }
    } 
    //监听到字体变化,更新自动布局
    if ([keyPath isEqualToString:@"text"]) {
        [self removeConstraints:self.constraints];
        [self.superview layoutIfNeeded];
        [self updateConstraints:self.imageAlignmentTYpe];
        [self.superview layoutIfNeeded];
    }
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Algorithms on Strings, Trees and Sequences

Algorithms on Strings, Trees and Sequences

Dan Gusfield / Cambridge University Press / 1997-5-28 / USD 99.99

String algorithms are a traditional area of study in computer science. In recent years their importance has grown dramatically with the huge increase of electronically stored text and of molecular seq......一起来看看 《Algorithms on Strings, Trees and Sequences》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具