UIButton
UIButton
类总述
为了响应用户的交互动作,UIButton 对象可以执行自定义的代码。当你按下按钮时,或选择一个已经获取焦点的按钮时,按钮就会执行任何绑定到它上面的动作。通过文本、或图片、或两者结合的方面表达按钮的意图。按钮的外观是可配置的,因此,你可以给按钮着色,或者为了匹配应用的设计,对按钮的标题进行格式化。可以使用程序动态的添加按钮,也可以使用 Interface Builder。
概述
按照以下的步骤在界面上添加一个按钮:
-
在按钮创建时,为按钮设置类型
-
提供一个文本标题或图片;根据内容,为按钮设置合适的尺寸
-
给按钮连接一个或多个方法
-
设置 Auto Layout 规则,用于在界面上管理按钮的尺寸和位置
-
提供有用的信息和本地化的字符
关于 view 基本行为的更多信息,请参见 View Programming Guide for iOS。
响应按钮点击
当用户点击按钮时,按钮使用 Target-Action 的方式通知应用。不会直接处理点击事件,而是给按钮分配一个动作方法,指定哪些事件可以触发这些方法的调用。在运行时,按钮会处理所有收到的点击事件,然后调用指定的方法进行响应。
使用 addTarget(_: action: for:) 方法把按钮与动作方法连接起来,或者也可以在 Interface Builder 中创建这样的连接。动作方法的签名有三种形式,如列表1中所示。选择一种形式,然后提示响应按钮点击时的信息就可以了。
列表1,按钮的动作方法
- @IBAction func dosomething();
- @IBAction func dosomething(sender: UIButton);
- @IBAction func dosomething(sender: UIButton, forEvent event: UIEvent);
配置按钮外观
按钮的类型定义了按钮的外观和行为。在按钮创建时,使用 init(type:) 方法指定按钮的类型,或者,可以在故事板中进行设置。注意:按钮完成初始化后,样式不能被改变。最常用的按钮类型是:Custom 和 System ,当然,其余的类型适用于某些场景。
注意:
在应用中,要统一配置所有按钮的外观,需要使用
appearance proxy 对象。UIButton 类实现了
appearance() 方法,可以使用该方法获取应用中所有按钮的外观代理。
按钮状态
按钮有五种定义了外观的状态:default,highlighted,focused,selected,disabled。当往界面上添加按钮时,最初,按钮是默认状态,这也就意味着按钮是可用的,并且,用户还没和按钮发生交互。当用户与按钮发生交互时,按钮的状态就变成了其它的值。例如,当用户按下按钮,并持续了一段时间,那么,按钮就变成了高亮状态。
不论是用代码生成的按钮,还是使用 interface Builder 创建的按钮,都需要为按钮的每一种状态指定单独的属性。在 interface Builder 中,使用 Attributes inspector 面板中的 State Config control 来选择合适的状态和配置其它属性。如果某种状态没有指定合适的值,那么,UIButton 类会提供一个合理的默认行为。例如,一个处于 disabled 状态的按钮,一般来说是灰色的,并且当它被点击时,并不会显示为高亮。
按钮内容
按钮的内容由开发者指定的字符或图片组成。按钮的内容被用来配置由按钮本身管理的 UILabel 和 UIImageView 对象。直接可以通过按钮的 titleLabel 或 imageview 属性来获取值或对已经存在的值做改变。同时,UIButton 类也提供了配置字符和图片的快捷方法。
通常,要么使用标题,要么使用图片来确定按钮的尺寸。按钮也可以有背景图片,背景图片会出现在内容的后面。可以为按钮既指定背景图片,又指定图片和标题,这样做的结果正如 图1 显示的那样,使用图中标明的属性,就能获取对应元素的值。
图1:给按钮提供了标题和图片
在设置按钮的内容时,必须为每一种状态单独地指定标题,图片和外观属性。如果某个状态下没有指定内容,那么按钮将会使用默认状态的值,并添加合适的自定制。例如,高亮状态下,如果没有提供自定义的图片,在按钮的默认图片上,将会绘制一个高亮。
着色
使用 tiniColor 属性给按钮指定颜色。该属性设置了按钮图片和文本的颜色。如果没有显示地指定该属性的值,那么,按钮就会使用它父控件的 tintColor 值。
边界插图(Edge Insets)
在 custom 或 system 类型的按钮上,使用 insets 可以添加或移除围绕在内容周围的空白。可以分别为标题(titleEdgeInsets)、图片(imageEdgeInsets)或标题与图片的整体(contentEdgeInsets)指定各自的 insets。如果设置了 insets,它会影响按钮的矩形,按钮的矩形被自动布局引擎(Auto Layout engine)用来检测按钮的位置。