UIButton基本狀態及各種疊加狀態詳解

史前圖騰發表於2017-12-13

帶你深入理解UIButton的Normal狀態,為什麼有時候點選按鈕時,本來應該顯示為高亮的按鈕卻變成了Normal狀態?


一、按鈕的狀態

1.UIControlStateHighlighted

 1> 【當按住按鈕不鬆開】或者用程式碼【button.highlighted = YES】時就能達到這種狀態
 2> 這種狀態下的按鈕【可以】接收點選事件,顯示為【highlighted】狀態下的文字顏色和圖片
複製程式碼

2.UIControlStateDisabled

 1> 【button.enabled = NO】時就能達到這種狀態
 2> 這種狀態下的按鈕【無法】接收點選事件,顯示為【Disabled】狀態下的文字顏色和圖片
複製程式碼

3.UIControlStateSelected

 1> 【button.selected = YES】時就能達到這種狀態
 2> 這種狀態下的按鈕【可以】接收點選事件,顯示為【selected】狀態下的文字顏色和圖片
複製程式碼

4.UIControlStateNormal

   1> 除開UIControlStateHighlightedUIControlStateDisabledUIControlStateSelected
以外的其他情況,都是normal狀態,包括以上幾種狀態的疊加狀態都會【顯示】為normal狀態下的文字顏色和圖片
   2> 這種狀態下的按鈕【可以】接收點選事件,但是如果是由【button.enabled = NO】狀態和其它狀態疊加則不可點選
複製程式碼

二、讓按鈕無法點選的2種方法

1> button.enabled = NO; *【會】進入UIControlStateDisabled狀態,顯示的圖片,文字顏色改變

2> button.userInteractionEnabled = NO; *【不會】進入UIControlStateDisabled狀態,繼續保持當前狀態


比如以下程式碼,

  • 執行後為Normal狀態的紅色按鈕,
  • 點選螢幕讓按鈕進入【selected】狀態,顯示為藍色,
  • 再點選按鈕本身不鬆開,按鈕會再進入【highlighted】狀態,本來應該顯示為綠色,但是卻發現按鈕變成了紅色(Normal狀態). 就是因為【selected】狀態和【highlighted】狀態兩種狀態疊加後就變成了Normal狀態.

#import "ViewController.h"
#import "MYButton.h"

@interface ViewController ()
/** 按鈕 */
@property (nonatomic, weak) MYButton *button;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    MYButton *button = [[MYButton alloc] init];
    [button setTitle:@"我是按鈕" forState:UIControlStateNormal];
    button.frame = CGRectMake(100, 100, 100, 30);
    [button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    self.button = button;
    
    // 文字顏色
    [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [button setTitleColor:[UIColor greenColor] forState:UIControlStateHighlighted];
    [button setTitleColor:[UIColor blueColor] forState:UIControlStateSelected];
    [button setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
}

- (void)buttonClick {
    NSLog(@"%s", __func__);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    self.button.selected = YES;
}
@end
複製程式碼

相關文章