iOS Cell高亮(highlighted)和选中(selected)效果

前言

初衷:最近闲适,讲讲关于Cell,也希望刚入门的iOS小伙伴少走写弯路吧!

UITableViewUICollectionView是我们常用的控件。

但是,就关于如何设置高亮状态选中状态,网上的解决方案虽多,但是令我满意的却是寥寥无几。

在我尝试各种方案后,终于在官方API中找到了解决方案。

正文

一. 阐释

  • 高亮状态(highlighted):简单来说,也就是手按在Cell上不松开的效果即为高亮状态。
  • 选中状态(selected):在iOS官方API中,当用户点击一个Cell松开后,UITableView会默认为你选中了一个Cell

二. 选中状态(selected)

1. 单选

默认状态下,当你单击一个Cell,它就会变成灰色,这个表明你已经选中了这个Cell,选中效果如下:

signle.gif
2. 多选

有的小伙伴既然可以单选,那么多选么?
当然iOSAPI很人性化,设置多选只需一行代码,方法如下:

    // 设置允许多选
    self.tableView.allowsMultipleSelection = YES;

多选效果如下:

multiple.gif
3. 获取单选和多选的选中项
// 获取单选选中项
NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow;
// 获取全选选中项
NSArray *indexPaths = self.tableView.indexPathsForSelectedRows;
4. 设置Cell选中和反选中
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
// 设置某项变为选中
[self.tableView selectRowAtIndexPath:indexPath animated:YES
                      scrollPosition:UITableViewScrollPositionNone];
// 设置某项变为未选中
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
  • 小技巧
    我想有了“2”、“3”、“4”知识作为基础,想做出一个Cell单选和全选效果再也不是什么难事了吧。

  • 通常使用
    一般我们会在UITableViewDelegatedidSelect方法中设置反选中效果,代码和效果如下:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // 在手指离开的那一刻进行反选中
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}
deSelect.gif

当然这个效果的确在一段时间内帮我解决了不少问题吧,知道我遇见了“她”,她让我在度陷入“懵逼”的状态。接下来我我们就来见识见识这个让我懵逼的“她”。

  • 特殊情况:当我们自定义了Cell,并且在Cell中添加了修改backgroundColor属性的UIView时,效果如下图所示:
background.png
backgroundColor.gif
  • 问题:OMG,发生了什么,UIView的背景颜色怎么没有了。其实这个问题也困惑了我很长时间,我也曾经去stackoverflow上问过,然而没有找到比较好的答案。

  • 暂时方案:

    1. 禁用选中效果,代码如下:
// 禁用SelectionStyle
self.selectionStyle = UITableViewCellSelectionStyleNone;
  1. UIColor -> UIImage,使用UIImage填充,不过也有短处。
  • 苦恼: 这俩方法难以使我满意,同样也难以使产品满意。避免撕逼,只能继续琢磨。后来我在iOSAPI找到了灵感。
// animate between regular and selected state
- (void)setSelected:(BOOL)selected animated:(BOOL)animated;   
// animate between regular and highlighted state                  
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated;
  • 目前新方案: 效果可以与官方默认效果媲美。

UITableViewCell方法
建议:最好增加延迟消失的动画,让高亮效果更加突现出来。否则短暂点击无法显示出高亮效果,原因是高亮与非高亮状态切换太快无法显示其效果。

// 禁用SelectionStyle
self.selectionStyle = UITableViewCellSelectionStyleNone;

// 配置cell高亮状态
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];
    if (highlighted) {
        self.contentView.backgroundColor = [UIColor colorWithHexString:@"0xcccccc"];
    } else {
        // 增加延迟消失动画效果,提升用户体验
        [UIView animateWithDuration:0.1 delay:0.1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            self.contentView.backgroundColor = [UIColor whiteColor];
        } completion:nil];
    }
}

// 配置cell选中状态
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    if (selected) {
        self.contentView.backgroundColor = [UIColor colorWithHexString:@"0xececec"];
    } else {
        self.contentView.backgroundColor = [UIColor whiteColor];
    }
}

UICollectionViewCell方法
由于UICollectionViewCell没有像UITableViewCell中那样的方法,所以重写setter方法即可,具体代码如下:

Objective-C版代码
// 设置高亮效果
- (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];
    if (highlighted) {
        self.backgroundColor = HexRGB(0xececec);
    } else {
        [UIView animateWithDuration:0.1 delay:0.1 options:UIViewAnimationOptionCurveEaseOut animations:^{
            self.backgroundColor = [UIColor whiteColor];
        } completion:nil];
    }
}

// 设置选中选中
-(void)setSelected:(BOOL)selected {
    if (selected) {
        self.backgroundColor = HexRGB(0xececec);
    } else {
        self.backgroundColor = [UIColor whiteColor];
    }
}

Swift版代码
  // 设置高亮效果
  override var isHighlighted: Bool {
      willSet {
          if newValue {
              
          } else {
              
          }
      }
  }

  // 设置选中选中
  override var isSelected: Bool {
      willSet {
          if newValue {
              
          } else {
              
          }
      }
  }

本人不足之处欢迎大家指正,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容