ios中UIButton選中狀態切換


關於UIButton的事件枚舉有許多,平時用的少所以很多的都不是很清楚,今天了解了下,看了以前的代碼,覺得在UIButton選中時操作寫了許多冗余代碼,而忽略了UIButton一個很重要的屬性,如下:

  1. typedef NS_OPTIONS(NSUInteger, UIControlState) {  
  2.     UIControlStateNormal       = 0,  
  3.     UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set  
  4.     UIControlStateDisabled     = 1 << 1,  
  5.     UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)  
  6. #ifndef SDK_HIDE_TIDE  
  7.     UIControlStateFocused NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 3, // Applicable only when the screen supports focus  
  8. #endif  
  9.     UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use  
  10.     UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use  
  11. };  

中的UIControlStateSelected表示是否選中,NO表示未選中,YES表示選中;

1.這是之前寫的:

創建UIButton,通過for 循環去創建

  1. //頂部view的初始化  
  2. - (void)initTopView{  
  3.       
  4.     topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreen_width, 40)];  
  5.     topFrame = topView.frame;  
  6.     topView.backgroundColor = [UIColor whiteColor];  
  7.     topView.alpha = .8;  
  8.       
  9.     NSArray *titleArr = @[@"人氣",@"價格",@"桌數",@"優惠"];  
  10.     for (int i = 0; i < titleArr.count; i ++) {  
  11.         UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];  
  12.         [btn setTitle:titleArr[i] forState:UIControlStateNormal];  
  13.         [btn setImage:[UIImage imageNamed:@"ph"] forState:UIControlStateNormal];  
  14.         [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];  
  15.         [btn setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];  
  16.         btn.titleLabel.font = [UIFont systemFontOfSize:12];  
  17.         btn.showsTouchWhenHighlighted = YES;  
  18.         btn.frame = CGRectMake(10 + i * ((kScreen_width - 50)/4 + 10) , 10, (kScreen_width - 50)/4, 25);  
  19.         //設置tag值  
  20.         btn.tag = i + 100;  
  21.         [btn addTarget:self action:@selector(choose:) forControlEvents:UIControlEventTouchUpInside];  
  22.         [topView addSubview:btn];  
  23.     }  
  24.       
  25.     [self.view addSubview:topView];  
  26. }  


添加響應事件:

  1. //人氣、價格、作品數、優惠  
  2. - (void)choose:(UIButton *)sender{  
  3.     for (int i = 0; i < 4; i++) {  
  4.         UIButton *btn = (UIButton *)[[sender superview]viewWithTag:100 + i];  
  5.         [btn setSelected:NO];  
  6.         if (!btn.selected) {  
  7.             [btn setImage:[UIImage imageNamed:@"ph"] forState:UIControlStateNormal];  
  8.             [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];  
  9.             [btn setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];  
  10.         }  
  11.     }  
  12.     UIButton *button = (UIButton *)sender;  
  13.     [button setSelected:YES];  
  14.     [button setImage:[UIImage imageNamed:@"pho"] forState:UIControlStateNormal];  
  15.     [button setTitleColor:[UIColor colorWithRed:170.0/255 green:107.0/255 blue:208.0/255 alpha:1] forState:UIControlStateNormal];  
  16.     [button setBackgroundImage:[UIImage imageNamed:@"button2"] forState:UIControlStateNormal];  
  17. }  


這種是最簡單的,相對也是最繁瑣的,多了很多不必要的冗余代碼,下面就讓我們看看改進的;

2.通過使用UIButton自己的一個selected屬性和normal屬性重構的,如下所示

  1. -(void)initUIButtonView{  
  2.       
  3.     _titleArr = @[@"人氣",@"價格",@"桌數",@"優惠"];  
  4.       
  5.     for (int i = 0; i < _titleArr.count; i ++) {  
  6.         UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];  
  7.         btn.frame = CGRectMake(10 + i * ((kScreen_width - 50)/4 + 10) , 20, (kScreen_width - 50)/4, 25);  
  8.         [btn setTitle:_titleArr[i] forState:UIControlStateNormal];  
  9.         btn.titleLabel.font = [UIFont systemFontOfSize:12];  
  10.         btn.showsTouchWhenHighlighted = YES;  
  11.         //設置tag值  
  12.         btn.tag = i + 100;  
  13.         btn.selected = NO;  
  14.         [btn addTarget:self action:@selector(choose:) forControlEvents:UIControlEventTouchUpInside];  
  15.         [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];  
  16.         [btn setImage:[UIImage imageNamed:@"ph"] forState:UIControlStateNormal];  
  17.         [btn setBackgroundImage:[UIImage imageNamed:@"button1"] forState:UIControlStateNormal];  
  18.   
  19.         [btn setTitleColor:[UIColor colorWithRed:170.0/255 green:107.0/255 blue:208.0/255 alpha:1] forState:UIControlStateSelected];  
  20.         [btn setImage:[UIImage imageNamed:@"pho"] forState:UIControlStateSelected];  
  21.         [btn setBackgroundImage:[UIImage imageNamed:@"button2"] forState:UIControlStateSelected];  
  22.         [self.view addSubview:btn];  
  23.     }  
  24.   
  25. }  

在創建的時候就給定了正常時候UIButton的樣式,和選中UIButton時的按鈕顏色,注意這里設置了默認的selected = NO;和UIControlStateSelected

在給定按鈕選擇事件,設置對應selected的狀態值,如下所示:

  1. //人氣、價格、作品數、優惠  
  2. - (void)choose:(UIButton *)sender{  
  3.     for (int i = 0; i < _titleArr.count; i++) {  
  4.         UIButton *btn = (UIButton *)[[sender superview]viewWithTag:100 + i];  
  5.         [btn setSelected:NO];  
  6.     }  
  7.     UIButton *button = (UIButton *)sender;  
  8.     [button setSelected:YES];  
  9. }  


這樣看上去,第二種方法,是不是比第一種方法更簡單明了,去除了相關的冗余代碼的,效果如下所示


注:改進,上面的我們可以在不同的按鈕上面切換狀態,但在同一個按鈕上面點擊多次狀態不會改變,針對上述問題做了些許的改動,其實主要是在點擊事件里面,判斷當前按鈕的狀態去改變,代碼如下:

  1. //人氣、價格、作品數、優惠  
  2. - (void)choose:(UIButton *)sender{  
  3.     for (int i = 0; i < _titleArr.count; i++) {  
  4.         UIButton *btn = (UIButton *)[[sender superview]viewWithTag:100 + i];  
  5.         //選中當前按鈕時  
  6.         if (sender.tag == btn.tag) {  
  7.               
  8.             sender.selected = !sender.selected;  
  9.         }else{  
  10.               
  11.             [btn setSelected:NO];  
  12.         }  
  13.     }  
  14.   
  15. }  


效果圖如下所示:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM