二、设置button 属性
(1)设置button的位置(frame)
button.
frame
=
CGRectMake
(2
0
,
20
, 5
0
, 5
0
);
(2)设置button背景
1、背景色
button.
backgroundColor
= [
UIColor
clearColor
];
[button
setBackgroundColor
:[
UIColor
blueColor
]];
2、设置图片
[button
setImage
:[
UIImage
imageNamed
:
@"6.jpeg"
]
forState
:
UIControlStateNormal
];
[button
setBackgroundImage
:[
UIImage
imageNamed
:
@"6.jpeg"
]
forState
:
UIControlStateNormal
];
- UIControlStateNormal — 常规状态显现
- UIControlStateHighlighted — 高亮状态显现
- UIControlStateDisabled — 禁用的状态才会显现
- UIControlStateSelected — 选中状态
- UIControlStateApplication — 当应用程序标志是
- UIControlStateReserved — 为内部框架预留,可以不用管
(3)设置按钮按下时会发光
button.
showsTouchWhenHighlighted
=
YES
;
(4)添加圆角操作
button.
layer
.
cornerRadius
=
CGRectGetWidth
(button.
frame
)/
2
;
//
获取按钮的宽
/2
button.
layer
.
masksToBounds
=
YES
;
//
切掉圆角
(5)添加边框
button.
layer
.
borderWidth
=
1
;
button.
layer
.
borderColor
= [
UIColor
lightGrayColor
].
CGColor
;
//
获取图层颜色
(6)唯一数字标识符
button.
tag
=
100
;
(7)是否可用(禁用)
button.
showsTouchWhenHighlighted
=
YES
;
(8)adjustsImageWhenHighlighted - 设置当按钮高亮时图片是否改变,为真时图片随按钮高亮而高亮
(9)adjustsImageWhenDisabled - 设置当按钮高亮时图片是否改变,为真时图片随按钮失效而变暗
(10)顶部 / 底层
[
self
.
view
bringSubviewToFront
:button];
//
放到最上层
[
self
.
view
sendSubviewToBack
:button];
//
最底层
三、设置button的内部
(1)设置按钮的标题
1、设置标题
[button
setTitle
:
@"确定"
forState
:
UIControlStateNormal
];
2、设置标题的颜色
[button
setTitleColor
:[
UIColor
blackColor
]
forState
:
UIControlStateNormal
];
3
、设置标题的字体
button.
titleLabel
.
font
= [
UIFont
systemFontOfSize
:
24
];
(说明
:
按钮中为了显示文本
,
包含了一个标签)
(2)设置按钮内部图片间距和标题间距
UIEdgeInsets
insets;
//
设置按钮内部图片间距
insets.
top
= insets.
bottom
= insets.
right
= insets.
left
=
10;
button.
contentEdgeInsets
= insets;
//
内容间距
button.
titleEdgeInsets
= insets;
//
标题间距
button.
imageEdgeInsets
= insets;
// 图像
间距
(3)button上的子控件的对齐方式
1、
水平
对齐方式
button.
contentHorizontalAlignment
=
UIControlContentHorizontalAlignmentLeft;
2、
垂直对齐方式
button.
contentVerticalAlignment
=
UIControlContentVerticalAlignmentTop
;
(4)设置图片的显示方式
button.
clipsToBounds
=
YES
;
// 超出边界的地方被隐藏
button.
imageView
.
contentMode
=
UIViewContentModeScaleAspectFit
;
- UIViewContentModeScaleToFill - 根据视图的比例去拉伸图片内容
- UIViewContentModeScaleAspectFit - 保持图片内容的纵横比例,来适应视图的大小
- UIViewContentModeScaleAspectFill - 用图片内容来填充视图的大小,多余的部分可以被修剪掉来填充整个视图边界
- UIViewContentModeRedraw - 单视图的尺寸位置发生变化时,通过调用setNeedsDisplay方法来重新显示
(以下都是保持图片的原比例在视图中显示图片内容,只是显示位置不一样。如果视图大小 小于 图片的尺寸,则图片会超出视图边界)
- UIViewContentModeCenter - 在视图中间显示
- UIViewContentModeTop - 中间顶部
- UIViewContentModeBottom - 中间底部
- UIViewContentModeLeft - 中间左边
- UIViewContentModeRight - 中间右边
- UIViewContentModeTopLeft - 在视图左上角显示
- UIViewContentModeTopRight - 右上角
- UIViewContentModeBottomLeft - 左下角
- UIViewContentModeBottomRight - 右下角
【注意以上几个常量,凡是没有带Scale的,当图片尺寸超过ImageView尺寸时,只有部分显示在ImageView中。UIViewContentModeScaleToFill属性会导致图片变形。
UIViewContentModeScaleAspectFit会保证图片比例不变,而且全部显示在ImageView中,这意味着ImageView会有部分空白。
UIViewContentModeScaleAspectFill也会证图片比例不变,但是是填充整个ImageView的,可能只有部分图片显示出来。】
当button的样式是UIButtonTypeSystem样式的时候,可以设置图片的渲染
(5)偏移
button.
contentEdgeInsets
=
UIEdgeInsetsMake
(
0
,
20
,
0
,
0
);
接下来是UIControl对象
UIControl是UIView的子类,当然也是UIResponder的子类。UIControl是诸如UIButton、UISwitch、UITextField等控件的父类,它本身也包含了一些属性和方法,但是不能直接使用UIControl类,它只是定义了子类都需要使用的方法。
UIControl对象采用了一种新的事件处理机制,将前一节直接处理的触摸事件转换成简单操作,这样可以无需关心用户访问控件的具体方式。触摸事件到达UIControl对象(由响应者链派遣)后,在UIResponder的方法中(如touchBegan:withEvent)中,UIControl将标准的触摸事件转换为特殊的控件事件,简单的理解就是,UIControl把复杂的触摸事件封装成了简单的易于使用的控件事件。例如通过UIControl对象处理后,按下按钮的事件就被封装成一个控件事件,而不用去判断触摸屏幕的整个操作过程。
例如按钮的单击事件:UIControlEventTouchUpInside
我们所需要知道的是UIControl首先将触摸事件转换为控件事件,再转换为带接收放的操作。我们只要编写第二次转换的代码,就是将控件事件转换为有目标的操作。
使用addTarget:action:forControlEvents
这是UIControl的一个方法,为指定的控件对象添加事件,例如:
[controlObj addTarget:recepientObj action @selector(method) froControlEvents : UIControlEvents];
controlObj是要响应事件的控件对象;
参数receientObj是要把消息发送到哪里,一般是self,通常指实例化控件对象的控制器;
action后面是一个选择器,表示该事件需要响应的方法,事件做什么其实就写在这个方法里面;
最后一个是事件类型,表示响应什么样的事件。
使用的两种方式:
1.通过代码
在代码中新建一个按钮,然后为按钮对象添加addTarget:action:forControlEvents方法,然后编写响应方法即可。
2.通过可视化实现
在IB中按住control键,点击鼠标从按钮拖动到对应的.h文件中,就建立了一个IBAction方法,在此方法中编写事件逻辑便可完成事件响应,用这种方法相比第一种来说更直观,开发效率也更高。