UIKit——UIButton

singmiya發表於2018-05-25

【譯】為避免撕逼,提前宣告:本文純屬翻譯,僅僅是為了學習,加上水平有限,見諒!

UIButton

控制你自定義程式碼執行來響應使用者互動的控制元件。

概述

當你點選一個按鈕或者選擇一個獲取焦點的按鈕時,它會執行任何與其繫結的動作。你使用文字標籤,圖片或者兩者來傳達按鈕的用途。按鈕的外觀時可配置的,所以你可以給按鈕著色,或者格式化標題來匹配應用的設計。你可以用程式碼或者IB把按鈕新增到介面上。

UIKit——UIButton
當往介面上新增按鈕的時候,執行一下步驟:

  1. 在建立按鈕的時候設定型別。
  2. 提供標題字串或者圖片;為按鈕設定合適的size。
  3. 給按鈕連線一個或多個動作。
  4. 設定自動佈局規則來控制按鈕在介面上的大小和位置。
  5. 提供可訪問性資訊和本地化字串。

響應按鈕點選

當使用者單擊按鈕的時候,按鈕用Target-Action設計模式通知你的應用。給按鈕分配一個動作方法並指派哪些事件觸發你的方法呼叫,而不是直接持有觸控事件。在執行時,按鈕會處理所有到來的觸控事件並呼叫你的方法作為響應。

你可以使用addTarget:action:forControlEvents:方法或者IB來連結按鈕和你的動作方法。動作方法簽名採用列舉在Listing1中的三種形式之一。選擇需要響應按鈕點選而提供資訊的形式。

Listing 1

- (IBAction)doSomething;
- (IBAction)doSomething:(id)sender;
- (IBAction)doSomething:(id)sender forEvent:(UIEvent*)event;
複製程式碼

配置按鈕外觀

按鈕的型別定義它的基本外觀和行為。 你可以使用buttonWithType:方法或者storyboard在建立按鈕的時候指定其型別。按鈕建立後,你就不能改變它的型別了。最常用的按鈕型別是CustomSystem型別,但也可以在適當的時候使用其他型別。

Note 如果要為應用中的所有按鈕配置外觀,需要使用外觀代理物件。UIButton類實現了appearance類方法,你可以通過這個方法獲取應用中所有按鈕的外觀代理。

按鈕狀態

按鈕有五個定義外觀的狀態:defaulthighlightedfocusedselecteddisabled。當你在介面上新增按鈕的時候,它處於default狀態,這意味著按鈕可用並且使用者沒有與其互動。當使用者與按鈕互動的時候,他的狀態會變成其他的值。例如,當使用者點選帶有標題的按鈕時,按鈕就會變成highlighted狀態。

當使用程式設計或者IB方式配置按鈕時,你可以分別為每個狀態指定屬性。在IB中,使用屬性檢查器State Config control來選擇合適的狀態並配置其他屬性。如果你沒有為特定的狀態設定屬性,UIButton類則會為其提供一個合理的預設行為。例如,一個不可用的按鈕通常都是暗灰色的並且當點選的時候不會呈現亮色。這個類的其他的屬性,例如adjustsImageWhenHighlightedadjustsImageWhenDisabled屬性,允許你在某些特殊情況下改變預設行為。

內容

按鈕的內容包含一個你指定的標題字串或者圖片。你指定的內容用來配置由按鈕自己管理的UILabel和UIImageView物件。你可以使用titleLabelimageView屬性來獲取這些物件,並且可以直接修改他們的值。這個類的方法也提供了配置字串和圖片外觀的快捷方法。

通常的,你可以用標題或者圖片來配置按鈕,並相應地調整其大小。按鈕也可以有一個背景圖片,它的位於你指定的內容的背後。你可以同時為按鈕設定一個標題和圖片,它的外觀就如圖2顯示的那樣。你可以使用顯式的屬性來獲取按鈕的當前內容。

圖2

當設定按鈕內容的時候,你必須為每一個狀態分別設定標題,圖片和外觀屬性。如果你沒有為特定狀態自定義外觀,按鈕會使用與預設狀態相關的值,並新增任何合適的定製。例如,在highlighted狀態,如果沒有提供自定義圖片,基於圖片的按鈕會在預設圖片的上方畫一個亮點。

底色

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

內凹邊界

你可以在自定或系統按鈕中使用內凹新增或移除內容周圍的空間。你可以分別設定按鈕標題(titleEdgeInsets),圖片(imageEdgeInsets)的內凹值或者標題和圖片contentEdgeInsets同時設定。當應用時,內凹會影響按鈕相應的內容矩形,自動佈局引擎正是用它來決定按鈕的位置的。

