【问题标题】:iOS 7.1 UitableviewCell content overlaps with ones belowiOS 7.1 UtableviewCell 内容与以下内容重叠
【发布时间】:2014-04-17 00:27:26
【问题描述】:

所以我有代码,它可以在 iOS 7.0 上成功运行,但在 7.1 中没有。我有一个简单的表格视图,带有代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 70.0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    for (UIView *view in cell.contentView.subviews) {
        [view removeFromSuperview];
    }

    UILabel *label = [[UILabel alloc] init];
    label.text = [NSString string];

    for (NSInteger i = 0; i < 20; i++) {
        label.text = [label.text stringByAppendingString:@"label String "];
    }

    label.translatesAutoresizingMaskIntoConstraints = NO;
    label.numberOfLines = 0;
    label.lineBreakMode = NSLineBreakByWorldWrapping;
    //label.lineBreakMode = NSLineBreakByTruncatingTail; //I have tried this too
    [cell.contentView addSubview:label];

    NSDictionary *dict = NSDictionaryOfVariableBindings(label);
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[label]-8-|" options:0 metrics:nil views:dict]];
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[label]" options:0 metrics:nil views:dict]];

    if (indexPath.row == 0) {
        label.textColor = [UIColor colorWithRed:1.0 green:0 blue:0 alpha:1.0];
    }
    else if (indexPath.row == 1) {
        label.textColor = [UIColor colorWithRed:0 green:1.0 blue:0 alpha:1.0];
    }
    else if (indexPath.row == 2) {
        label.textColor = [UIColor colorWithRed:0 green:0 blue:1.0 alpha:1.0];
    }
    else {
        label.textColor = [UIColor colorWithWhite:0.3 alpha:1.0];
    }

    cell.backgroundColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    return cell;
}

我有 1 个 10 行的部分。重用每一行后,我从 contentView 中删除了所有子视图(我尝试了 alloc-init UITableViewCell,但结果相同)。

在 iOS 7.0 上,UILabel 仅显示在它所属的单元格中。但在 7.1 UILabel 继续显示在另一个单元格上。有趣的是,当我点击单元格时,它不再被其他人重叠,但直到我点击上面的单元格。 我的问题是,如何让它在 7.1 设备上工作,比如在 7.0ones 上。

我尝试了模拟器和设备,并查看了 iOS 7.1 API Diffs,但没有发现与此相关的任何内容。

也许是自动布局的问题,我的 UILabel 高度可变,但我需要这样做。我想在 UILabel 中包含所有文本,但只显示 UILabel 的一部分,可以显示在单元格中,这是 7.0 中的默认行为,但 7.1 改变了这一点,我不知道为什么以及如何处理它。

这是带有详细说明的图片的保管箱文件夹:Folder with images

更新:我尝试了 tese 之类的东西,但没有任何效果。

cell.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 70);
cell.contentView.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 70);

cell.opaque = NO;
cell.contentView.opaque = NO;

cell.clearsContextBeforeDrawing = NO;
cell.contentView.clearsContextBeforeDrawing = NO;

cell.clipsToBounds = NO;
cell.contentView.clipsToBounds = NO;

