记录一个UIButton 切换选中状态时展示图片错误的问题

代码如下

- (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的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值