zoukankan      html  css  js  c++  java
  • 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 中添加这两个方法

    
    

    #define  separatorViewTag  10456

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

    /**

     *  设置分割线 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{
    
    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上得问题。

  • 相关阅读:
    PHP验证码
    c#属性
    框架数据连接类
    mysqli
    C# 委托
    Windows系统,文件和文件夹命名规则:
    固态硬盘与普通硬盘的区别
    windows快捷键
    1.认识计算机
    计算机题解
  • 原文地址:https://www.cnblogs.com/DamonTang/p/4497304.html
Copyright © 2011-2022 走看看