美文网首页程序员iOS开发攻城狮的集散地征服iOS
iOS实现Button文字(titleLabel)和图片(ima

iOS实现Button文字(titleLabel)和图片(ima

作者: 云天大侠_general | 来源:发表于2017-03-19 11:52 被阅读201次
    • 在设置这两个之前,我们先要理解Button上面的titleLabel和imageView的位置关系(想象Button默认的image和label的显示):

    我们知道,默认情况下如果UIbutton同时设置了标题和图片的情况下,titleLabel在image的右侧。

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

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

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

    4.如果同时有image和label,那image的 上下左 是 相对于Button 的,右 是 相对于label 的;
    label的 上下右 是 相对于Button的, 左 是 相对于label 的。

    0x01.新建一个UIButton类。

    xx.h

    #import <UIKit/UIKit.h>
    
    typedef 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
    

    xx.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 = self.imageView.frame.size.width;
        CGFloat imageHeight = 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
    

    0x02.使用方法。

    #import "ViewController.h"
    #import "xx.h"
    
    @interface ViewController ()
    
    @property (weak, nonatomic) IBOutlet UIButton *topButton;
    @property (weak, nonatomic) IBOutlet UIButton *leftButton;
    @property (weak, nonatomic) IBOutlet UIButton *bottomButton;
    @property (weak, nonatomic) IBOutlet UIButton *rightButton;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        [self updateUI];
    }
    
    - (void)updateUI {
        CGFloat space = 20.0;
        [self.topButton layoutButtonWithEdgeInsetsStyle:MKButtonEdgeInsetsStyleTop
                                        imageTitleSpace:space];
        
        [self.leftButton layoutButtonWithEdgeInsetsStyle:MKButtonEdgeInsetsStyleLeft
                                         imageTitleSpace:space];
        
        [self.bottomButton layoutButtonWithEdgeInsetsStyle:MKButtonEdgeInsetsStyleBottom
                                           imageTitleSpace:space];
        
        [self.rightButton layoutButtonWithEdgeInsetsStyle:MKButtonEdgeInsetsStyleRight
                                          imageTitleSpace:space];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    

    相关文章

      网友评论

        本文标题:iOS实现Button文字(titleLabel)和图片(ima

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