美文网首页iOS自定义封装控件iOS学习笔记程序员
iOS自定义按钮(btn)的图片大小和位置

iOS自定义按钮(btn)的图片大小和位置

作者: 九剑仙 | 来源:发表于2017-01-12 21:26 被阅读150次

    本文可实现完全自定义btn的图片大小!
    不知道各位小伙伴有没有碰到过这种情况,美工给了一张图片,要求放在按钮上。
    奈何图片太大,若是直接用[btn setImage:[UIImage imageNamed:@""] forState:UIControlStateNormal]方法,会导致图片超出按钮的frame;
    若是将图片重绘到指定大小,图片会变的模糊;
    又不想自定义控件,怎么办?
    有同学竟然让我去找美工重新要图,呵呵哒,我才不会让他以为我连这个小问题都解决不了。。。
    问度娘,不过这次度娘真心不给力。
    没办法,只好自定义控件了。。。
    不过,这显然不是我想要的结果,我不死心的又开始找。
    终于,在以前的一个老项目里,我找到了答案,在这里,跟大家分享下。。。
    很简单,创建UIButton的子类,重写父类的两个方法就搞定了
    下面这个demo,我把image放在了title的右侧,可以自定义image、title的大小和位置,如图:

    btn.png

    #import <UIKit/UIKit.h>
    typedef enum {
    LLButtonTypeNormal = 0, //系统默认类型
    LLButtonTypeImageRight, //图片在title右边
    }LLButtonType;
    @interface LLBaseBtn : UIButton
    + (instancetype)LL_ButtonWithType:(LLButtonType)type;
    @end

    #import "LLBaseBtn.h"
    @interface LLBaseBtn ()
    @property (nonatomic, assign) LLButtonType type;
    @end
    @implementation LLBaseBtn
    
    + (instancetype)LL_ButtonWithType:(LLButtonType)type{
    LLBaseBtn *baseBtn = [super buttonWithType:UIButtonTypeCustom];
    if (baseBtn) {
        baseBtn.type = type;
    }
    return baseBtn;
    }
    
    //重设image的frame
    - (CGRect)imageRectForContentRect:(CGRect)contentRect{
    if (self.currentImage) {
        if (_type == LLButtonTypeImageRight) {
            //实际应用中要根据情况,返回所需的frame
            return CGRectMake(110, 5, self.frame.size.height-10, self.frame.size.height-10);
        }
    }
    return [super imageRectForContentRect:contentRect];
    }
    
    //重设title的frame
    - (CGRect)titleRectForContentRect:(CGRect)contentRect{
    if (self.currentImage) {
        if (_type == LLButtonTypeImageRight) {
            //实际应用中要根据情况,返回所需的frame
            return CGRectMake(5, 5, 100, self.frame.size.height-10);
        }
    }
    return [super titleRectForContentRect:contentRect];
    }
    
    @end
    

    觉得好,请给个star,谢谢!

    相关文章

      网友评论

      本文标题:iOS自定义按钮(btn)的图片大小和位置

      本文链接:https://www.haomeiwen.com/subject/knrjbttx.html