ios 中按鈕組(類似ButtonGroup)的實現
阿新 • • 發佈:2019-01-27
ios中我們可能需要用到多個按鈕單選的情況,類似於C#中的ButtonGroup,我遇到的情況是按鈕比較大,是一張圖片,多個帶圖片按鈕提供選擇,只能選擇一個按鈕,選擇另一個按鈕後,原來選中的按鈕就會取消選中。
利用UIButton的兩個State設定選中和未選中時不同的圖片:
UIControlStateNormal 設定為image1.png
UIControlStateSelected 設定為image2.png
selectedButton表示當前選中的按鈕,未選中設為nil
按鈕被選中函式觸發後,判斷selectedButton是否是當前按的按鈕, 若是將當前的按鈕的selected屬性設為No, 並將selectedButton設為nil. 若不是當前按的按鈕, 將selectedButton的selected屬性設為No, 當前按鈕的selected屬性設為YES,並將selctedButton設為當前按鈕, 若selectedButton為nil, 則將當前按鈕的slected屬性設為YES, slectedButton設為當前按鈕.
程式碼如下:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. [self.button1 setImage:[UIImage imageNamed:@"elephant1.png"] forState:UIControlStateNormal]; [self.button1 setImage:[UIImage imageNamed:@"elephant2.png"] forState:UIControlStateSelected]; [self.button1 addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside]; [self.button2 setImage:[UIImage imageNamed:@"cow1.png"] forState:UIControlStateNormal]; [self.button2 setImage:[UIImage imageNamed:@"cow2.png"] forState:UIControlStateSelected]; [self.button2 addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside]; [self.button3 setImage:[UIImage imageNamed:@"elephant1.png"] forState:UIControlStateNormal]; [self.button3 setImage:[UIImage imageNamed:@"elephant2.png"] forState:UIControlStateSelected]; [self.button3 addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside]; [self.button4 setImage:[UIImage imageNamed:@"cow1.png"] forState:UIControlStateNormal]; [self.button4 setImage:[UIImage imageNamed:@"cow2.png"] forState:UIControlStateSelected]; [self.button4 addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside]; }
- (void)clickButton:(UIButton*)button{ if (selectedButton != nil) { [selectedButton setSelected:NO]; } if (selectedButton == button) { [button setSelected:NO]; selectedButton = nil; } else{ [button setSelected:YES]; selectedButton = button; } }