UIKit——UIButton

【譯】爲避免撕逼,提早聲明:本文純屬翻譯,僅僅是爲了學習,加上水平有限,見諒!html

UIButton

控制你自定義代碼執行來響應用戶交互的控制組件。編程

概述

當你點擊一個按鈕或者選擇一個獲取焦點的按鈕時,它會執行任何與其綁定的動做。你使用文本標籤,圖片或者二者來傳達按鈕的用途。按鈕的外觀時可配置的,因此你能夠給按鈕着色,或者格式化標題來匹配應用的設計。你能夠用代碼或者IB把按鈕添加到界面上。 設計模式

當往界面上添加按鈕的時候,執行一下步驟:

  1. 在建立按鈕的時候設置類型。
  2. 提供標題字符串或者圖片;爲按鈕設置合適的size。
  3. 給按鈕鏈接一個或多個動做。
  4. 設置自動佈局規則來控制按鈕在界面上的大小和位置。
  5. 提供可訪問性信息和本地化字符串。

響應按鈕點擊

當用戶單擊按鈕的時候,按鈕用Target-Action設計模式通知你的應用。給按鈕分配一個動做方法並指派哪些事件觸發你的方法調用,而不是直接持有觸摸事件。在運行時,按鈕會處理全部到來的觸摸事件並調用你的方法做爲響應。bash

你可使用addTarget:action:forControlEvents:方法或者IB來連接按鈕和你的動做方法。動做方法簽名採用列舉在Listing1中的三種形式之一。選擇須要響應按鈕點擊而提供信息的形式。app

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屬性,容許你在某些特殊狀況下改變默認行爲。ui

內容

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

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

圖2

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

底色

你可使用http://www.javashuo.com/tag/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

相關文章
相關標籤/搜索