博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios7 UITableView 分割线在 使用selectedBackgroundView 选中时有些不显示
阅读量:6224 次
发布时间:2019-06-21

本文共 4254 字,大约阅读时间需要 14 分钟。

UITableView  选中cell ,默认会有一个灰色的背景遮罩效果,这个灰色遮罩就是cell 自带的

selectedBackgroundView

我们可以设置selectedBackgroundView 的frame  、和 背景颜色

selectedBackgroundView.backgroundColor

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {       cell.selectedBackgroundView.backgroundColor = [UIColor redColor];       cell.selectedBackgroundView.frame = cell.frame;}-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{       [self performSelector:@selector(unselectCell:) withObject:nil afterDelay:0.2];}-(void)unselectCell:(id)sender{        [_setUpTableView deselectRowAtIndexPath:[_setUpTableView indexPathForSelectedRow] animated:YES];}

 

这样就可以自定义选中效果啦。问题来拉,当选中一个cell时,你会发现这个cell 想临的cell 的分割线没啦(按下cell ,没有弹起,遮罩显示时)。

这™明显bug ,在ios7之后。

这个里面的回答都试过遍了还是不行。

自己搞吧,决定不用系统的分割线,自己加一个试试看。

在你cell 的基类中或 自定义cell 中添加这两个方法

 

#define  separatorViewTag  10456

 
@interface MyCustomTableViewCell(){   UIView *customSeparatorView;   CGFloat separatorHight;}@property (nonatomic,weak)UIView *originSeparatorView;@end

/**

 *  设置分割线 separatorInset 不一定能实现

 *  解决选中cell selectedBackgroundView 显示时 分割线显示不全

 *  问题参见:

 *  @param insets insets description

 */

-(void)setSeparatorWithInset:(UIEdgeInsets)insets{if (customSeparatorView) {    customSeparatorView.frame = CGRectMake(insets.left, insets.top,self.width - insets.left - insets.right, self.originSeparatorView.height-insets.bottom - insets.top);    self.originSeparatorView.hidden = YES;    self.originSeparatorView.alpha = 0;}else{    for (int i = ([self.contentView.superview.subviews count] - 1); i >= 0; i--) {        UIView *subView = self.contentView.superview.subviews[i];        if ([NSStringFromClass(subView.class) hasSuffix:@"SeparatorView"]) {            self.originSeparatorView = subView;            subView.hidden = YES;            subView.alpha = 0;            subView.frame = CGRectMake(insets.left, insets.top,self.width - insets.left - insets.right, subView.height-insets.bottom - insets.top);            customSeparatorView = [[subView superview] viewWithTag:separatorViewTag];            if (!customSeparatorView) {                customSeparatorView = [[UIView alloc] initWithFrame:subView.frame];                customSeparatorView.tag = separatorViewTag;                [[subView superview] addSubview:customSeparatorView];                customSeparatorView.backgroundColor = [subView backgroundColor];            }            [[subView superview] bringSubviewToFront:customSeparatorView];            break;        }    }  }}-(void)setSeparatorColorWithColor:(UIColor *)sepColor{if (customSeparatorView) {    customSeparatorView.backgroundColor = sepColor;    self.originSeparatorView.hidden = YES;    self.originSeparatorView.alpha = 0;}else {    for (int i = ([self.contentView.superview.subviews count] - 1); i >= 0; i--) {        UIView *subView = self.contentView.superview.subviews[i];        if ([NSStringFromClass(subView.class) hasSuffix:@"SeparatorView"]) {           self.originSeparatorView = subView;            if (sepColor) {                subView.hidden = YES;                subView.alpha = 0;                subView.backgroundColor = sepColor;                customSeparatorView = [[subView superview] viewWithTag:separatorViewTag];                if (!customSeparatorView) {                    customSeparatorView = [[UIView alloc] initWithFrame:subView.frame];                    customSeparatorView.tag = separatorViewTag;                    [[subView superview] addSubview:customSeparatorView];                    customSeparatorView.backgroundColor = [subView backgroundColor];                }                [[subView superview] bringSubviewToFront:customSeparatorView];            }            break;        }    }  }} -(void)layoutSubviews{    [super layoutSubviews];    [self setSeparatorWithInset:UIEdgeInsetsMake(0, 0, 0, 0)];    [self setSeparatorColorWithColor:[UIColor colorWithRed:31/255.0 green:32/255.0f blue:35/255.0 alpha:0.2]]; }
 

一个是设置分割线frame  的 一个是设置颜色。

其中遍历cell的subview  倒序。(提高效率)找到分割线,隐藏掉,重写一个view 加在分割线的superview 上。这样上面问题中使用selectedBackgroundView选中cell 时影响分割线的问题就解决啦。

注:tableview  使用section展示好像没事(把cell 都放到section 里),我项目设置页面就是这样没有问题使用selectedBackgroundView。当只有一个section时会出现上述问题。

 

 

最后我去回答下stackoverflow上得问题。

 

转载地址:http://whuna.baihongyu.com/

你可能感兴趣的文章
vue 2.0 路由切换以及组件缓存源代码重点难点分析
查看>>
清凉一夏,“极客时间”陪你过暑假
查看>>
掘金首秀
查看>>
vue面试整理
查看>>
React基础(一)
查看>>
PageRank 算法随记
查看>>
喜马拉雅 FM--- [ Java 高级开发] [ Java 架构师] [iOS 架构师] 招聘啦
查看>>
软能力那点事,你知多少
查看>>
前端小知识10点(2019.5.28)
查看>>
基于"发布-订阅"的原生JS插件封装
查看>>
深度掌握Redis:5大难题解决方案、单线程优劣势、高并发快原因等
查看>>
JavaScript系列之类型判断
查看>>
浮动 二 文字围绕现象(下)
查看>>
C#发送短信验证码
查看>>
vue-服务端渲染6:client/server-entry.js
查看>>
十年架构师教你:如何搞定计算机网络面试
查看>>
TypeScript学习笔记(三)接口
查看>>
游戏数据模型介绍 指定用户群组分析激活-注册-付费转化率|MobSDK
查看>>
康复治疗多少钱一天?成都顾连可以报销医保吗?
查看>>
简单粗暴的JavaScript笔记-1
查看>>