基础控件-->>UIButton详解


继基础控件UIlabel之后,期待的UIButton详细介绍-->>保证你有意外收获,如有问题欢迎指点。。


1、UIButton基础属性


按钮状态分析

  • 正常(Normal)
  • 高亮(Highlighted)
  • 选中(Selected)
  • 禁止(Disabled)

normal(普通状态)
默认情况(Default)
对应的枚举常量:UIControlStateNormal

highlighted(高亮状态)
按钮被按下去的时候(手指还未松开)
对应的枚举常量:UIControlStateHighlighted

Selected(选中状态)
按钮被设置成选中状态
对应的枚举常量:UIControlStateSelected

disabled(失效状态,不可用状态)
如果enabled属性为NO,就是处于disable状态,代表按钮不可以被点击
对应的枚举常量:UIControlStateDisabled

当按钮被点击时,按钮就会进入高亮状态。
当按钮被设置成选中状态时,按钮进入选中状态。
区别就是他们是按钮的不同状态,触发条件不一样。
其实做要在用法上,比如你只是点击按钮,不让他一直变,就设置他的高亮状态的图片,如果点击过后,要求按钮发生变化,松手的时候不在是普通状态的就设置选中状态。

#######代码

//初始化
    UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
    /**  类型
     UIButtonTypeCustom:无类型,按钮的内容需要自定义
     UIButtonTypeDetailDisclosure:蓝色小箭头按钮,主要用来做详细说明
     UIButtonTypeInfoLight:亮色感叹号
     UIButtonTypeInfoDark:暗色感叹号
     UIButtonTypeContactAdd:十字加号按钮
     */
    //位置
    button.frame = CGRectMake(100, 100, 100, 20);
    //设置文字  正常
    [button setTitle:@"按钮" forState:UIControlStateNormal];
    //设置按钮文字颜色
    [button setTitleColor:[UIColor lightTextColor] forState:UIControlStateNormal];
    //设置文字字体大小<需要拿到按钮内部的label来设置>
    button.titleLabel.font = [UIFont systemFontOfSize:15];
    //设置按钮的背景图片
    [button setBackgroundImage:[UIImage imageNamed:@"bg.png"] forState:UIControlStateNormal];
    //设置按钮内部的小图片
    [button setImage:[UIImage imageNamed:@"太阳.jpg"] forState:UIControlStateNormal];
    //通过 按钮状态获取按钮文字
    NSString * buttonTitle = [button titleForState:UIControlStateNormal];
       //通过 按钮状态获取按钮文字颜色
    UIColor * buttonColor = [button titleColorForState:UIControlStateNormal];
    //获得按钮内部的小图片
    UIImage * buttonImage = [button imageForState:UIControlStateNormal];
    //获得按钮的背景图片
    UIImage * buttonBgImage = [button backgroundImageForState:UIControlStateNormal];
    //按钮是否可用 默认YES  NO 不可用 -**- 只能通过enabled = NO达到UIControlStateDisables状态,设置userInterationEnabled = NO,并不能让按钮达到这个状态
    button.enabled = YES;
    //按钮的监听 只有继承UIControl才能通过addTarget来监听事件
    [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];

2、UIButton进阶阶段-->>文字,图片的上下左右排布


理解Button上面的titleLabel和imageView的位置关系

 - titleEdgeInsets是titleLabel相对于其上下左右的insets
 - 如果只有title。
  ①那titleLabel的上下左右都是相对于Button的;
 - 如果只有image。
  ①imageView的上下左右都是相对于Button的;
 - 如果同时有image和label。
  ①image的上下左是相对于Button的,右是相对于label的
  ②label的上下右是相对于Button的,左是相对于label的。

  • Button左右排布

#######效果---<左图片 右文字>


佰亿猫.png

