Objective-C:按钮(UIButton)

一、UIButton的定义

两种创建方法        

1)常规的initWithFrame的方式

UIButton *btn1 = [[UIButton alloc]initWithFrame:CGRectMake(100, 50, 100, 75)];

[btn1 setTitle:@"close" forState:UIControlStateNormal];

btn1.backgroundColor = [UIColor greenColor];//button的背景颜色

[btn1 setBackgroundImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];//button的背景图片

2)UIButton 的一个类方法(也可以说是静态方法)buttonWithType 

UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];//创建一个圆角矩形的按钮btn2.frame = CGRectMake(200, 20, 50, 60);

btn2.backgroundColor = [UIColor blackColor];

[btn2 setTitle:@"clicke" forState:UIControlStateNormal];

[self.window addSubview:btn1];

[self.window addSubview:btn2];

创建一个自定义的按钮

UIButton *button1=[UIButton buttonWithType:UIButtonTypeCustom];

能够定义的button类型有以下6种

typedef enum {

      UIButtonTypeCustom = 0,          自定义风格-无类型,按钮的内容需要自定义:位置尺寸、背景色,等(如果没有自定义这些可能会看不到

      UIButtonTypeRoundedRect,        圆角矩形

      UIButtonTypeDetailDisclosure,    蓝色小箭头按钮,主要做详细说明用

      UIButtonTypeInfoLight,          亮色感叹号

      UIButtonTypeInfoDark,            暗色感叹号

      UIButtonTypeContactAdd,          十字加号按钮

    } UIButtonType;

👩🏻‍🎓注意:按钮创建好之后,按钮的类型是不可以被修改的

知识点:Detail Disclosure/info Light/info Dark长一样(iOS7以前不一样,扁平化以后都一样,残留的东西)

二、设置frame

    //给定button在view上的位置 

     button1.frame = CGRectMake(20, 20, 280, 20);

    [button setFrame:CGRectMake(20,20,50,50)];

✨✨✨✨调整Button内部布局✨✨✨✨

1,调整内部子控件布局应用场景

-按钮文字在图片下方

-按钮文字在图片上方

-按钮文字在图片左边(默认是在右边)

-等等; 根据需求调整布局内部子控件

2,实现步骤

-自定义按钮->创建一个继承 UIButton 的子类(如:CDHButton)

-给自定义按钮中的子控件重新布局(有两种方法)

-方法一:要实现两个对象方法

-(CGRect)titleRectForContentRect:(CGRect)contentRect{

    // 返回文字的frame 

}

-  (CGRect)imageRectForContentRect:(CGRect)contentRect{

    // 返回图片的frame

}

-方法二:实现layoutSubViews方法

- (void)layoutSubviews{

    [super layoutSubviews];

    // 插入需要设置位置尺寸的语句,并返回frame

}

3,设置是否调整图片的显示亮度

设置属性

// 设置在 Highlighted 状态点击时是否调整图片显示亮度

@property(nonatomic)          BOOL        adjustsImageWhenHighlighted;    // default is YES. if YES, image is drawn darker when highlighted(pressed)

// 设置在disabled状态是否调整图片显示亮度

@property(nonatomic)          BOOL        adjustsImageWhenDisabled;      // default is YES. if YES, image is drawn lighter when disabled

/*  在disabled要不要调整显示的图片,当disabled的时候也不改变背景色  */

self.adjustsImageWhenDisabled = NO;

4,按钮的内边距

设置内边距属性

// 按钮内的子控件(图片和文字)的内边距,

@property(nonatomic) UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR; // default is UIEdgeInsetsZero

// 按钮内的子控件(文字)的内边距,

@property(nonatomic) UIEdgeInsets titleEdgeInsets; // default is UIEdgeInsetsZero

// 按钮内的子控件(图片)的内边距,

@property(nonatomic) UIEdgeInsets imageEdgeInsets; // default is UIEdgeInsetsZero

例子:

// 设置按钮内图片和文字内边距位置为(30,30),即是按钮内图片和文字一起右移30,下移30

self.btn.contentEdgeInsets = UIEdgeInsetsMake(30, 30, 0, 0);

// 设置按钮内文字内边距位置为(0,-30),即是按钮内文字上移30

self.btn.titleEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0);

// 设置按钮内图片内边距位置为(0,-30),即是按钮内图片上移30

self.btn.imageEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0);

三、button背景色

    //button背景色

     button1.backgroundColor = [UIColor clearColor];

      [button setBackgroundColor:[UIColor blueColor]];

四、设置button填充图片和背景图片

//设置button填充图片和背景图片

    [button1 setImage:[UIImage imageNamed:@"btng.png"] forState:UIControlStateNormal];

    [button setBackgroundImage:[UIImageimageNamed:@"btng.png"]forState:UIControlStateNormal];

五、设置button标题和标题颜色