對於infocontactdisclosure等按鈕就不能調整內凹邊界了。

IB屬性

Table 1 列出了在IB中配置按鈕的核心屬性

Attribute Description
型別 按鈕型別。這個屬性決定很多按鈕屬性的預設設定。這個屬性的值無法在執行時改變,但是你可以使用buttonType屬性獲取型別值
狀態配置 狀態選擇器。在這個控制器中選擇一個值後,對按鈕屬性的改變就會應用到指定的狀態上
標題 按鈕的標題。你可以用一個簡單地字串或者屬性字串設定按鈕的標題
(標題字型和屬性) 應用到按鈕標題上的字型和其它屬性。具體的配置選項取決於你為按鈕設定的是一個簡單字串還是一個屬性字串。如果是簡單字串,那麼你就可以自定義字型,文字顏色和陰影顏色。對於屬性字串,你可以指定對齊方式,文字方向,刻痕,連字元和很多其他選項。
圖片 按鈕的前景圖片。通常的,你會給按鈕前景設定一個模板化圖片,但是你可以在Xcode工程中設定任何圖片。
背景 按鈕背景圖片。背景圖片在標題和前景圖片的底部。

Table 2 列出了影響按鈕外觀的屬性。

Attribute Description
陰影偏移 按鈕陰影的偏移和行為。陰影隻影響標題字串。當按鈕狀態改變為高亮或者從高亮改變為其他狀態時,啟用高亮反轉選項來改變陰影高亮顯示。
繪畫 按鈕的繪製行為。
換行 按鈕文字的換行選項。使用這個屬性去定義如何改變按鈕標題來適應可用空間。

Table 3 列出了邊緣內凹屬性。使用按鈕邊緣內凹來改變按鈕內容的矩形。

Attribute Description
邊界 要配置的邊緣內凹。你可以分別設定按鈕所有內容的邊緣內凹,標題和圖片。
內凹 內凹值。正值會縮小對應的邊界,讓它更靠向中心。負值會擴張邊界,讓它更遠離中心。在執行時可以使用titleEdgeInsetsimageEdgeInsetscontentEdgeInsets屬性獲取這些值。

關於按鈕繼承過來的IB屬性,請看UIControl和UIView。

國際化

為了國際化一個按鈕,需要為按鈕標題文字設定一個本地化字串。(你也許會適當的本地化一個按鈕圖片。)

當使用storyboard構建介面的時候,使用基於Xcode的國際化功能去配置你專案支援的本地化。當你新增本地化時,Xcode會建立一個本地化的字串檔案。當程式設計配置你的介面的時候,可以使用系統的內建支援來載入本地化字串和資源。關於介面國際化的更多資訊,請看國際化和本地化指南

可訪問性

預設按鈕是可訪問的。對於按鈕預設的可訪問特性是啟用按鈕和使用者互動。

當在裝置上啟用VoiceOver時,可訪問性籤,特徵和提示會回傳給使用者。按鈕標題會重寫他的可用性標籤;甚至如果你給標籤設定一個自定義值,VoiceOver也會說出標題的值。一旦使用者點選按鈕,VoiceOver會說出它的資訊。例如,當使用者點選相機的一個可選按鈕,VoiceOver會這樣說:

  • “Options. Button. Shows additional camera options.”

更多關於iOS控制訪問的資訊,請看在UIControl中的可訪問性資訊。關於讓你的介面可訪問的一般資訊,請看iOS可訪問性程式設計指南

話題

建立按鈕

+ buttonWithType:

方法建立並返回一個指定了型別的新按鈕。

宣告

+ (instancetype)buttonWithType:(UIButtonType)buttonType;
複製程式碼

引數

buttonType:按鈕型別。檢視可能的值請看

返回值

新建立的按鈕。

討論

這個方法是帶有特殊配置建立按鈕物件的便利構造器。如果你子類化UIButton,這個方法返回的實力不是你的子類。如果你想建立一個特定的子類,你需要直接呼叫 alloc/init方法來建立按鈕。

當建立一個自定義按鈕——按鈕的型別是UIButtonTypeCustom的時候,按鈕的初始frame是(0, 0, 0, 0)。在把按鈕新增到介面上之前,你需要把frame更新為適當的值。

UIButtonType

列舉指定按鈕的樣式。

