代码如下
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 100, 100, 50);
[self.view addSubview:button];
[button setImage:[UIImage imageNamed:@"PCAttentionDefault"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"PCAttentionSelected"] forState:UIControlStateSelected];
[button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
button.backgroundColor = [UIColor cyanColor];
}
- (void)click:(UIButton *)button
{
// button.selected = !button.selected;
self.attention = !self.attention;
UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge];
[activityView startAnimating];
[button addSubview:activityView];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[activityView stopAnimating];
button.selected = self.attention;
});
}
就是一个按钮有选中状态和未选中状态,
未选中状态的按钮时‘+’, 选中状态的按钮是‘✔’,
如图,
并且我们点击的时候,要进行一个请求,请求成功之后要改变按钮的状态
当按钮处在未选中状态的时候,我们点击按钮,这时候按钮处于高亮状态,这时候按钮展示的图标仍然是未选中的图标,是没有问题的,但是,当按钮处在选中状态的时候,我们点击按钮,这时候高亮的按钮展示的也是未选中状态的按钮,放开之后,由于按钮状态还没改变,又恢复到选中状态,等到请求成功之后,变成为选中状态,展示为选中的图标,这就导致在选中的情况先,点击按钮会
导致一个连续的变换图标的问题
即 选中态图标 - > 未选中图标-> 选中态图标->未选中图标
原因:就是默认的情况下,UIButton 展示的图标是 UIControlStateNormal 状态的图片
思路,既然是高亮状态下的图片展示的又问题,我们能不能通过设置高亮状态下的按钮的图片来修复呢,即
如下代码
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 100, 100, 50);
[self.view addSubview:button];
[button setImage:[UIImage imageNamed:@"PCAttentionDefault"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"PCAttentionSelected"] forState:UIControlStateSelected];
button.adjustsImageWhenHighlighted = NO;
// [button setImage:[UIImage imageNamed:@"PCAttentionDefault"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
button.backgroundColor = [UIColor cyanColor];
}
- (void)click:(UIButton *)button
{
// button.selected = !button.selected;
self.attention = !self.attention;
UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge];
[activityView startAnimating];
[button addSubview:activityView];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[activityView stopAnimating];
button.selected = self.attention;
if (button.selected) {
[button setImage:[UIImage imageNamed:@"PCAttentionSelected"] forState:UIControlStateHighlighted];
} else {
[button setImage:[UIImage imageNamed:@"PCAttentionDefault"] forState:UIControlStateHighlighted];
}
});
}
效果:
我们发现,我们设置的高亮状态的图片,
只在按钮在normal状态下的条件下点击变成高亮的时候起作用,如果是在selected的情况下,我们点击变成高亮的时候,展示的仍然时候normal的图片,所以,通过设置不同的高亮状态图片也是行不通的,
所以,目前找到的方法就是点击之后,直接修改状态,即
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 100, 100, 50);
[self.view addSubview:button];
[button setImage:[UIImage imageNamed:@"PCAttentionDefault"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"PCAttentionSelected"] forState:UIControlStateSelected];
button.adjustsImageWhenHighlighted = NO;
// [button setImage:[UIImage imageNamed:@"PCAttentionDefault"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
button.backgroundColor = [UIColor cyanColor];
}
- (void)click:(UIButton *)button
{
// button.selected = !button.selected;
self.attention = !self.attention;
button.selected = self.attention;
UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge];
[activityView startAnimating];
[button addSubview:activityView];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[activityView stopAnimating];
});
}
效果
当然,如果我们网络请求失败了,还是要恢复原来的状态的,我们这里只是修复UI的问题