//设置button标题和标题颜色

    [button1 setTitle:@"点击" forState:UIControlStateNormal];

    [button setTitleColor:[UIColorredColor]forState:UIControlStateNormal];

    [button setTitleShadowColor:[UIColor grayColor] forState:UIControlStateNormal ]; //阴影

六、state状态

forState: 这个参数的作用是定义按钮的文字或图片在何种状态下才会显现

以下是几种状态

enum {

        UIControlStateNormal      = 0,        常规状态显现           

        UIControlStateHighlighted  = 1 << 0,    高亮状态显现 

        UIControlStateDisabled    = 1 << 1,    禁用的状态才会显现

        UIControlStateSelected    = 1 << 2,    选中状态           

        UIControlStateApplication  = 0x00FF0000, 当应用程序标志时         

        UIControlStateReserved    = 0xFF000000  为内部框架预留,可以不管他           

    };

@property(nonatomic,getter=isEnabled)BOOL enabled; // default is YES. if NO, ignores touch events and subclasses may draw differently 

 @property(nonatomic,getter=isSelected)BOOL selected; // default is NO may be used by some subclasses or by application 

 @property(nonatomic,getter=isHighlighted)BOOL highlighted;

1. normal(普通状态)

-默认情况(Default)

-对应的枚举常量:UIControlStateNormal

-除开UIControlStateHighlighted、UIControlStateDisabled、UIControlStateSelected以外的其他情况,都是normal状态

-这种状态下的按钮【可以】接收点击事件

-如果前后连着设置按钮同时处于多种状态, 则表现出来的也是 normal 状态, 除去如果有 设置为 enabled = NO; 则会进入UIControlStateDisabled状态(包括颜色), 不能点击

//下面两种杂交在一起(就不是 normal 后面三种 ), 会显示为 Normal 状态的颜色,

//但是 设置了 Enabled == NO, 所以这里也是不能点击的,

self.button.selected = YES;

self.button.enabled = NO;

2. highlighted(高亮状态)

-对应的枚举常量:UIControlStateHighlighted

-【当按住按钮不松开】或者【highlighted = YES】时就能达到这种状态

-这种状态下的按钮【可以】接收点击事件

3.selected (选中状态)

-对应的枚举常量: UIControlStateSelected

-【button.selected = YES】时就能达到这种状态

-这种状态下的按钮【可以】接收点击事件

4. disabled(失效状态,不可用状态)

-如果enabled属性为NO,就是处于disable状态,代表按钮不可以被点击

-对应的枚举常量:UIControlStateDisabled

-【button.enabled = NO】时就能达到这种状态

-这种状态下的按钮【无法】接收点击事件

5. 让按钮无法点击的2种方法

-button.enabled = NO; 

【会】进入UIControlStateDisabled状态

-button.userInteractionEnabled = NO; 

【不会】进入UIControlStateDisabled状态,继续保持当前状态

重写按钮的某个状态属性的 setter 方法和 getter 方法设置按钮的状态

-如: 重写按钮高亮get方法, 如果返回值是 yes , 则永远返回的是高亮状态, 如果返回值是 NO 则永远返回的是非高亮

- (BOOL)isHighlighted{

  return NO;

}

-重写按钮高亮 set 方法, 如果没有实现内部属性赋值(属性是父类定义的, 要调用父类的方法赋值), 则不会出现高亮状态

 //   如果给内部属性赋值为 Yes , 则会一直为 YES状态, 如果赋值为 NO, 则一直未 NO 状态

- (void)setHighlighted:(BOOL)highlighted{

  [super setHighlighted:highlighted];

}

七、设置按钮按下是否颜色变深

/*

    * 默认情况下,当按钮高亮的情况下,图像的颜色会被画深一点,如果这下面的这个属性设置为no,那么可以去掉这个功能

    */    

button1.adjustsImageWhenHighlighted = NO;

/* 跟上面的情况一样,默认情况下,当按钮禁用的时候,图像会被画得深一点,设置NO可以取消设置 */ 

 button1.adjustsImageWhenDisabled = NO;

八、设置按钮按下会发光

/* 下面的这个属性设置为yes的状态下,按钮按下会发光 */ 

 button1.showsTouchWhenHighlighted = YES;

九、添加或删除事件处理

/* 给button添加事件,事件有很多种

    按下按钮,并且手指离开屏幕的时候触发这个事件,跟web中的click事件一样。

    触发了这个事件以后,执行butClick:这个方法,addTarget:self 的意思是说,这个方法在本类中也可以传入其他类的指针  */    

//添加事件    

[button1 addTarget:self action:@selector(butClick:) forControlEvents:UIControlEventTouchUpInside];

 //删除事件   

 [button1 removeTarget:nil action:nil forControlEvents:UIControlEventTouchUpInside];

 //显示控件   

 [self.view addSubview:button1];

十、设置按钮内部图片间距和标题间距

UIEdgeInsets insets; // 设置按钮内部图片间距

