zoukankan      html  css  js  c++  java
  • 自定义button

    1、何为自定义button?

      顾名思义会想到DIY,自然是系统提供的button不能够满足我的需求就需要自己DIY一个适用的button;

      比如我项目中遇到的需求:

      (这种图片在上文字在下的,系统自然不能满足,这就需要自己写一个button)

    2、自定义button的思路?

      根据需求,不同之处在于button中的image和title位置的变化;所以需要重写UIButton;

      首先需要重写两个方法:

    -(instancetype)initWithCoder:(NSCoder *)aDecoder;
    -(instancetype)initWithFrame:(CGRect)frame;

      重写这两个方法可以确保代码创建与XIB两种方式都可实现。

      然后需要重写UIButton中的两个布局方法:

    -(CGRect)imageRectForContentRect:(CGRect)contentRect;
    -(CGRect)titleRectForContentRect:(CGRect)contentRect;

      以上只是大体思路,下面我会贴出具体实现的方法并作出解释;

    3、自定义button的具体实现?

      既然是模仿UIbutton那么创建一个继承自UIbutton的类自不多说;

      实现代码都封装在.m文件中没必要暴漏,所以.h文件中没什么可说的;

      以下是.m文件中的具体实现:

    @interface Kaka_Button ()
    
    @property (nonatomic,strong) UIFont *myFont;
    
    @end
    
    @implementation Kaka_Button
    
    #pragma mark - 重写button创建方法
    
    -(instancetype)initWithCoder:(NSCoder *)aDecoder{
        if (self = [super initWithCoder:aDecoder]) {
            [self setup];
        }
        return self;
    }
    
    -(instancetype)initWithFrame:(CGRect)frame{
        if (self = [super initWithFrame:frame]) {
            [self setup];
        }
        return self;
    }
    
    -(void)setup{
        //设置文字字体
        self.myFont = [UIFont systemFontOfSize:15.0];
        self.titleLabel.font = self.myFont;
    }
    
    #pragma mark - 重写button内容布局方法
    
    -(CGRect)imageRectForContentRect:(CGRect)contentRect{
        //获取文字
        NSString *title = self.currentTitle;
        
        //文字高度
        CGFloat titleH = [self getRectWithTitle:title].size.height;
    //    NSLog(@"titleH = %f", titleH);
        
        //image的x、y、w、h
        CGFloat imageH = (contentRect.size.height)/2;
        CGFloat imageW = imageH;
        CGFloat imageX = (contentRect.size.width - imageW) / 2;
        CGFloat imageY = (contentRect.size.height - imageH - titleH - PADDING) / 2;
        
        return CGRectMake(imageX, imageY, imageW, imageH);
    }
    
    -(CGRect)titleRectForContentRect:(CGRect)contentRect{
        //获取文字
        NSString *title = self.currentTitle;
        
        //文字的Rect
        CGRect titleRect = [self getRectWithTitle:title];
        
        //btn的高
        CGFloat btnH = contentRect.size.height;
        
        //title的x、y、h
        CGFloat titleW = titleRect.size.width;
        CGFloat titleH = titleRect.size.height;
        CGFloat titleX = (contentRect.size.width - titleW)/2;
        CGFloat titleY = (btnH*1.5 - titleH + PADDING) / 2;   //此行代码是相加减后的数学公式,不用纠结!
        
        return CGRectMake(titleX, titleY, titleW, titleH);
    }
    
    
    #pragma mark - 获取文字Rect
    
    -(CGRect)getRectWithTitle:(NSString *)title{
        //NSLog(@"title = %@", title);
        
        CGSize maxSize = CGSizeMake(MAXFLOAT, MAXFLOAT);
        NSMutableDictionary *md = [NSMutableDictionary dictionary];
        md[NSFontAttributeName] = self.myFont;
        
        return [title boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:md context:nil];
    }

      注释:获取文字Rect那个方法目的在于:button中的文字是不可以换行的,但文字长度未知所以不限制长度;但文字的高度因字号大小不同而不同,所以我们需要算出文字所占的范围来得出高度,并以此来设定image与title的大小和相对父视图的位置;

      实现后效果:

      如此达到了项目需求,(此外若遇到需求如:图在下字在上、图在右字在左的情况也自不在话下!)

  • 相关阅读:
    八进制转换成十进制(你会明白的,呵呵)
    从键盘读取7个数(150)的整数值,每读一个值打印出该值个数的*号.
    两个字符串的连接程序
    判断一个素数能被几个9整除.
    809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
    一个偶数总能表示为两个素数的和.
    07所能组成的奇数的个数
    asp.net .ashx文件使用Server.MapPath解决方法
    MVC常见问题小总结
    amcharts_2.6.13左上角的广告咱去掉
  • 原文地址:https://www.cnblogs.com/CJDog/p/5178113.html
Copyright © 2011-2022 走看看