• iOS UIButton文字和图片间距随意调整


    代码地址如下:
    http://www.demodashi.com/demo/11606.html

    前记

    在开发中,我们经常会遇到这么一种情况,就是一个按钮上面有图片也有文字,但是往往设计并不是我们想要的那种,比如可能图片在上,文字在下,或者图片在左,文字在右,关键是还有一定的距离,并不是系统默认UIButton中,图片和文字的间距。当然,这调整图片和文字的距离的小事,是难不倒大家的,因为大家都知道,在UIButton中,有这么两个属性titleEdgeInsetsimageEdgeInsets

    关于属性

    关于titleEdgeInsetsimageEdgeInsets这两个属性,简单介绍下:
    titleEdgeInsetstitle相对于其上下左右的inset,跟tableViewcontentInset是类似的,如果只有title,那它上下左右都是相对于button的,imageEdgeInsets也是一样
    如果同时有imagetitle,那这时候image的上左下是相对于button,右边是相对于title的;title的上右下是相对于button,左边是相对于image的,也就是说image是默认居左的。
    通过以上两个属性,可以很轻松的实现文字图片的位置及距离的调整,如果每次在用的时候,都去重新写一片,难免会很麻烦,鉴于此,之前在谋篇博客中(具体忘了,原博主看到请勿见怪),看到过用category封装的,于是我在项目中,也写了一个category,其中也列举了四种不同的枚举来表现其不同的场景

    枚举类型

    // 定义一个枚举(包含了四种类型的button)
    typedef NS_ENUM(NSUInteger, GLButtonEdgeInsetsStyle) {
        GLButtonEdgeInsetsStyleTop, // image在上,label在下
        GLButtonEdgeInsetsStyleLeft, // image在左,label在右
        GLButtonEdgeInsetsStyleBottom, // image在下,label在上
        GLButtonEdgeInsetsStyleRight // image在右,label在左
    };
    

    并且定义了一个简单使用的方法:

    /**
     *  设置button的titleLabel和imageView的布局样式,及间距
     *
     *  @param style titleLabel和imageView的布局样式
     *  @param space titleLabel和imageView的间距
     */
    - (void)layoutButtonWithEdgeInsetsStyle:(GLButtonEdgeInsetsStyle)style
                            imageTitleSpace:(CGFloat)space;
    

    其中space是指图片文字之间的间距,style对应上面的枚举,可以针对性的选择

    具体实现方法

    - (void)layoutButtonWithEdgeInsetsStyle:(GLButtonEdgeInsetsStyle)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.image.size.width;
        CGFloat imageHeight = self.imageView.image.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 GLButtonEdgeInsetsStyleTop:
            {            
                imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);
                labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0);
            }
                break;
            case GLButtonEdgeInsetsStyleLeft:
            {
                imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);
                labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);
            }
                break;
            case GLButtonEdgeInsetsStyleBottom:
            {
                imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);
                labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0);
            }
                break;
            case GLButtonEdgeInsetsStyleRight:
            {
                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;
    }
    

    实现效果

    button

    其实思路很简单,这里只是简单封装了下。

    项目文件截图:

    iOS UIButton文字和图片间距随意调整

    代码地址如下:
    http://www.demodashi.com/demo/11606.html

    注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

  • 相关阅读:
    QAction使用
    QT学后感
    设置背景图片
    获取句柄的方法总结(尤其是对于dll而言)
    unixbench小试
    Java命令行之jar命令
    Java应用程序安装包制作工具简介
    Eclipse使用ant编译时的乱码问题
    Jboss4中使用配置发送邮件
    Exe4j注册码
  • 原文地址:https://www.cnblogs.com/demodashi/p/8509253.html
Copyright © 2020-2023  润新知