[英]How to set the UIButton state to be highlighted after pressing it
我有一個典型的要求,我需要按下按鈕后保持按鈕處於高亮狀態。 我需要執行一項任務,該任務僅在按鈕處於突出顯示狀態時才有效。 實際上我正在設置按鈕狀態以編程方式突出顯示。
[sender setHighlighted:YES];
一旦按鈕處於突出顯示狀態,我需要執行另一個操作。
- (IBAction)changeState: (UIButton*)sender
{
if (sender.highlighted == YES)
{
[self performSomeAtion:sender];
}
}
但是,令我恐懼的是,無論何時按下任何按鈕,上述情況都會變為真實,並且正在重復執行操作。 有沒有什么方法可以讓我按下它后保持UIButton的狀態突出顯示?
編輯 - 實際上我需要為按鈕的3種不同狀態執行3種不同的操作。 我已經在使用選定的狀態和正常狀態了。 現在,我需要利用突出顯示的狀態。
[sender setSelected:YES];
或者您可以使用UIButton( notselectedimage.png
和selectedimage.png
)的兩個圖像模擬此效果,然后使用BOOL變量(如BOOL buttonCurrentStatus;
)保持跟蹤按鈕狀態BOOL buttonCurrentStatus;
。 然后在.h文件中:
BOOL buttonCurrentStatus;
並在.m文件中
// connect this method with Touchupinside function
- (IBAction)changeState:(UIButton*)sender
{
/* if we have multiple buttons, then we can
differentiate them by tag value of button.*/
// But note that you have to set the tag value before use this method.
if([sender tag] == yourButtontag){
if (buttonCurrentStatus == NO)
{
buttonCurrentStatus = YES;
[butt setImage: [UIImage imageNamed:@"selectedImage.png"] forState:UIControlStateNormal];
//[self performSomeAction:sender];
}
else
{
buttonCurrentStatus = NO;
[butt setImage:[UIImage imageNamed:@"notSelectedImage.png"] forState:UIControlStateNormal];
//[self performSomeAction:sender];
}
}
}
- (void)mybutton:(id)sender
{
UIButton *button = (UIButton *)sender;
button.selected = ![button isSelected]; // Important line
if (button.selected)
{
NSLog(@"Selected");
NSLog(@"%i",button.tag);
}
else
{
NSLog(@"Un Selected");
NSLog(@"%i",button.tag);
}
}
突出顯示的狀態用於在觸摸時突出顯示按鈕。 按鈕中的觸碰事件突出顯示它。 您應該使用“選定”狀態。
如果您要執行的操作是在按下按鈕后執行操作,請不要將方法附加到狀態更改事件,請將方法附加到TouchUpInside事件。
我找到了一種方法,所以我分享一下,以防萬一......
我保留了我的UIButton並為每個狀態設置了一個圖像(因此你可以進入4狀態按鈕)。 我將UserInteractionEnabled設置為NO - >此按鈕不會接收任何觸摸。 第一個按鈕的目的是顯示狀態
我創建了第二個自定義UIButton,其框架與第一個相同。 對於這個,沒有為狀態設置圖像(它是一個完全透明的按鈕)。 此按鈕的目的是捕捉觸摸事件。 所以我在TouchUpInside事件上為此按鈕添加了一個目標。 然后當事件被觸發時,我將第一個按鈕的狀態更改為Disabled,Highlighted,Selected或者沒有這些狀態(= Default state)。
一切都像魅力一樣!
你描述它的方式,你最好將子類化為UIView來創建你自己的三態按鈕。
實際上,您甚至應該實現自己的多狀態buttonView,並通過PNG數組內部管理狀態,並通過一系列狀態來了解它被按下的次數。
使用[sender setSelected: YES];
,我認為這對你有用。
僅適用於iOS 7:您應該考慮將圖像renderMode設置為UIImageRenderingModeAlwaysTemplate。 然后,您可以使用tintColor表示各種狀態。
解決方案很棘手,但這是可能的。
問題是您嘗試在按鈕操作方法中更改突出顯示的狀態,我想在操作結束時進行清理或檢查過程並切換突出顯示的狀態。 當您嘗試調試它時,您將獲得突出顯示的= 1但它將在最后更改。
奇怪,但你的“3狀態按鈕”有時很有用,當你想按下“高亮”模式按鈕時,如“選擇”模式,根據3種狀態獲得不同的動作。 唯一的問題是您無法分析此問題或在按鈕操作方法中將其切換為突出顯示模式,因為當用戶將其推送並在結束時將其切換回來時,它將立即切換到突出顯示模式。
解決方案是使用調度。
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[theButton setHighlighted:YES];
});
這將解決問題,您可以使用3種狀態。
據蘋果的UIButton有一個屬性的ImageView :
雖然此屬性是只讀的,但它自己的屬性是可讀/寫的。 使用這些屬性配置按鈕視圖的外觀和行為
這意味着您可以在IB(在故事板中)設置此按鈕的圖片並設置突出顯示的圖片:
button.highlighted = true
。 另外,檢查配置控件屬性下的UIControl以獲取更多狀態。 您也可以按照以下方式以編程方式執行此操作:
Swift(在Objective-C中幾乎相同):
// Setting the highlighted image
self.someButton.imageView?.highlightedImage = UIImage(named: "imageNameFromImageAssest")
// someButton will now some the highlighted image and NOT the image set in the IB
self.someButton.imageView?.highlighted = true
UIButton *btn_tmp=sender;
if(!(btn_tmp.selected))
{
[btn_temp setHighlighted:YES];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.