一、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;//获得按钮的背景图片