UITableView separator line disappears when selecting cells in iOS7

后端 未结 24 2054
耶瑟儿~
耶瑟儿~ 2020-12-05 04:01

In my tableView I set a separator line between cells. I am allowing selection of multiple cells. Here\'s my code for setting selected cell background color:

         


        
相关标签:
24条回答
  • 2020-12-05 04:25

    this solution will not help anybody who isn't using a backgroundView on his cells, anyway:

    - (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
        {
            [cell setBackgroundColor:[UIColor grayColor]];
        }
    

    this way the annoying visual effect is vastly reduced without having to reload the table. of course, you can change grayColor with anything which helps you improve the result in your case

    0 讨论(0)
  • 2020-12-05 04:25

    I needed the following:

    "When user selects row, selection background color is transparent/white/whatever you may call it and separator lines don't disappear"

    I've looked as well for a solution for the following problem:

    "When I select a row in a table (plain type table) I had selection colour grey, and if I set cell.selectionStyle to none -> Separators between cells disappeared."

    Xcode - 9.2 version

    Found the following solution:

    1. in 'tableView (....cellForRowAT...)' let colorView = UIView(frame: CGRect(x: 0.0, y: 3.0, width: cell.frame.width, height: cell.frame.height - 1.0)) colorView.backgroundColor = UIColor.white UITableViewCellClass.appearance().selectedBackgroundView = colorView

    UITableViewCellClass - is your prototype cell class it makes possible to change selection color to white

    1. in 'tableView (...didSelectRowAt)' cell.selectionStyle = .none

    2. in UITableViewCellClass (your prototype cell class)

      override func layoutSubviews() { super.layoutSubviews()

      subviews.forEach { (view) in
          if type(of: view).description() == "_UITableViewCellSeparatorView" {
              view.alpha = 1.0
          }
      }
      

      }

    it allows to keep selected row with check mark and all separators are in place.

    0 讨论(0)
  • 2020-12-05 04:26

    in my case i was animating a row, so just i needed put some like this:

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
    [tableView beginUpdates];
    [tableView deselectRowAtIndexPath:indexPath animated:NO]; 
    //if you are doing any animation you have deselect the row here inside. 
    [tableView endUpdates];
    } 
    
    0 讨论(0)
  • 2020-12-05 04:26

    Too exciting, I solved this problem. Add the following method call in a custom cell, and to set the color separator and frame. I'll hide the cell separator, and then customize the view on a load separator in superview. The impact separator cell is selected when this problem is solved friends

    @interface MyCustomTableViewCell(){
       UIView *customSeparatorView;
       CGFloat separatorHight;
    }
    @property (nonatomic,weak)UIView *originSeparatorView;
    @end
    
    -(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]];
     }
    
    0 讨论(0)
  • 2020-12-05 04:27

    @samvermette's answer solved the issue for me, But I had to deselect the selected Row first.

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  {
    
        //Deselect Row
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    
        // fix for separators bug in iOS 7
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; }
    
    0 讨论(0)
  • 2020-12-05 04:27

    The solutions here didn't help me. In most cases it was proposed to remove the selection, but I wanted the cells to keep their selected state. So the idea is to disable the default separator line and use your own separator line. I tried this but I had problems with it (you can read more about this here). The main problem was drawing the line in the accessoryView area. It only worked on iOS 8, but I also needed a solution for iOS 7.

    My requirements were:

    • Selection should be kept
    • Line should not disappear (especially in the case the cell get selected)
    • Separator line above the selected cell should also not disappear

    Especially the third point made problems because iOS uses a kind of anti-aliasing effect for the crossing of on UITableViewCell to the next. As I found out that only occurs on iPad. It has the size of about one point in each direction (current selected cell, cell above) so that a line on the cell disappears even it is drawn on the cell itself (and not the default one used). It makes no difference if this line is on the cell above or on the selected cell. This special render effects hides my lines.

    The solution looks like the following:

    1. Use the backgroundView where you draw two lines: one on top (+1 point in y-direction for iPad and 0 point in y-direction for iPhone) and one on the bottom. So it never gets covered by the selection effect.
    2. The created background view should only be used for the selected state (cell.selectedBackgroundView = selectedBackground). The default separator line is enabled for the other cells.

    I have a working example with C# code posted here though you have to adapt it to your needs. Now my selection problems are gone!

    0 讨论(0)
提交回复
热议问题