自定义UIButton 实现图片和文字 之间距离和不同样式

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;
}
时间: 2024-12-28 16:07:43

自定义UIButton 实现图片和文字 之间距离和不同样式的相关文章

UIButton的图片和文字相对位置调整

通常,如果直接设置UIButton的图片和文字,默认的两者相对位置可能不是我们想要的,那么需要进行调整. 需要用到的函数如下: UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right) top,left,bottom,right分别表示向各个方向的移动量 实例说明: UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(50, 100,

UIButton左边图片右边文字的做法

UIImage *yuyinImage = [UIImage imageNamed:@"yuyin.png"]; [soundButton setImage:yuyinImage forState:UIControlStateNormal]; [soundButton setImage:yuyinImage forState:UIControlStateSelected]; [soundButton setImage:yuyinImage forState:UIControlState

更改控件中DrawableLeft图片的大小,图片与文字的距离

Drawable drawable=getResources().getDrawable(R.drawable.xx); //获取图片 drawable.setBounds(left, top, right, bottom);  //设置图片参数 xx.setCompoundDrawablesRelativeWithIntrinsicBounds(null,all,null,null);  //设置到哪个控件的位置() 图片与文字距离 :属性android:drawablePadding="&q

UIButton设置图片和文字

在开发的过程中经常会遇到需要在button中放置图片和文字,比如将图片放置在button左边,文字放置在右边.因为UIButton也是继承自UIView,因此可以像其它的view一样添加subView, //创建button UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // 创建imageview UIImage *image = [UIImage imageNamed:@"yourImage.png

iOS button 里边图片和文字的距离

很多次,系统默认的UIButton不能满足需求,每次都是查了很多资料,最后还是用最复杂的方式来修改button的标题和图片的位置,今天,花些时间来梳理一下这方面的知识... UIButton的默认布局是:title在右,image在左; 很多时候我们需要的是title在左边,或者title在下面,这时就需要调整UIButton的TitleLabel和ImageView的位置了,查了很多资料,要么零零散散的介绍,要么就是特别复杂的实现;经过一段时间的学习,在这里总结一下实现的方式; 一种是设置UI

Android 自定义Android带图片和文字的ImageButton

经过分析,上述按钮效果实际上就是一个布局,一个最简单不过的垂直线性布局,上部分是一个ImageView,下部分是一个TextView,这个布局可点击.可设置监听. 我们首先要编写自己的ImageButton类,然后在主布局文件中为我们自定义的Button编写布局,最后在Activity中调用我们自定义ImageButton即可. 首先,我们编写一个MyImageButton类,继承自LinearLayout package com.billhoo.study; import android.co

iOS开发小技巧--修改按钮内部图片和文字之间的间距(xib)

调整按钮的Edge属性,选择调整图片的Edge还是label的Edge,如图:

UIButton图片文字控件位置自定义(图片居右文字居左、图片居中文字居中、图片居左文字消失等)

在开发中经常会碰到需要对按钮中的图片文字位置做调整的需求.第一种方式是通过设置按钮中图片文字的偏移量.通过方法setTitleEdgeInsets和setImageEdgeInsets实现 代码如下: /*!**方式一***/ - (void)updateBtnStyle_rightImage:(UIButton *)btn { CGFloat btnImageWidth = btn.imageView.bounds.size.width; CGFloat btnLabelWidth = btn

iOS UIButton 设置图片文字垂直排列

在实际的iOS项目开发中,我们经常需要改变系统的控件的样式,自己定义一个,同样的当我们发现系统自带的某些方法不好使时,我们也会想到重写这个方法. 本文主要记录笔者设置UIButton图片文字垂直排列的方法,最终解决了在图片和文字垂直排列的情况下,如果文字长度变化会导致图片位置变动的问题,对 于此问题网上有比较多的做法,我就不多说了,在此记录这点细节仅为加深印象并方便以后查阅.如有纰漏还请见谅 方案一:通过调整按钮图片和文字的内边距 UIEdgeInsets typedef struct UIEd