insets.top = insets.bottom = insets.right = insets.left = 10;

bt.contentEdgeInsets = insets;

bt.titleEdgeInsets = insets; // 标题间距

十一、一些其他的按钮设置

btn1.titleLabel.font = [UIFont fontWithName:@“test” size:18];//设置按钮字体大小

[btn1 setTag:101] ;//设置tag值

btn1.layer.cornerRadius = 4.5;//设置圆角——四个圆角半径

btn1.layer.borderWidth = 0.5;// 按钮边框宽度

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // 设置颜色空间为rgb,用于生成

ColorRefCGColorRef borderColorRef = CGColorCreate(colorSpace,(CGFloat[]){ 0, 0, 0, 1 }); // 新建一个红色的ColorRef,用于设置边框(四个数字分别是 r, g, b, alpha)btn1.layer.borderColor = borderColorRef;

十二、重写绘制行为

你可以通过子类化按钮来定制属于你自己的按钮类。在子类化的时候你可以重载下面这些方法,这些方法返回CGRect结构,指明了按钮每一组成部分的边界。

      👩🏻‍🎓 注意:不要直接调用这些方法, 这些方法是你写给系统调用的。

backgroundRectForBounds //指定背景边界 

contentRectForBounds // 指定内容边界 

titleRectForContentRect // 指定文字标题边界 

 imageRectForContentRect //指定按钮图像边界

        例:

- (CGRect)imageRectForContentRect:(CGRect)bounds{

    return CGRectMake(0.0, 0.0, 44, 44);

}

[btn1 addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];//添加点击按钮事件

-(void)btnPressed:(id)sender{ 

      UIButton* btn = (UIButton*)sender; 

      //开始写你自己的动作 

}

forControlEvents参数类型

typedef NS_OPTIONS(NSUInteger, UIControlEvents)

{

    UIControlEventTouchDown                = 1 <<  0,      // 单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。    

    UIControlEventTouchDownRepeat      = 1 <<  1,      // 多点触摸按下事件,点触计数大于1:用户按下第二、三、或第四根手指的时候。    

    UIControlEventTouchDragInside        = 1 <<  2,      // 当一次触摸在控件窗口内拖动时。    

    UIControlEventTouchDragOutside      = 1 <<  3,      // 当一次触摸在控件窗口之外拖动时。    

    UIControlEventTouchDragEnter          = 1 <<  4,      // 当一次触摸从控件窗口之外拖动到内部时    

    UIControlEventTouchDragExit            = 1 <<  5,      // 当一次触摸从控件窗口内部拖动到外部时。    

    UIControlEventTouchUpInside            = 1 <<  6,      // 所有在控件之内触摸抬起事件    

    UIControlEventTouchUpOutside          = 1 <<  7,      // 所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)。    

    UIControlEventTouchCancel                = 1 <<  8,      //所有触摸取消事件,即一次触摸因为放上了太多手指而被取消,或者被上锁或者电话呼叫打断。   

     UIControlEventValueChanged            = 1 << 12,    // 当控件的值发生改变时,发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知,在滑块被放下时发送,或者在被拖动时发送。    

    UIControlEventEditingDidBegin          = 1 << 16,    // 当文本控件中开始编辑时发送通知    

    UIControlEventEditingChanged          = 1 << 17,    // 当文本控件中的文本被改变时发送通知。    

    UIControlEventEditingDidEnd              = 1 << 18,    // 当文本控件中编辑结束时发送通知。    

    UIControlEventEditingDidEndOnExit    = 1 << 19,    // 当文本控件内通过按下回车键(或等价行为)结束编辑时,发送通知。    

    UIControlEventAllTouchEvents            = 0x00000FFF,  // 通知所有触摸事件。    

    UIControlEventAllEditingEvents          = 0x000F0000,  // 通知所有关于文本编辑的事件。    

    UIControlEventApplicationReserved    = 0x0F000000,  // range available for application use    

    UIControlEventSystemReserved          = 0xF0000000,  // range reserved for internal framework use    

    UIControlEventAllEvents                      = 0xFFFFFFFF  // 通知所有事件

};

UIButton的常见属性设置方法

- (void)setTitle:(NSString *)title forState:(UIControlState)state;//设置按钮的文字

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state;//设置按钮的文字颜色

- (void)setImage:(UIImage *)image forState:(UIControlState)state; //设置按钮内部的小图片

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state;//设置按钮的背景图片

btn.titleLabel.font = [UIFont systemFontOfSize:13];//设置按钮的文字字体(需要拿到按钮内部的label来设置)

- (NSString *)titleForState:(UIControlState)state; //获得按钮的文字

- (UIColor *)titleColorForState:(UIControlState)state;//获得按钮的文字颜色

- (UIImage *)imageForState:(UIControlState)state;//获得按钮内部的小图片

- (UIImage *)backgroundImageForState:(UIControlState)state;//获得按钮的背景图片

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

推荐阅读更多精彩内容