UITableView Overlays Elements

I thought my table was fine until I changed the backgrounds to be a bit transparent, which showed the previous cells under the new selected cells. This is the code in my tableView:cellForRowAtIndexPath: method. I took out the redundant label, which is all the same as timeLabel .

 static NSString* cellIdentifer = @"Cell"; UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifer]; if (!cell) { cell= [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellIdentifer]; } int offset = 5; int rowHeight = 120; UIView* cellView = [[UIView alloc] initWithFrame: CGRectMake(offset, offset, 320 - offset * 2, rowHeight - offset * 2)]; cellView.backgroundColor = indexPath.row % 2 == 0 ? [UIColor colorWithWhite: 1.0 alpha: .8 ] : [UIColor colorWithWhite: .3 alpha: .8]; int padding = 5; int x1 = 5; int x2 = CGRectGetWidth(cellView.frame) / 3; int x3 = x2 * 2; int y1 = 5; int y2 = CGRectGetHeight(cellView.frame) / 2 + padding; int width = CGRectGetWidth(cellView.frame) / 3 - padding; int sHeight = CGRectGetHeight(cellView.frame) / 2 - padding; int bHeight = CGRectGetHeight(cellView.frame) - padding; CGRect cell1 = CGRectMake(x1, y1, width, sHeight); int row = indexPath.row;// - 1; UILabel* timeLabel = [[UILabel alloc] initWithFrame: cell1]; timeLabel.backgroundColor = [UIColor clearColor]; timeLabel.text = [[self.tableData objectAtIndex: row] objectForKey: @"time"]; [cellView addSubview: timeLabel]; [cell.contentView addSubview: cellView]; 

Here's a screenshot of what's happening

+4
source share
2 answers

You create new UIView and UILabel even if the cell is reused and the results show the old one below your new one.

Do it like

 UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifer]; if (!cell) { cell= [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellIdentifer]; int offset = 5; int rowHeight = 120; UIView* cellView = [[UIView alloc] initWithFrame: CGRectMake(offset, offset, 320 - offset * 2, rowHeight - offset * 2)]; cellView.tag = 200; cellView.backgroundColor = indexPath.row % 2 == 0 ? [UIColor colorWithWhite: 1.0 alpha: .8 ] : [UIColor colorWithWhite: .3 alpha: .8]; int padding = 5; int x1 = 5; int x2 = CGRectGetWidth(cellView.frame) / 3; int x3 = x2 * 2; int y1 = 5; int y2 = CGRectGetHeight(cellView.frame) / 2 + padding; int width = CGRectGetWidth(cellView.frame) / 3 - padding; int sHeight = CGRectGetHeight(cellView.frame) / 2 - padding; int bHeight = CGRectGetHeight(cellView.frame) - padding; CGRect cell1 = CGRectMake(x1, y1, width, sHeight); int row = indexPath.row;// - 1; UILabel* timeLabel = [[UILabel alloc] initWithFrame: cell1]; timeLabel.backgroundColor = [UIColor clearColor]; timeLabel.tag = 300; [cellView addSubview: timeLabel]; [cell.contentView addSubview: cellView]; } UIView *view = [cell.contentView viewWithTag:200]; UILabel *timeLabel = (UILabel*)[view viewWithTag:300]; timeLabel.text = [[self.tableData objectAtIndex: row] objectForKey: @"time"]; 

Instead of this messy thing, I suggest you create a custom UITableViewCell

+5
source

The main problem is the cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellIdentifer]; , so if you don’t want to change anything, use a method like this UITableViewCell *cell= [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: nil];

This is not the best way, but you can use it. Because in this case, your cell will not be reused. One of the best solutions is to create a custom cell of your choice and use it.

0
source

All Articles