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

news/2024/7/20 21:00:53 标签: ios, objective-c, xcode

代码如下

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


http://www.niftyadmin.cn/n/171678.html

相关文章

设计模式-模板模式(清晰明了)

概述 最近在想做个cloud项目,gitee上找了个模板项目,后端使用到 Nacos、Gateway、Security等技术,看到到 文件上传 模板模式策略模式 用得很好,再次分享一下。 什么是模板模式 一个抽象类中,有一个主方法&#xff0…

试题 算法训练 同余方程(python)

试题 算法训练 同余方程 提交此题 评测记录 资源限制 内存限制:128.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解。 输入格式 输入只有…

ChatGPT 拓展资料:AI大模型之美 -计算两个向量之间的余弦相似度

ChatGPT 拓展资料:AI大模型之美 -计算两个向量之间的余弦相似度 本文讲解使用openai.embeddings_utils中的cosine_similarity和get_embedding函数。 首先,让我们了解一下这两个函数的作用: cosine_similarity: 计算两个向量之间的余弦相似度。get_embedding: 获取一个单词…

v$datafile和v$datafile_header以及scn的关系

set pages 1000 lines 1000 col file# for 99999999999 col CHECKPOINT_CHANGE# for 99999999999 col NAME for a60 col LAST_CHANGE# for 99999999999999 select FILE# , CHECKPOINT_CHANGE# ,NAME, LAST_CHANGE# from v$datafile ; 来源于控制文件 select STATUS,…

【JavaSE】泛型中的通配符

文章目录1. 概述2. 上界通配符 < ? extends E>3. 下界通配符 < ? super E>3. &#xff1f;和 T 的区别1. 概述 Java 泛型&#xff08;generics&#xff09;是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制&#xff0c;该机制允许开发者在编译时…

#浅聊 webSocket (干货)

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 一&#xff0c;什么是websocket WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09; 它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并…

【2023春招】西山居游戏研发岗笔试AK

120min,一共三道算法、两道填空、10道不定项选择 算法题部分 T1-二叉树后序遍历 题面 一个节点数据为整数的二叉搜索树,它的遍历结果可以在内存中用一个整数数组来表示。比如,以下二叉树,它每个节点的左子节点都比自己小,右子节点都比自己大,对它进行后序遍历,结果可以…

冒泡 VS 插入 VS 选择——谁更胜一筹?(附排序源码)

文章目录什么样的“排序算法”更加优质&#xff1f;排序算法的执行效率排序算法的内存消耗排序算法的稳定性冒泡排序&#xff08;Bubble Sort&#xff09;插入排序&#xff08;Insertion Sort&#xff09;选择排序&#xff08;Selection Sort&#xff09;最终的胜利者&#x1f…