ios7 UITableView 分割线在 使用selectedBackgroundView 选中时有些不显示

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之后。

http://stackoverflow.com/questions/19212476/uitableview-separator-line-disappears-when-selecting-cells-in-ios7

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

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

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

/**
 *  设置分割线 , separatorInset 不一定能实现
 *  解决选中cell selectedBackgroundView 显示时 分割线显示不全
 *  问题参见:http://stackoverflow.com/questions/19212476/uitableview-separator-line-disappears-when-selecting-cells-in-ios7
 *  @param insets insets description
 */
-(void)setSeparatorWithInset:(UIEdgeInsets)insets{
    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"]) {
            subView.hidden = YES;
            subView.frame = CGRectMake(insets.left, insets.top,self.width - insets.left - insets.right, subView.height-insets.bottom - insets.top);

            UIView *separatorView = [[subView superview] viewWithTag:10456];
            if (!separatorView) {
                separatorView = [[UIView alloc] initWithFrame:subView.frame];
                separatorView.tag = 10456;
                [[subView superview] addSubview:separatorView];
            }else{
                separatorView.backgroundColor = [subView backgroundColor];//[UIColor redColor];
                separatorView.frame = subView.frame;
            }
            [[subView superview] bringSubviewToFront:separatorView];
            break;
        }
    }

}
-(void)setSeparatorColorWithColor:(UIColor *)sepColor{
    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"]) {
            if (sepColor) {
                subView.hidden = YES;
                subView.backgroundColor = sepColor;

               UIView *separatorView = [[subView superview] viewWithTag:10456];
                if (separatorView) {
                    separatorView.backgroundColor = sepColor;
                }else{
                    separatorView = [[UIView alloc] initWithFrame:subView.frame];
                    separatorView.tag = 10456;
                    [[subView superview] addSubview:separatorView];
                }
                [[subView superview] bringSubviewToFront:separatorView];
            }
            break;
        }
    }
}

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

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

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

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

时间: 2024-10-17 22:38:06

ios7 UITableView 分割线在 使用selectedBackgroundView 选中时有些不显示的相关文章

iOS UITableView 移除单元格选中时的高亮状态

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 在处理UITableView表格时,我们希望用户可以和触摸单元格式进行交互. 可是希望用户在完毕交互之后,这些单元格的选中状态可以消失. Cocoa Touch 提供了两种方法来防止单元格背持久选中. 1.cell.selectionStyle = UITableViewCellSelectionStyleN

storyboard-UITabBar选中时颜色

今日尝试用storyboard实现tabbar,发现一下问题: 1.在storyboard中设置tabbaritem选中时image无法显示: 2.tabbaritem选中状态默认背系统渲染为蓝色: 解决方法: //设置Image按照图像原始样式渲染,也就是无系统渲染 UIImage *selectedImage = [[UIImage imageNamed:@"tabbar_home_selected"] imageWithRenderingMode:UIImageRendering

UItableViewCell选中时的颜色及tableviewCell的select和deselect

今天做项目美工和我说cell点击后再跳回当前页面cell的默认点击状态应该取消,后来在网上查到,其实比较简单,有两种实现方法,代码如下 方法一: 在页面将要出现的时候对tableview执行deselect操作 - (void)viewWillAppear:(BOOL)animated{ [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; } 看上面的英文也应

UITableViewCell的选中时的颜色及tableViewCell的selecte与deselecte

    1.系统默认的颜色设置 [cpp] viewplaincopy //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = UITableViewCellSelectionStyleBlue; //灰色 cell.selectionStyle = UITableViewCellSelectionStyleGray; 2.自定义颜色和背景设置 改变UITableViewCe

UITableViewCell的选中时的颜色设置

[cpp] view plaincopy 1.系统默认的颜色设置 [cpp] view plaincopy //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = UITableViewCellSelectionStyleBlue; //灰色 cell.selectionStyle = UITableViewCellSelectionStyleGray; 2.自定义颜色和背景

iOS开发UITableViewCell的选中时的颜色设置

1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = UITableViewCellSelectionStyleBlue; //灰色 cell.selectionStyle = UITableViewCellSelectionStyleGray; 2.自定义颜色和背景设置 改变UITableViewCell选中时背景色: UIColor *color

cell选中时子视图状态自定义

(转)iOS编程——UITableViewCell高亮时其子视图的状态修改 (2012-06-13 22:38:39) 转载▼ UITableViewCell高亮时其子视图的状态修改.为了进行UI自定义,修改了UITableViewCell的accessoryView,如下 UIButton * accessoryDetailDisclosureButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];[accessor

cell添加选中时的背景图片、显示图片和图片自适应框的大小

1.给cell添加选中时的背景图片 UIView *myview = [[UIView alloc] init]; myview.frame = CGRectMake(0, 0, 320, 47); myview.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"0006.png"]]; cell.selectedBackgroundView = myview; 2.显示图片 CGRect my

解决UITableView分割线距左边有距离的办法xcode6

今天做项目时对比UI图突然发现自己的cell左边的线距离屏幕左边有一定距离,左边的坐标已经是0了,如果不想动坐标又解决此问题的话可以看看下面的方法 解决UITableView分割线距左边有距离的办法,有需要的朋友可以参考下. 我们在使用tableview时会发现分割线的左边会短一些,通常可以使用setSeparatorInset:UIEdgeInsetsZero 来解决.但是升级到XCode6之后,在iOS8里发现没有效果.下面给出解决办法: 首先在viewDidLoad方法中加上如下代码: i