【问题讨论】:

    标签: ios uitableview uilabel autolayout ios7.1


    【解决方案1】:

    问题与单元格的高度有关。它不会为您动态调整。

    您可能会注意到,当您滚动时,上面的视图消失了,重叠的文本也会随之消失。

    如果您希望文本在某个高度剪辑,那么您需要设置行数,而不是将其设置为 0,因为这将让它永远持续下去。

    lineBreakMode 不会生效,因为它没有停止。

    您可以选择在 contentView 上设置剪辑以确保所有子视图都留在里面。

    根据您想要的最终结果,您可以进行动态高度并根据内容进行更改。有很多与此相关的 SO 问题。

    更新 - 裁剪 contentView

    我必须自己尝试一下,但取而代之的是,这里有几个与裁剪 contentView 相关的链接:

    看起来这样可行:

    cell.clipsToBounds = YES;
    

    【讨论】:

    • 我注意到滚动时文本消失了,当我向上滚动时它看起来很好(比如 7.0)。我可以设置行数,但它只对 UILabel 有效,当我在 UILabel 下面有 UIButton 时,按钮继续重叠单元格。所以我想要更通用的解决方案。我只是希望可见区域下方的所有内容都不可见=>静态行高 70。我只是很困惑为什么它只发生在 iOS 7.1 上你能解释一下“它不会为你动态调整它”。因为我不希望它是动态的,所以我希望单元格的静态高度为 70。
    • 对,如果你想要静态高度为 70,那么你不需要动态高度。您只需要确保视图剪辑子视图。我不确定为什么 7.0 与 7.1 相比,我在以前的版本中遇到过类似的问题。我将在与此相关的答案中添加一些链接。
    • 毕竟我找到了解决方案:cell.clipsToBounds = YES;这解决了我的问题,并在 7.0 和 7.1 上很好地显示。很困惑为什么我没有在文档中找到它现在是必要的,如果你想像我一样做的话。当我现在正在阅读您的评论时,我发现您提到了它,因此您可以做出回答,我会将其标记为已接受,否则我会做我的。
    • 如果您在界面生成器中构建单元格,则其自身(三个中的顶部)单元格上的剪辑子视图具有相同的效果..
    • 对我来说,这似乎是 iOS 7.1 的问题,但不是 7.0,该版本运行良好。但我猜 7.0 会自动开启剪辑功能。
    【解决方案2】:

    这里是单元格内容重叠的完美解决方案。

    在分配单元后和添加子视图之前,只需在 cellForRowAtIndexPath 中使用以下代码。

    for (id object in cell.contentView.subviews)
    {
        [object removeFromSuperview];
    }  
    

    实际上,重叠正在发生,因为每当您滚动表格视图时,它都会一次又一次地分配您添加的视图。因此,上面的代码将通过从单元格的 contentView 中删除现有视图来解决您的问题。

    现在您可以在应用上述代码后看到内存调试会话,这次您的内存是稳定的。

    希望对你有帮助。

    谢谢!

    【讨论】:

    • 这不是我的问题。您正在描述 cell0 的当前视图与 cell0 的先前视图重叠的情况。但问题是 cell0 的当前视图与 cell1 的当前视图重叠。此外,我确实已经在你推荐的地方有这段代码(尽管现在我宁愿把它放在 prepareForReuse 方法中)。
    【解决方案3】:

    这是重新创建单元格内容的问题。尝试以下代码段。

    for(UIView *view in cell.contentView.subviews){  
            if ([view isKindOfClass:[UIView class]]) {  
                [view removeFromSuperview];   
            }
        }
    

    【讨论】:

    • 当我编写此代码时,单元格会显示,但代码不会删除我认为的旧单元格。因为我在新单元格下看到旧值
    【解决方案4】:

    @Gaurav 你的答案应该是公认的答案。谢谢!

    for object in cell.contentView.subviews
                {
                    object.removeFromSuperview();
                }
    

    【讨论】:

    • 很高兴我的回答有帮助!
    • 我不敢相信!成功了!
    【解决方案5】:

    在 iOS 8 中有类似的行为,使用故事板/IB。

    修复是在原型单元的内容视图的最底部视图底部添加Bottom Space to: Superview 约束。其他视图和约束都是从顶部锚定的。

    【讨论】:

      【解决方案6】:

      你在使用故事板吗? 如果是这样,请在情节提要中选择表格视图控制器并取消选中“底部栏下” 您也可以通过编程方式执行此操作。

      如果您的 TVC 继承自导航视图控制器或选项卡视图控制器,您可能需要取消选中父视图上的此布局选项

      【讨论】:

      • 我试过了,但似乎什么也没做。是的,我正在使用 Storyboard,而我的 TableViewController 属于 NavigationController。我都取消选中它,但什么也没发生。
      • 哦,您可以尝试的另一件事是清理 cellForRowAtIndexPath 内部的代码。我注意到如果你在这段代码中加入循环或一些逻辑,事情就会变得有点奇怪。所以:将你的 for 循环移到外面(制作一个数组或其他东西以供稍后读取),并可能将 if/else 语句更改为 switch 语句,看看它是否有帮助
      • 都试过了,但没有任何帮助。毕竟我找到了解决方案: cell.clipsToBounds = YES;这解决了我的问题,并在 7.0 和 7.1 上很好地显示。很困惑为什么我没有在文档中找到它现在是必要的,如果你想像我一样做的话。我会发布答案,但必须等待。
      • 这也对我有用,设置 clipsToBounds = YES。非常令人沮丧。
      【解决方案7】:

      重新检查所有 4 个约束会有所帮助。在使用表格视图或集合视图时,必须应用所有四个约束(前导、尾随、顶部、底部)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 2016-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-04
        相关资源
        最近更新 更多