#######代码

 UIButton * testButton = [UIButton buttonWithType:UIButtonTypeCustom];
    testButton.frame = CGRectMake(100, 200, 100, 50);
    [testButton setTitle:@"佰亿猫" forState:UIControlStateNormal];
    [testButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [testButton setImage:[UIImage imageNamed:@"gd_yqhy"] forState:UIControlStateNormal];
    testButton.titleEdgeInsets = UIEdgeInsetsMake(-5,10,0,0);//(上top,左left,下bottom,右right)这里可以写负值,对上写-5,那么image就象上移动5个像素
    testButton.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    [self.view addSubview:testButton];

#######效果---<右图片 左文字>


90E5467C-B5C6-4F41-84CF-1C53BDD14855.png

#######原理

Button默认是左图片,右文字。并且在设置edge insets之前,位置已经有了设定。所以设置title的edge insets,真实的作用是在原来的边距值基础上增加或减少某个间距,负值便是减少。以title为例,设置右边距增加图片宽度,就使得自己的右边界距离按钮的右边界多了图片的宽度,正好放下图片。此时,title lable变小了,而title lable的左边界还在原来的位置上,所以lable的左边界距离按钮的左边界减少图片的宽度,lable就和原来一样大了,而且左侧起始位置和图片的左侧起始位置相同了。

#######代码

    UIButton * testButton = [UIButton buttonWithType:UIButtonTypeCustom];
    testButton.frame = CGRectMake(100, 200, 100, 50);
    [testButton setTitle:@"佰亿猫" forState:UIControlStateNormal];
    [testButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [testButton setImage:[UIImage imageNamed:@"gd_yqhy"] forState:UIControlStateNormal];
    [testButton setTitleEdgeInsets:UIEdgeInsetsMake(0, -testButton.imageView.image.size.width, 0, testButton.imageView.image.size.width)];
    [testButton setImageEdgeInsets:UIEdgeInsetsMake(0, testButton.titleLabel.bounds.size.width + 10, 0, -testButton.titleLabel.bounds.size.width)];
    [self.view addSubview:testButton];

  • Button上下排布

#######前序<实现上下排布的方法很多方案>

  • 1、自定义一个UIView,然后有两个属性label和imageView,然后设置位置布局,再添加单击手势,用协议代理回传点击方法。
  • 2、写一个继承UIButton的类,有两个属性label和imageView,然后设置布局。不需要设置手势来实现点击,Button有自己的点击事件。
  • 3、直接用Button自带的titleLabel和imageView,写个类别,用来设置label和image的排列方式。自己想怎么设置都可以--<最好的办法,此方法我也是无意中看到别人这样写的,在自己项目中也常用>

上面1,2方法都可以实现我以前也用过,但是作为一个码农要把自己的代码优化,所以不建议使用第一,二种方法,确实有点Low但是可以自己尝试。重点讲解第三种方案--

#######效果

36C8D299-EBB0-4AF0-9EC8-92777147832E.png

#######代码 类别.H

#import <UIKit/UIKit.h>

@interface UIButton (Category)


typedef NS_ENUM(NSUInteger, CBBButtonEdgeInsetsStyle) {
   CBBButtonEdgeInsetsStyleTop,     // image在上
   CBBButtonEdgeInsetsStyleLeft,    // image在左
   CBBButtonEdgeInsetsStyleBottom,  // image在下
   CBBButtonEdgeInsetsStyleRight    // image在右
};

- (void)layoutButtonWithEdgeInsetsStyle:(CBBButtonEdgeInsetsStyle)style
                       imageTitleSpace:(CGFloat)space;

#######代码 类别.M

#import "UIButton+Category.h"

@implementation UIButton (Category)

/**
 设置button的titleLabel和imageView的布局<枚举>,及间距
 @param style titleLabel和imageView的样式
 @param space titleLabel和imageView的间距
 */
- (void)layoutButtonWithEdgeInsetsStyle:(CBBButtonEdgeInsetsStyle)style
                        imageTitleSpace:(CGFloat)space
{

    // 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 CBBButtonEdgeInsetsStyleTop:
        {
            imageEdgeInsets = UIEdgeInsetsMake(-labelHeight-space/2.0, 0, 0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(0, -imageWith, -imageHeight-space/2.0, 0);
        }
            break;
        case CBBButtonEdgeInsetsStyleLeft:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, -space/2.0, 0, space/2.0);
            labelEdgeInsets = UIEdgeInsetsMake(0, space/2.0, 0, -space/2.0);
        }
            break;
        case CBBButtonEdgeInsetsStyleBottom:
        {
            imageEdgeInsets = UIEdgeInsetsMake(0, 0, -labelHeight-space/2.0, -labelWidth);
            labelEdgeInsets = UIEdgeInsetsMake(-imageHeight-space/2.0, -imageWith, 0, 0);
        }
            break;
        case CBBButtonEdgeInsetsStyleRight:
        {
            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;

}

#######代码 控制器

    for (int i = 0; i<4; i++) {
    UIButton * testButton = [UIButton buttonWithType:UIButtonTypeCustom];
    testButton.frame = CGRectMake(100, 100*(i +1), 100, 50);
    
    [testButton setTitle:@"佰亿猫" forState:UIControlStateNormal];
    [testButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [testButton setImage:[UIImage imageNamed:@"gd_yqhy"] forState:UIControlStateNormal];
    [testButton layoutButtonWithEdgeInsetsStyle:i imageTitleSpace:10];
    [self.view addSubview:testButton];
  


未完待续。。需要代码的➕QQ1107385382<抱歉目前不会GitHub 后续上传>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容