![iOS开发:从零基础到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/796/26793796/b_26793796.jpg)
7.4 按钮控件UIButton
7.4.1 基本使用
UIButton是App中最常见的UI控件之一,同时由于UIButton能够显示不同状态下的文字以及图片,因此在实际开发中的应用也是非常的灵活。
1.UIButton的构成(如图7-33所示)
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P206_23212.jpg?sign=1739314131-3wGcQdeiuiXNSB7FtJUuSehE41RymJ8p-0-fda57fecd3f88905f18c307a267f9cef)
图7-33 按钮的构成
一个UIButton按钮由3个属性组成。
- 图标currentImage:左侧的图片,默认在左边。在显示的时候,会显示图片的实际大小。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T206_23216.jpg?sign=1739314131-Ayd2Zzm13QXP5fquCUgfMF0IJKPi8AhY-0-d6aa8993b95ba1727e3f24f0bba0e698)
- 标题currentTitle:按钮上显示的文字,默认在右边。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T206_23218.jpg?sign=1739314131-sIOlpeLIYagMabE9ZhhyJE1LjqZaN5jk-0-4bfc9c1aa795c48348b67ad6115689f5)
- 背景图片currentBackgroundImage:背景图片默认占满整个按钮。在实际开发中,普遍需要对美工提供的背景图片拉伸显示。为了实现拉伸效果,可以直接修改图片的Slicing属性,修改方法见前面章节中的介绍。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T206_23220.jpg?sign=1739314131-9Zs7O2eRaOoncxtteGVF7fOlsQIWMnzu-0-8749c1cd23e4f6b5fdb98280478fc729)
2.UIButton的状态
当点击按钮时,按钮的image以及title是可以改变的。这是因为UIButton可以设置几种状态,针对每个状态可以定制不同的样式。UIButton按钮有以下5个状态。
- UIControlStateNormal:默认状态;
- UIControlStateHighlighted:高亮状态;
- UIControlStateDisabled:失效状态;
- UIControlStateSelected:选中状态;
- UIControlStateFocused:聚焦状态。
对于每个状态,都可以设置不同的图标、标题以及背景图片,使用如下方法:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T207_23292.jpg?sign=1739314131-SwwKc4xYNDFGmKI4Jv0ijL6kxCstfr34-0-679dd2f7b291e9bc96f61ca81af4137e)
另外,也有几个常用属性的设置不需要区分状态,如:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T207_23294.jpg?sign=1739314131-nKHfwITx2beS0Vkd4TOx78Azsupco7hU-0-8d7db689896a70e6f5aa3631b5746824)
3.UIButton点击动作的实现方法
按钮的作用就是用来监控用户的点击,为了能够实现点击按钮后去完成特定的业务逻辑,可以使用以下两种方法来监控按钮的点击。
- 使用Target-Action方法监听用户点击事件UIControlEventTouchUpInside。如下代码所示,当用户点击按钮时,会调用myAction:方法中实现的业务逻辑。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T207_23296.jpg?sign=1739314131-2Kcupy4LtZanRC2w40lpuQRptLI90B6m-0-1042e40fa207db0d047c5d033be4739a)
- 在interface builder/StoryBoard中,对按钮进行连线,其中,Event中选择Touch Up Inside,添加成功后,控制器中会出现myAction:方法,如图7-34所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P207_23298.jpg?sign=1739314131-CvjLkJuoCHx4rIUeTIZ7brRHI8bEobkm-0-e74b08740399b36ee50733d2f89b963c)
图7-34 按钮连线添加方法
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T207_23301.jpg?sign=1739314131-v9To4asLTENRDDTghw7L6l1nkKmYf1MV-0-25558d087ae4b114c8d93c07afda1deb)
7.4.2 按钮的创建
1.使用代码创建
当使用代码创建UIButton对象时,最重要的是需要针对按钮不同状态设置其外观属性。下面的示例代码创建了一个UIButton类型的对象,并且对正常状态以及点击状态的外观进行了设置,当点击按钮时,会调用myAction:中实现的业务逻辑。
- 新建一个Single View Application工程,并导入两张图片,分别用于正常状态以及点击状态时按钮的图标。
- 在ViewController.m中添加如下代码,创建一个UIButton对象并且对其属性进行设置,并把该按钮添加到控制器view上。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T208_23409.jpg?sign=1739314131-wBjGfxwlOIenWr0oQwYHH2rChgteIqa2-0-9685273783a1f7146c7bc64d11b3fb21)
- 实现点击按钮时执行的myAction:方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T208_23411.jpg?sign=1739314131-oTqPe26S5tEozAPwRNmp2HMJEvmbYtVq-0-cb275116cd6d53444f521411d91704a4)
运行结果如图7-35所示,当程序运行后,可以看到一个红色背景的按钮,其中包含一个图标以及文字描述。
当用户点击按钮时,按钮的图标以及文字可以发生改变,并且会调用myAction:方法,如图7-36、图7-37所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P208_23413.jpg?sign=1739314131-97l7FxWGnymPDbi1TUEqq5vqz2ry7aOn-0-101ffdb09bbae3ca4a33b7d79abe4207)
图7-35 按钮正常状态
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P208_23416.jpg?sign=1739314131-VBCI3ynX2uXwUPxMS3oYNd9th0NGbRmz-0-e404303c183815a2ab1ddc6a20dd2158)
图7-36 按钮高亮状态
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P209_23455.jpg?sign=1739314131-9wNZmiqJHXgSlIXjZIDvgydh9ES4MKzt-0-0c8e292575951042f2e63583dfb90ab3)
图7-37 运行结果
2.使用XIB创建
当使用XIB或者在Storyboard中创建按钮对象时,同样需要根据按钮的状态设置其外观,只不过此时不再需要编写代码,而是通过界面的配置即可实现。
- 添加UIButton控件,并设置其属性,如图7-38所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P209_23459.jpg?sign=1739314131-zyDYuaz4hGLxTtYK5OcywGr7WxPtRXgb-0-677a0fce89c76fc4054a8aecef243876)
图7-38 XIB创建按钮
- 通过切换State Config中的选项,可以设置按钮不同状态下的外观属性,如图7-39所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P209_23463.jpg?sign=1739314131-jKkedlOvTOEkpU0xFfw1a3Tmef6cBWJ7-0-9efbb980f7ead3e6f3e9f491af082355)
图7-39 设置按钮状态
- 对按钮进行连线,实现按钮点击时执行的方法,如图7-40所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P210_23504.jpg?sign=1739314131-fvpauEv2fS3KbgqxxRO7kzzrjisRPq83-0-dcca8dc7120ce57aa2984f2844cf3902)
图7-40 添加方法
7.4.3 调整图标与标题的位置
默认创建的按钮,其图标与标题是紧紧靠在一起的,并且图标在左,标题在右。实际开发过程中,出于美观的考虑,图标和标题之间会拉开一定的距离,甚至有些情况需要互换图标与标题的位置,如图7-41所示。
1.通过XIB进行调整
在XIB或StroyBoard中,Xcode提供了用于调整图标与标题位置的工具,如图7-42所示。通过Xcode提供的配置工具,可以对图标的位置、标题的位置以及对图标标题的整体位置进行调整。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P210_23509.jpg?sign=1739314131-ParZJrIIj4DyIMrHOkaHiGbPpnlCHSpX-0-1b4e0e532b0dc8e8136f0ea434b1ffd6)
图7-41 按钮
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P210_23512.jpg?sign=1739314131-tipC1MmD4LGoqihvzMT2JhGjRRRBMxLX-0-078ab92768ec92eaa006cdd8be7ee84e)
图7-42 调整相对位置
例如,通过调整其中的Title Insets和Image Insets,可以改变图标与标题的间距,如图7-43所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P211_23573.jpg?sign=1739314131-EWSPuq0Bb7h1zU0FmqTB2L14VPD13Rcy-0-54a11d559bca1f10b9aff1c57a74a743)
图7-43 改变位置后样式
2.通过代码进行调整
对于使用代码创建的按钮,同样可以使用代码调整图标与标题的位置,在UIButton类中提供了如下3个属性。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T211_23577.jpg?sign=1739314131-3v9bZ2WMT8EJzeFoclMZz9Q5NZXtJKwH-0-504679fcff8dc5278a11bda0fecabffe)
通过调整imageEdgeInsets以及titleEdgeInsets同样可以达到同样的效果。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T211_23579.jpg?sign=1739314131-4YOKHcnvNq8w2YD17g8GTQ8e3SyHSf65-0-b63b460a61a4bfe76dde1130de99222a)
调整后的显示效果如图7-44所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P211_23581.jpg?sign=1739314131-zTbQpgqwsKvD2i5ueyFFJfn9EWpjatXh-0-ae549dfe31823131969b769cd2db7c65)
图7-44 显示效果