美文网首页
一句代码搞定UIbutton中的imageView和title的

一句代码搞定UIbutton中的imageView和title的

作者: 用心在飞 | 来源:发表于2016-12-15 11:53 被阅读262次

    先理解下面 (不理解也行,会调用就可以)

    Button有两个属性:titleEdgeInsets和imageEdgeInsets,通过设置这两个,就可以实现所有需要的Button的样式,如:image在上、image在下、image在左、image在右。

    titleEdgeInsets是titleLabel相对于其上下左右的inset,跟tableView的contentInset是类似的;

    如果只有title,那titleLabel的上下左右都是相对于Button的;

    如果只有image,那imageView的上下左右都是相对于Button的;

    如果同时有image和label,那image的上下左相对于Button的,相对于label的;

    label的上下右相对于Button的相对于label的。


    写一个UIbutton的分类

    .h文件

    #importtypedef NS_ENUM(NSUInteger, MKButtonEdgeInsetsStyle) {

    MKButtonEdgeInsetsStyleTop, // image在上,label在下

    MKButtonEdgeInsetsStyleLeft, // image在左,label在右

    MKButtonEdgeInsetsStyleBottom, // image在下,label在上

    MKButtonEdgeInsetsStyleRight // image在右,label在左

    };

    @interface UIButton (ImageTitleSpacing)

    /**

    *  设置button的titleLabel和imageView的布局样式,及间距

    *

    *  @param style titleLabel和imageView的布局样式

    *  @param space titleLabel和imageView的间距

    */

    - (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style

    imageTitleSpace:(CGFloat)space;

    @end

    .m 文件

    #import "UIButton+ImageTitleSpacing.h"

    @implementation UIButton (ImageTitleSpacing)

    - (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style

    imageTitleSpace:(CGFloat)space

    {

    //    self.backgroundColor = [UIColor cyanColor];

    /**

    *  前置知识点:titleEdgeInsets是title相对于其上下左右的inset,跟tableView的contentInset是类似的,

    *  如果只有title,那它上下左右都是相对于button的,image也是一样;

    *  如果同时有image和label,那这时候image的上左下是相对于button,右边是相对于label的;title的上右下是相对于button,左边是相对于image的。

    */

    // 1. 得到imageView和titleLabel的宽、高

    CGFloat imageWith = [UIDevice currentDevice].systemVersion.floatValue >= 8.0?self.imageView.intrinsicContentSize.width:self.imageView.frame.size.width;

    CGFloat imageHeight = [UIDevice currentDevice].systemVersion.floatValue >= 8.0?self.imageView.intrinsicContentSize.height:self.imageView.frame.size.height;

    CGFloat labelWidth = 0.0;

    CGFloat labelHeight = 0.0;

    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {

    // 由于iOS8中titleLabel的size为0,用下面的这种设置

    labelWidth = self.titleLabel.intrinsicContentSize.width;

    labelHeight = self.titleLabel.intrinsicContentSize.height;

    } else {

    labelWidth = self.titleLabel.frame.size.width;

    labelHeight = self.titleLabel.frame.size.height;

    }

    // 2. 声明全局的imageEdgeInsets和labelEdgeInsets

    UIEdgeInsets imageEdgeInsets = UIEdgeInsetsZero;

    UIEdgeInsets labelEdgeInsets = UIEdgeInsetsZero;

    // 3. 根据style和space得到imageEdgeInsets和labelEdgeInsets的值

    switch (style) {

    case MKButtonEdgeInsetsStyleTop:

    {

    imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);

    labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0);

    }

    break;

    case MKButtonEdgeInsetsStyleLeft:

    {

    imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);

    labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);

    }

    break;

    case MKButtonEdgeInsetsStyleBottom:

    {

    imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);

    labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0);

    }

    break;

    case MKButtonEdgeInsetsStyleRight:

    {

    imageEdgeInsets = UIEdgeInsetsMake(0, labelWidth+space/2.0, 0, -labelWidth-space/2.0);

    labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith-space/2.0, 0, imageWith+space/2.0);

    }

    break;

    default:

    break;

    }

    // 4. 赋值

    self.titleEdgeInsets = labelEdgeInsets;

    self.imageEdgeInsets = imageEdgeInsets;

    }

    @end 

    调用的话就很简单了,以图片在上,title在下为例子

    MKButtonEdgeInsetsStyleTop, // image在上,label在下

    MKButtonEdgeInsetsStyleLeft, // image在左,label在右

    MKButtonEdgeInsetsStyleBottom, // image在下,label在上

    MKButtonEdgeInsetsStyleRight // image在右,label在左

    调用:

    CGRect frame = CGRectMake(x, y, width, height);

    UIButton *button = [[UIButton alloc] initWithFrame:frame];

    [button layoutButtonWithEdgeInsetsStyle:MKButtonEdgeInsetsStyleTop imageTitleSpace:1.0];

    相关文章

      网友评论

          本文标题:一句代码搞定UIbutton中的imageView和title的

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