Wednesday, February 29, 2012

insertSubview:belowSubview: in UITableViews


I have a UITableView with UITableViewCell s that are swipable. When a cell is swiped, I want a view to be visible (revealed) underneath that cell. Here's the code that I have:




UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

_cellBack = [[UIView alloc] initWithFrame:CGRectMake(0, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height)];
_cellBack.backgroundColor = [UIColor whiteColor];
[self.tableView insertSubview:_cellBack belowSubview:cell];

for (int i = 0; i < [self.tableView subviews].count; i++) {
UIView *v = [[self.tableView subviews] objectAtIndex:i];

if ([v isEqual:_cellBack]) {
NSLog(@"cellBack %d", i);
}
if ([v isEqual:cell]) {
NSLog(@"cell %d", i);
}
}



In the for loop, I check to see if the views' indexes are as I expect, and indeed they are; _cellBack has an index that is one less than cell 's index.



When I replace the insertSubview:belowSubview: call with insertSubview:aboveSubview: , it works fine (albeit with the white UIView showing up above the swiped cell), so it's not a matter of not allocating _cellBack properly. I've also tried insertSubview:atIndex: and that didn't work either..



What could be causing this?



Thanks!

2 comments:

  1. UITableView's already have the ability to put things behind cells. It's the backgroundView of the cell. Why don't you try that instead so you would do the following:

    cell.selectedBackgroundView = _cellBack;

    ReplyDelete
  2. So it turns out that, if I add it to another view, the code works as expected.

    Here's where I added it:

    _cellBack = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.origin.y, cell.frame.size.width, cell.frame.size.height)];
    _cellBack.backgroundColor = [UIColor whiteColor];

    [cell insertSubview:_cellBack belowSubview:cell.contentView];


    I'm still not sure why the code in the question doesn't work. The SideSwipeTableView from this github account has code similar to what I had before and it works fine.

    ReplyDelete