UIKit——UIButton

【譯】為避免撕逼靶溜,提前聲明:本文純屬翻譯,僅僅是為了學習懒震,加上水平有限罩息,見諒!

UIButton

控制你自定義代碼執(zhí)行來響應用戶交互的控制組件个扰。

概述

當你點擊一個按鈕或者選擇一個獲取焦點的按鈕時瓷炮,它會執(zhí)行任何與其綁定的動作。你使用文本標簽递宅,圖片或者兩者來傳達按鈕的用途娘香。按鈕的外觀時可配置的,所以你可以給按鈕著色办龄,或者格式化標題來匹配應用的設計烘绽。你可以用代碼或者IB把按鈕添加到界面上。


image

當往界面上添加按鈕的時候俐填,執(zhí)行一下步驟:

  1. 在創(chuàng)建按鈕的時候設置類型安接。
  2. 提供標題字符串或者圖片;為按鈕設置合適的size英融。
  3. 給按鈕連接一個或多個動作赫段。
  4. 設置自動布局規(guī)則來控制按鈕在界面上的大小和位置呀打。
  5. 提供可訪問性信息和本地化字符串。

響應按鈕點擊

當用戶單擊按鈕的時候糯笙,按鈕用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)建后境肾,你就不能改變它的類型了剔难。最常用的按鈕類型是CustomSystem類型,但也可以在適當?shù)臅r候使用其他類型奥喻。

Note
如果要為應用中的所有按鈕配置外觀偶宫,需要使用外觀代理對象。UIButton類實現(xiàn)了appearance類方法环鲤,你可以通過這個方法獲取應用中所有按鈕的外觀代理纯趋。

按鈕狀態(tài)

按鈕有五個定義外觀的狀態(tài):defaulthighlighted冷离,focused吵冒,selecteddisabled。當你在界面上添加按鈕的時候西剥,它處于default狀態(tài)痹栖,這意味著按鈕可用并且用戶沒有與其交互。當用戶與按鈕交互的時候蔫耽,他的狀態(tài)會變成其他的值结耀。例如,當用戶點擊帶有標題的按鈕時匙铡,按鈕就會變成highlighted狀態(tài)图甜。

當使用編程或者IB方式配置按鈕時,你可以分別為每個狀態(tài)指定屬性鳖眼。在IB中黑毅,使用屬性檢查器State Config control來選擇合適的狀態(tài)并配置其他屬性。如果你沒有為特定的狀態(tài)設置屬性钦讳,UIButton類則會為其提供一個合理的默認行為矿瘦。例如枕面,一個不可用的按鈕通常都是暗灰色的并且當點擊的時候不會呈現(xiàn)亮色。這個類的其他的屬性缚去,例如adjustsImageWhenHighlightedadjustsImageWhenDisabled屬性潮秘,允許你在某些特殊情況下改變默認行為。

內容

按鈕的內容包含一個你指定的標題字符串或者圖片易结。你指定的內容用來配置由按鈕自己管理的UILabelUIImageView對象枕荞。你可以使用titleLabelimageView屬性來獲取這些對象,并且可以直接修改他們的值搞动。這個類的方法也提供了配置字符串和圖片外觀的快捷方法躏精。

通常的,你可以用標題或者圖片來配置按鈕鹦肿,并相應地調整其大小矗烛。按鈕也可以有一個背景圖片,它的位于你指定的內容的背后箩溃。你可以同時為按鈕設置一個標題和圖片瞭吃,它的外觀就如圖2顯示的那樣。你可以使用顯式的屬性來獲取按鈕的當前內容碾篡。

圖2

當設置按鈕內容的時候虱而,你必須為每一個狀態(tài)分別設置標題,圖片和外觀屬性开泽。如果你沒有為特定狀態(tài)自定義外觀牡拇,按鈕會使用與默認狀態(tài)相關的值,并添加任何合適的定制穆律。例如惠呼,在highlighted狀態(tài),如果沒有提供自定義圖片峦耘,基于圖片的按鈕會在默認圖片的上方畫一個亮點剔蹋。

底色

你可以使用tintColor為自定義按鈕指定底色。這個屬性為按鈕的圖片或者文本設置顏值辅髓。如果你沒有設置底色泣崩,按鈕會使用父視圖的底色。

內凹邊界

你可以在自定或系統(tǒng)按鈕中使用內凹添加或移除內容周圍的空間洛口。你可以分別設置按鈕標題(titleEdgeInsets)矫付,圖片(imageEdgeInsets)的內凹值或者標題和圖片contentEdgeInsets同時設置。當應用時第焰,內凹會影響按鈕相應的內容矩形买优,自動布局引擎正是用它來決定按鈕的位置的。

對于infocontact杀赢,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囊蓝,titleEdgeInsetsimageEdgeInsets屬性獲取這些值饿悬。

關于按鈕繼承過來的IB屬性,請看UIControlUIView聚霜。

國際化

為了國際化一個按鈕狡恬,需要為按鈕標題文本設置一個本地化字符串。(你也許會適當?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:forStatesetTitleShadowColor: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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末看峻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子衙吩,更是在濱河造成了極大的恐慌互妓,老刑警劉巖贝攒,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纬朝,死亡現(xiàn)場離奇詭異预皇,居然都是意外死亡娱俺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門嵌莉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掩幢,“玉大人缤骨,你說我怎么就攤上這事浮禾〗慌撸” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵盈电,是天一觀的道長蝴簇。 經常有香客問我,道長匆帚,這世上最難降的妖魔是什么军熏? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮卷扮,結果婚禮上,老公的妹妹穿的比我還像新娘均践。我一直安慰自己晤锹,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布彤委。 她就那樣靜靜地躺著鞭铆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焦影。 梳的紋絲不亂的頭發(fā)上车遂,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音斯辰,去河邊找鬼舶担。 笑死,一個胖子當著我的面吹牛彬呻,可吹牛的內容都是我干的衣陶。 我是一名探鬼主播柄瑰,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剪况!你這毒婦竟也來了教沾?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤译断,失蹤者是張志新(化名)和其女友劉穎授翻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孙咪,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡堪唐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了该贾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羔杨。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杨蛋,靈堂內的尸體忽然破棺而出兜材,到底是詐尸還是另有隱情,我是刑警寧澤逞力,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布曙寡,位于F島的核電站,受9級特大地震影響寇荧,放射性物質發(fā)生泄漏举庶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一揩抡、第九天 我趴在偏房一處隱蔽的房頂上張望户侥。 院中可真熱鬧,春花似錦峦嗤、人聲如沸蕊唐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽替梨。三九已至,卻和暖如春装黑,著一層夾襖步出監(jiān)牢的瞬間副瀑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工恋谭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糠睡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓疚颊,卻偏偏與公主長得像铜幽,于是被迫代替她去往敵國和親滞谢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理除抛,服務發(fā)現(xiàn)狮杨,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程到忽,因...
    小菜c閱讀 6,365評論 0 17
  • 1.ios高性能編程 (1).內層 最小的內層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 29,334評論 8 265
  • 一個UIButton的實例變量橄教, 使一個按鈕(button)在觸摸屏上生效。一個按鈕監(jiān)聽觸摸事件喘漏,當被點擊時护蝶,給目...
    wushuputi閱讀 1,497評論 0 1
  • 1 所選詞匯 漢字,只有... 才翩迈, 忘記持灰,不如,自從...就负饲,吸引堤魁,說不定 正文 自從去年就我開始學習漢語了。我...
    Shaobo閱讀 452評論 0 3