iOS7 中选定 UITableViewCell 的奇怪行为

Posted

技术标签:

【中文标题】iOS7 中选定 UITableViewCell 的奇怪行为【英文标题】:Strange Behaviour of Selected UITableViewCell in iOS7 【发布时间】:2013-10-13 08:52:04 【问题描述】:

我正在将我的应用程序移植到 ios 7 并且我的 tableViews 出现了一些奇怪的行为。当我选择一个单元格时,分隔符会无缘无故地消失。不仅如此,所选状态的背景图像也会向上移动大约 1 个像素,尽管它的框架并未表明这一点。我在 iOS 6 或更早的操作系统上没有这些问题。

我通过以下方式定义我的表格视图:

    statisticsTableView = [[UITableView alloc] initWithFrame:CGRectMake(170.0f, 0.0f, 150.0f, window.size.height) style:UITableViewStylePlain];
    statisticsTableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]];
    statisticsTableView.separatorColor = [UIColor darkGrayColor];
    //statisticsTableView.separatorInset = UIEdgeInsetsZero; // <- Makes app crash in iOS6 or older
    statisticsTableView.showsHorizontalScrollIndicator = NO;
    statisticsTableView.delegate = self;
    statisticsTableView.dataSource = self;

单元格是子分类的,相关部分如下(常规和选定的免费图像大小完全相同,在 iOS6 或更早版本中显示正确,只有 iOS 7 选定的 BG 图像显示稍高) :

    UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 150.0f, 70.0f)];
    backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cell_background_corp.png"]];
    self.backgroundView = backgroundView;

    UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 150.0f, 70.0f)];
    backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cell_background_corp_selected.png"]];
    self.selectedBackgroundView = backgroundView;

现在,我确实知道其他人已经问过这个问题(或者,至少是其中的一部分),但是那里的答案对我没有任何帮助。为了进一步参考,我尝试了这些“解决方案”,它们确实工作:

Putting this into my didSelectrowAtIndexPath made my cells deselect. 
But, I need my selected cell to stay selected, and besides 
it looked really awkward with the blinking as swithces between states:

    [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

另一个:

Putting this into the heightForRowAtIndexPath delegate method 
as a return value did absolutely nothing:

    ceilf(rowHeight);

最后:

This was my attempt to fix the background image position bug. I modified
the way I added the selected background view in the subclassed tableView cell,
but it did not do squat:

    UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 150.0f, 70.0f)];
    if (iOSVersion >= 7.0f)
    
        backgroundView.frame = CGRectMake(0.0f, 1.0f, 150.0f, 70.0f);
    
    backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cell_background_corp_selected.png"]];
    self.selectedBackgroundView = backgroundView;

【问题讨论】:

我已经看到内置的苹果应用程序也会发生这种情况。不是每次,但经常足以引起注意。 也许这是一个错误,将在未来的更新中解决。 您是在使用默认的 tableview 单元格还是在自定义它? 这个问题在 iOS 7 上吗?如果是,则尝试将表格视图类型设置为普通表格。这可能会解决问题。 【参考方案1】:

我遇到了类似的问题,为我解决的问题是像这样覆盖 UITableViewCell 子类中的 layoutSubviews:

- (void)layoutSubviews

    [super layoutSubviews];
    self.selectedBackgroundView.frame = self.backgroundView.frame;

重要的是要先拨打[super layoutSubviews]

顺便说一句,我认为默认行为是针对 iOS7 的。如果您查看 Apple Mail 应用程序,您会发现在选择单元格时分隔线也消失了,并且活动背景绘制在分隔线所在的位置。

【讨论】:

以上是关于iOS7 中选定 UITableViewCell 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableviewCell (ios7) 中嵌入的 UITableView 中滚动

iOS7 手机应用中的通话、邮件等图标放入UITableViewCell

UITableViewCell错误ios7

ios7中的UITableViewCell现在左右有间隙

UITableViewCell drawInRect iOS7

在 UITableViewCell iOS7 中搜索超级视图