簡體   English   中英

UIButton將圖像設置為正常狀態,將該圖像隱藏為不同狀態

[英]UIButton set image for state normal, hide that image in different states

[button setImage: [UIImage imageNamed:@"Back.png"] forState:UIControlStateNormal];
[button setTitle: @"Title" forState:UIControlStateSelected];

我希望按鈕在正常狀態下顯示圖像,但在選定狀態下顯示“標題”字樣。 但是我無法使此代碼正常工作。 當我單擊按鈕將其顯示為選定狀態時,它將顯示圖像,並且圖像會覆蓋標題。 我無法擺脫處於選定狀態的圖像。

 [button setImage: [UIImage imageNamed:@"Back.png"] forState:UIControlStateNormal];
 [button setImage: [UIImage imageNamed:@"Back2.png"] forState:UIControlStateSelected];

但這有效。 圖像從“后退”翻轉到“后退2”。 或其他方式也可以

[button setImage: [UIImage imageNamed:@"Back.png"] forState:UIControlStateSelected];
[button setTitle: @"Title" forState:UIControlStateNormal];

它是如此簡單,我開始認為這是UIButton錯誤。
有人嘗試過嗎?

在您的項目中添加一些小的透明圖像(足夠1px)並命名,例如,transparent.png。 然后將此行添加到代碼中:

[button setImage: [UIImage imageNamed:@"transparent"] forState:UIControlStateSelected];

另一個簡單得多的解決方案是使用界面生成器並為不同狀態設置圖像。 在這種情況下,您甚至不需要使用透明圖像。 只需將“圖片”字段留為“選定”狀態即可。

在此處輸入圖片說明

就像@codeplasma答案一樣,但無需添加透明圖像,只需創建一個空的UIImage

button.setImage(UIImage(), forState: .Selected)

在Objective-C中,您可以使用[UIImage new]創建它。

您必須在某些UIButton中將按鈕狀態顯式設置為選中狀態(如四舍五入的rect按鈕),單擊后不會自動發生。

錯誤?

不,這不是錯誤,UIButton是按這種方式設計的,原因如下:在為UIButtonUIControlStateNormal (正常狀態)設置圖像時,它將在整個其他狀態(選中,禁用,突出顯示)中保留該圖像如果您沒有為其他州指定圖片,請執行以下操作。

這意味着您可以用單個圖像設置按鈕,系統在突出顯示狀態下添加深色突出顯示,並使按鈕在禁用狀態下看起來像alpha 0.5。

您可能會認為將所選狀態的圖像設置為nil會擺脫該狀態的影響,但是當然,當狀態更改時,它將看到它沒有該狀態的圖像(它為nil !),但是它對狀態UIControlStateNormal ,因此它將改用該狀態,因此您將陷入同一張圖片中!

請注意,如果將圖像設置為不同於正常狀態的圖像,則只會顯示該狀態的圖像。

解決方法

坦白地說,您對按鈕的圖像/標題的意圖聽起來有些奇怪...也許您是iOS的新手,也許還提供了有關按鈕的功能以及應該做什么的更多信息,我們可以建議一個更好的解決方案...但是,通過您提供給我們的信息解決此問題的最簡單方法是為所選狀態提供有效的圖像,該圖像最好是透明的,為了節省空間,它可以是1x1像素。

否則,您可以執行此操作,在運行時創建一個UIImage用作充當圖像的占位符,但是最好將其緩存,也許只創建一次並將其保存在iVar中

// Create a 1x1 UIImage at runtime
UIGraphicsBeginImageContext((CGSize){1.0f,1.0f});
UIImage *runtimeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// Setup your button 
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(20.0, 20.0, 100.0, 100.0);

// set the image for each state
[btn setImage:[UIImage imageNamed:@"Back.png"] forState:UIControlStateNormal];
[btn setImage:runtimeImage forState:UIControlStateSelected];

// have your text for the normal state
[btn setTitle:@"selected !" forState:UIControlStateNormal];

建議不要在這種情況下使用SetBackgroundImage,而不要使用setImage。 這是一個適用於我的類似解決方案:

UIImage *cardBackImage = [UIImage imageNamed:@"card.png"];
UIImage *cardFrontImage = [UIImage imageNamed:@"transparent.png"];

[cardButton setBackgroundImage:cardFrontImage forState:UIControlStateSelected];
[cardButton setBackgroundImage:cardFrontImage forState:UIControlStateSelected|UIControlStateDisabled];

[cardButton setBackgroundImage:cardBackImage forState:UIControlStateNormal];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM