zoukankan      html  css  js  c++  java
  • 自定义UIButton 实现图片和文字 之间距离和不同样式

    喜欢交朋友的加:微信号 dwjluck2013

    1.UIButton+ImageTitleSpace.h

    #import <UIKit/UIKit.h>
    
    // 定义一个枚举(包含了四种类型的button)
    typedef NS_ENUM(NSUInteger, MKButtonEdgeInsetsStyle) {
        MKButtonEdgeInsetsStyleTop, // image在上,label在下
        MKButtonEdgeInsetsStyleLeft, // image在左,label在右
        MKButtonEdgeInsetsStyleBottom, // image在下,label在上
        MKButtonEdgeInsetsStyleRight // image在右,label在左
    };
    
    @interface UIButton (ImageTitleSpace)
    
    /**
     * 设置button的titleLabel和imageView的布局样式,及间距
     *
     * @param style titleLabel和imageView的布局样式
     * @param space titleLabel和imageView的间距
     */
    - (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style
                            imageTitleSpace:(CGFloat)space;
    
    @end

    2.UIButton+ImageTitleSpace.m

    #import "UIButton+ImageTitleSpace.h"
    
    @implementation UIButton (ImageTitleSpace)
    
    - (void)layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style
                            imageTitleSpace:(CGFloat)space {
        /**
         * 知识点: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的值
        /**
         MKButtonEdgeInsetsStyleTop, // image在上,label在下
         MKButtonEdgeInsetsStyleLeft, // image在左,label在右
         MKButtonEdgeInsetsStyleBottom, // image在下,label在上
         MKButtonEdgeInsetsStyleRight // image在右,label在左
         */
        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

    3.使用

    1.导入头文件

    #import "UIButton+ImageTitleSpace.h"

    2.在懒加载 按钮中调用

    // 图片标题
    - (UIButton *)imageTitleButton
    {
        if (!_imageTitleButton) {
            _imageTitleButton = [[UIButton alloc]initWithFrame:CGRectZero];
            _imageTitleButton.backgroundColor = [UIColor blackColor];
            [_imageTitleButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
            [_imageTitleButton setImage:[UIImage imageNamed:@"nv"] forState:UIControlStateNormal];
            _imageTitleButton.titleLabel.font = [UIFont systemFontOfSize:ImageTitleButtonFontSize];
            //懒加载按钮中 调用即可
            [_imageTitleButton layoutButtonWithEdgeInsetsStyle:MKButtonEdgeInsetsStyleLeft imageTitleSpace:5];
            
            [_imageTitleButton setContentEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
            _imageTitleButton.clipsToBounds = YES;
            _imageTitleButton.layer.cornerRadius = 5;
            _imageTitleButton.alpha = 0.5;
            
        }
        return _imageTitleButton;
    }
  • 相关阅读:
    go入门4---数据
    hibernate之关联关系一对多
    hibernate的主键生成策略
    hibernate的入门
    struts--CRUD优化(图片上传)
    struts2--CRUD
    struts2--入
    Maven环境搭建
    EasyUI--增删改查
    easyui--权限管理
  • 原文地址:https://www.cnblogs.com/dujiahong/p/6809368.html
Copyright © 2011-2022 走看看