宣告

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:**系統風格按鈕,同顯示在導航欄和工具欄上的按鈕一樣。 **UIButtonTypeDetailDisclosure:**詳情按鈕。 **UIButtonTypeInfoLight:**高亮背景的資訊按鈕。 **UIButtonTypeInfoDark:**深色背景的資訊按鈕。 **UIButtonTypeContactAdd:**聯絡方式新增按鈕。 **UIButtonTypePlain:**沒有模糊背景檢視的標準系統按鈕。 **UIButtonTypeRoundedRect:**圓角矩形按鈕。

配置按鈕標題

titleLabel

屬性為按鈕展示currentTitle屬性值的的檢視

宣告

@property(nonatomic, readonly, strong) UILabel *titleLabel;
複製程式碼

討論

儘管這個實現是隻讀的,但是它的屬性是可讀寫的。使用這些屬性初步的配置按鈕文字。例如:

UIButton *button = [UIButton buttonWithType: UIButtonTypeSystem];
button.titleLabel.font = [UIFont systemFontOfSize:12];
button.titleLabel.lineBreakMode = NSLineBreakTruncatingTail;
複製程式碼

不用使用標籤物件設定文字顏色和陰影顏色。而是,使用這個類的setTitleColor:forStatesetTitleShadowColor:forState:方法來設定這些值。使用setTitle:forState設定標籤的文字(button.titleLabel.text無法設定文字)。

甚至如果按鈕還沒有顯示出來,titleLabel屬性也會返回一個值。對於系統按鈕這個屬性的值是nil


- titleForState:

返回與指定狀態相關的標題。

宣告

- (NSString *)titleForState:(UIControlState)state;
複製程式碼

引數

*state:*使用標題的狀態。可用的狀態值在UIControlState中宣告。

返回值

特定狀態的標題。如果指定狀態沒有標題,這個方法會返回一個與UIControlStateNormal狀態相關的標題。


- setTitle:forState:

為特定狀態設定標題

宣告

- (void)setTitle:(NSString *)title forState:(UIControlState)state;
複製程式碼

引數

*title:*特定狀態使用的標題 *state:*特定標題使用的狀態,參看UIControlState


- attributedTitleForState:

返回與指定狀態相關的樣式化標題。


- setAttributedTitle:forState:

為指定狀態設定樣式化標題。


- titleColorForState:

返回特定狀態使用的標題顏色。


- setTitleColor:forState:

為特定狀態設定標題顏色。


- titleShadowColorForState:

返回特定狀態的陰影顏色。


- setTitleShadowColor:forState:

為特定狀態設定陰影顏色。


reversesTitleShadowWhenHighlighted

布林值,當按鈕高亮時,確定是否改變標題陰影。


配置按鈕展示

adjustsImageWhenHighlighted

布林值,確定當按鈕高亮時是否改變圖片。

adjustsImageWhenDisabled

布林值,確定當按鈕不可用時是否改變圖片。

showsTouchWhenHighlighted

布林值,確定點選按鈕時是否發光。

- backgroundImageForState:

返回特定狀態的背景圖片。

- imageForState:

返回特定狀態的圖片。

- setBackgroundImage:forState:

為特定狀態設定背景圖片。

- setImage:forState:

為特定狀體設定圖片。

tintColor

應用到按鈕標題和圖片上的底色。

配置邊緣內凹

titleEdgeInsets

設定標題邊框。

imageEdgeInsets

設定圖片邊框。

contentEdgeInsets

設定按鈕內容邊框。

獲取當前狀態

buttonWithType

按鈕型別。

currentTitle

當前標題。

currentAttributedTitle

獲取當前樣式化標題。

currentTitleColor

當前標籤顏色。

currentTitleShadowColor

當前標題陰影顏色。

currentImage

按鈕展示的當前圖片。

currentBackgroundImage

按鈕展示的當前背景圖片。

imageView

按鈕的圖片檢視。

獲取尺寸

- backgroundRectForBounds:

返回接收者繪製背景的矩形。

- contentRectForBounds:

返回接收者繪製整個內容的矩形。

- titleRectForContentRect:

返回接收者繪製標題的矩形。

- imageRectForContentRect:

返回接收者繪製圖片的矩形。


addTarget:action:forControlEvents:

將目標物件和動作方法與空間關聯起來。

宣告

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
複製程式碼

引數

*target:*目標物件,即呼叫動作方法的物件。如果你設定為nil,UIKit會為物件在響應鏈上查詢響應指定動作的訊息,並把該訊息傳遞給這個物件。 *action:*稱作動作方法的選擇器識別符號。你可以指定一個匹配UIControl中任何方法簽名的選擇器。這個引數必須非空。 *controlEvents:*一個用於標識呼叫動作方法的特定控制事件的位掩碼。通常指定至少一個常量。常量列表,請看UIControlEvents