【譯】為避免撕逼靶溜,提前聲明:本文純屬翻譯,僅僅是為了學習懒震,加上水平有限罩息,見諒!
UIButton
控制你自定義代碼執(zhí)行來響應用戶交互的控制組件个扰。
概述
當你點擊一個按鈕或者選擇一個獲取焦點的按鈕時瓷炮,它會執(zhí)行任何與其綁定的動作。你使用文本標簽递宅,圖片或者兩者來傳達按鈕的用途娘香。按鈕的外觀時可配置的,所以你可以給按鈕著色办龄,或者格式化標題來匹配應用的設計烘绽。你可以用代碼或者IB把按鈕添加到界面上。
當往界面上添加按鈕的時候俐填,執(zhí)行一下步驟:
- 在創(chuàng)建按鈕的時候設置類型安接。
- 提供標題字符串或者圖片;為按鈕設置合適的size英融。
- 給按鈕連接一個或多個動作赫段。
- 設置自動布局規(guī)則來控制按鈕在界面上的大小和位置呀打。
- 提供可訪問性信息和本地化字符串。
響應按鈕點擊
當用戶單擊按鈕的時候糯笙,按鈕用Target-Action設計模式通知你的應用。給按鈕分配一個動作方法并指派哪些事件觸發(fā)你的方法調用撩银,而不是直接持有觸摸事件给涕。在運行時,按鈕會處理所有到來的觸摸事件并調用你的方法作為響應额获。
你可以使用addTarget:action:forControlEvents:方法或者IB來鏈接按鈕和你的動作方法够庙。動作方法簽名采用列舉在Listing1中的三種形式之一。選擇需要響應按鈕點擊而提供信息的形式抄邀。
Listing 1
- (IBAction)doSomething;
- (IBAction)doSomething:(id)sender;
- (IBAction)doSomething:(id)sender forEvent:(UIEvent*)event;
配置按鈕外觀
按鈕的類型定義它的基本外觀和行為耘眨。 你可以使用buttonWithType:方法或者storyboard
在創(chuàng)建按鈕的時候指定其類型。按鈕創(chuàng)建后境肾,你就不能改變它的類型了剔难。最常用的按鈕類型是Custom
和System
類型,但也可以在適當?shù)臅r候使用其他類型奥喻。
Note
如果要為應用中的所有按鈕配置外觀偶宫,需要使用外觀代理對象。UIButton
類實現(xiàn)了appearance類方法环鲤,你可以通過這個方法獲取應用中所有按鈕的外觀代理纯趋。
按鈕狀態(tài)
按鈕有五個定義外觀的狀態(tài):default
,highlighted
冷离,focused
吵冒,selected
和disabled
。當你在界面上添加按鈕的時候西剥,它處于default
狀態(tài)痹栖,這意味著按鈕可用并且用戶沒有與其交互。當用戶與按鈕交互的時候蔫耽,他的狀態(tài)會變成其他的值结耀。例如,當用戶點擊帶有標題的按鈕時匙铡,按鈕就會變成highlighted
狀態(tài)图甜。
當使用編程或者IB方式配置按鈕時,你可以分別為每個狀態(tài)指定屬性鳖眼。在IB中黑毅,使用屬性檢查器State Config control
來選擇合適的狀態(tài)并配置其他屬性。如果你沒有為特定的狀態(tài)設置屬性钦讳,UIButton
類則會為其提供一個合理的默認行為矿瘦。例如枕面,一個不可用的按鈕通常都是暗灰色的并且當點擊的時候不會呈現(xiàn)亮色。這個類的其他的屬性缚去,例如adjustsImageWhenHighlighted和adjustsImageWhenDisabled屬性潮秘,允許你在某些特殊情況下改變默認行為。
內容
按鈕的內容包含一個你指定的標題字符串或者圖片易结。你指定的內容用來配置由按鈕自己管理的UILabel和UIImageView對象枕荞。你可以使用titleLabel和imageView屬性來獲取這些對象,并且可以直接修改他們的值搞动。這個類的方法也提供了配置字符串和圖片外觀的快捷方法躏精。
通常的,你可以用標題或者圖片來配置按鈕鹦肿,并相應地調整其大小矗烛。按鈕也可以有一個背景圖片,它的位于你指定的內容的背后箩溃。你可以同時為按鈕設置一個標題和圖片瞭吃,它的外觀就如圖2顯示的那樣。你可以使用顯式的屬性來獲取按鈕的當前內容碾篡。
當設置按鈕內容的時候虱而,你必須為每一個狀態(tài)分別設置標題,圖片和外觀屬性开泽。如果你沒有為特定狀態(tài)自定義外觀牡拇,按鈕會使用與默認狀態(tài)相關的值,并添加任何合適的定制穆律。例如惠呼,在highlighted
狀態(tài),如果沒有提供自定義圖片峦耘,基于圖片的按鈕會在默認圖片的上方畫一個亮點剔蹋。
底色
你可以使用tintColor為自定義按鈕指定底色。這個屬性為按鈕的圖片或者文本設置顏值辅髓。如果你沒有設置底色泣崩,按鈕會使用父視圖的底色。
內凹邊界
你可以在自定或系統(tǒng)按鈕中使用內凹添加或移除內容周圍的空間洛口。你可以分別設置按鈕標題(titleEdgeInsets)矫付,圖片(imageEdgeInsets)的內凹值或者標題和圖片contentEdgeInsets同時設置。當應用時第焰,內凹會影響按鈕相應的內容矩形买优,自動布局引擎正是用它來決定按鈕的位置的。
對于info
,contact
杀赢,disclosure
等按鈕就不能調整內凹邊界了烘跺。
IB屬性
Table 1 列出了在IB中配置按鈕的核心屬性
Attribute | Description |
---|---|
類型 | 按鈕類型。這個屬性決定很多按鈕屬性的默認設置脂崔。這個屬性的值無法在運行時改變滤淳,但是你可以使用buttonType屬性獲取類型值 |
狀態(tài)配置 | 狀態(tài)選擇器。在這個控制器中選擇一個值后砌左,對按鈕屬性的改變就會應用到指定的狀態(tài)上 |
標題 | 按鈕的標題娇钱。你可以用一個簡單地字符串或者屬性字符串設置按鈕的標題 |
(標題字體和屬性) | 應用到按鈕標題上的字體和其它屬性。具體的配置選項取決于你為按鈕設置的是一個簡單字符串還是一個屬性字符串绊困。如果是簡單字符串,那么你就可以自定義字體适刀,文本顏色和陰影顏色秤朗。對于屬性字符串,你可以指定對齊方式笔喉,文本方向取视,刻痕,連字符和很多其他選項常挚。 |
圖片 | 按鈕的前景圖片作谭。通常的,你會給按鈕前景設置一個模板化圖片奄毡,但是你可以在Xcode工程中設置任何圖片折欠。 |
背景 | 按鈕背景圖片。背景圖片在標題和前景圖片的底部吼过。 |
Table 2 列出了影響按鈕外觀的屬性锐秦。
Attribute | Description |
---|---|
陰影偏移 | 按鈕陰影的偏移和行為。陰影只影響標題字符串盗忱。當按鈕狀態(tài)改變?yōu)楦吡粱蛘邚母吡粮淖優(yōu)槠渌麪顟B(tài)時酱床,啟用高亮反轉選項來改變陰影高亮顯示。 |
繪畫 | 按鈕的繪制行為趟佃。 |
換行 | 按鈕文本的換行選項扇谣。使用這個屬性去定義如何改變按鈕標題來適應可用空間。 |
Table 3 列出了邊緣內凹屬性闲昭。使用按鈕邊緣內凹來改變按鈕內容的矩形罐寨。
Attribute | Description |
---|---|
邊界 | 要配置的邊緣內凹。你可以分別設置按鈕所有內容的邊緣內凹汤纸,標題和圖片衩茸。 |
內凹 | 內凹值。正值會縮小對應的邊界,讓它更靠向中心楞慈。負值會擴張邊界幔烛,讓它更遠離中心。在運行時可以使用contentEdgeInsets囊蓝,titleEdgeInsets和imageEdgeInsets屬性獲取這些值饿悬。 |
關于按鈕繼承過來的IB屬性,請看UIControl和UIView聚霜。
國際化
為了國際化一個按鈕狡恬,需要為按鈕標題文本設置一個本地化字符串。(你也許會適當?shù)谋镜鼗粋€按鈕圖片蝎宇。)
當使用storyboard
構建界面的時候弟劲,使用基于Xcode
的國際化功能去配置你項目支持的本地化。當你添加本地化時姥芥,Xcode會創(chuàng)建一個本地化的字符串文件兔乞。當編程配置你的界面的時候,可以使用系統(tǒng)的內置支持來加載本地化字符串和資源凉唐。關于界面國際化的更多信息庸追,請看國際化和本地化指南。
可訪問性
默認按鈕是可訪問的台囱。對于按鈕默認的可訪問特性是啟用按鈕和用戶交互淡溯。
當在設備上啟用VoiceOver時,可訪問性簽簿训,特征和提示會回傳給用戶咱娶。按鈕標題會重寫他的可用性標簽;甚至如果你給標簽設置一個自定義值煎楣,VoiceOver也會說出標題的值豺总。一旦用戶點擊按鈕,VoiceOver會說出它的信息择懂。例如喻喳,當用戶點擊相機的一個可選按鈕,VoiceOver會這樣說:
- “Options. Button. Shows additional camera options.”
更多關于iOS控制訪問的信息困曙,請看在UIControl中的可訪問性信息表伦。關于讓你的界面可訪問的一般信息,請看iOS可訪問性編程指南慷丽。
話題
創(chuàng)建按鈕
<span id="buttonWithType:">+ buttonWithType:</span>
方法
創(chuàng)建并返回一個指定了類型的新按鈕蹦哼。
聲明
+ (instancetype)buttonWithType:(UIButtonType)buttonType;
參數(shù)
buttonType:按鈕類型。查看可能的值請看UIButtonType要糊。
返回值
新創(chuàng)建的按鈕纲熏。
討論
這個方法是帶有特殊配置創(chuàng)建按鈕對象的便利構造器。如果你子類化UIButton
,這個方法返回的實力不是你的子類局劲。如果你想創(chuàng)建一個特定的子類勺拣,你需要直接調用 alloc/init
方法來創(chuàng)建按鈕。
當創(chuàng)建一個自定義按鈕——按鈕的類型是UIButtonTypeCustom的時候鱼填,按鈕的初始frame是(0, 0, 0, 0)药有。在把按鈕添加到界面上之前,你需要把frame更新為適當?shù)闹怠?/p>
<span id="UIButtonType">UIButtonType</span>
枚舉
指定按鈕的樣式苹丸。
聲明
iOS
typedef enum UIButtonType : NSInteger {
UIButtonTypeCustom = 0,
UIButtonTypeSystem,
UIButtonTypeDetailDisclosure,
UIButtonTypeInfoLight,
UIButtonTypeInfoDark,
UIButtonTypeContactAdd,
UIButtonTypeRoundedRect = UIButtonTypeSystem
} UIButtonType;
tvOS
typedef enum UIButtonType : NSInteger {
UIButtonTypeCustom = 0,
UIButtonTypeSystem,
UIButtonTypeDetailDisclosure,
UIButtonTypeInfoLight,
UIButtonTypeInfoDark,
UIButtonTypeContactAdd,
UIButtonTypePlain,
UIButtonTypeRoundedRect = UIButtonTypeSystem
} UIButtonType;
常量
UIButtonTypeCustom:沒有按鈕樣式
UIButtonTypeSystem:系統(tǒng)風格按鈕愤惰,同顯示在導航欄和工具欄上的按鈕一樣。
UIButtonTypeDetailDisclosure:詳情按鈕赘理。
UIButtonTypeInfoLight:高亮背景的信息按鈕宦言。
UIButtonTypeInfoDark:深色背景的信息按鈕。
UIButtonTypeContactAdd:聯(lián)系方式添加按鈕商模。
UIButtonTypePlain:沒有模糊背景視圖的標準系統(tǒng)按鈕蜡励。
UIButtonTypeRoundedRect:圓角矩形按鈕。
配置按鈕標題
<span id="titleLabel">titleLabel</span>
屬性
為按鈕展示currentTitle
屬性值的的視圖
聲明
@property(nonatomic, readonly, strong) UILabel *titleLabel;
討論
盡管這個實現(xiàn)是只讀的阻桅,但是它的屬性是可讀寫的。使用這些屬性初步的配置按鈕文本兼都。例如:
UIButton *button = [UIButton buttonWithType: UIButtonTypeSystem];
button.titleLabel.font = [UIFont systemFontOfSize:12];
button.titleLabel.lineBreakMode = NSLineBreakTruncatingTail;
不用使用標簽對象設置文本顏色和陰影顏色嫂沉。而是,使用這個類的setTitleColor:forState和setTitleShadowColor:forState:方法來設置這些值扮碧。使用setTitle:forState設置標簽的文本(button.titleLabel.text
無法設置文本)趟章。
甚至如果按鈕還沒有顯示出來,titleLabel
屬性也會返回一個值慎王。對于系統(tǒng)按鈕這個屬性的值是nil
蚓土。
<span id="tfs">- titleForState:</span>
返回與指定狀態(tài)相關的標題。
聲明
- (NSString *)titleForState:(UIControlState)state;
參數(shù)
state:使用標題的狀態(tài)赖淤∈衿幔可用的狀態(tài)值在UIControlState中聲明。
返回值
特定狀態(tài)的標題咱旱。如果指定狀態(tài)沒有標題确丢,這個方法會返回一個與UIControlStateNormal狀態(tài)相關的標題。
<span id="stcfs">- setTitle:forState:</span>
為特定狀態(tài)設置標題
聲明
- (void)setTitle:(NSString *)title forState:(UIControlState)state;
參數(shù)
title:特定狀態(tài)使用的標題
state:特定標題使用的狀態(tài)吐限,參看UIControlState
<span id="atttfs">- attributedTitleForState:</span>
返回與指定狀態(tài)相關的樣式化標題鲜侥。
<span id="satfs">- setAttributedTitle:forState:</span>
為指定狀態(tài)設置樣式化標題。
<span id="tcfs">- titleColorForState:</span>
返回特定狀態(tài)使用的標題顏色诸典。
- setTitleColor:forState:
為特定狀態(tài)設置標題顏色描函。
- titleShadowColorForState:
返回特定狀態(tài)的陰影顏色。
<span id="stscfs">- setTitleShadowColor:forState:</span>
為特定狀態(tài)設置陰影顏色。
reversesTitleShadowWhenHighlighted
布爾值舀寓,當按鈕高亮時胆数,確定是否改變標題陰影。
配置按鈕展示
<span id="adjustsiwh">adjustsImageWhenHighlighted</span>
布爾值基公,確定當按鈕高亮時是否改變圖片幅慌。
<span id="adjustsiwd">adjustsImageWhenDisabled</span>
布爾值,確定當按鈕不可用時是否改變圖片轰豆。
showsTouchWhenHighlighted
布爾值胰伍,確定點擊按鈕時是否發(fā)光。
- backgroundImageForState:
返回特定狀態(tài)的背景圖片酸休。
- imageForState:
返回特定狀態(tài)的圖片骂租。
- setBackgroundImage:forState:
為特定狀態(tài)設置背景圖片。
- setImage:forState:
為特定狀體設置圖片斑司。
tintColor
應用到按鈕標題和圖片上的底色渗饮。
配置邊緣內凹
<span id="titleEdgeInsets">titleEdgeInsets</span>
設置標題邊框。
<span id="imageEdgeInsets">imageEdgeInsets</span>
設置圖片邊框宿刮。
<span id="contentEdgeInsets">contentEdgeInsets</span>
設置按鈕內容邊框互站。
獲取當前狀態(tài)
<span id="buttonWithType">buttonWithType</span>
按鈕類型。
currentTitle
當前標題僵缺。
currentAttributedTitle
獲取當前樣式化標題胡桃。
currentTitleColor
當前標簽顏色。
currentTitleShadowColor
當前標題陰影顏色磕潮。
currentImage
按鈕展示的當前圖片翠胰。
currentBackgroundImage
按鈕展示的當前背景圖片。
imageView
按鈕的圖片視圖自脯。
獲取尺寸
- backgroundRectForBounds:
返回接收者繪制背景的矩形之景。
- contentRectForBounds:
返回接收者繪制整個內容的矩形。
- titleRectForContentRect:
返回接收者繪制標題的矩形膏潮。
- imageRectForContentRect:
返回接收者繪制圖片的矩形锻狗。
<span id="addTarget">addTarget:action:forControlEvents:</span>
將目標對象和動作方法與空間關聯(lián)起來。
聲明
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
參數(shù)
target:目標對象焕参,即調用動作方法的對象屋谭。如果你設置為nil,UIKit
會為對象在響應鏈上查找響應指定動作的消息龟糕,并把該消息傳遞給這個對象桐磁。
action:稱作動作方法的選擇器標識符。你可以指定一個匹配UIControl
中任何方法簽名的選擇器讲岁。這個參數(shù)必須非空我擂。
controlEvents:一個用于標識調用動作方法的特定控制事件的位掩碼衬以。通常指定至少一個常量。常量列表校摩,請看UIControlEvents