31

所以我有代码,它在 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 改变了这一点,我不知道为什么以及如何处理它。

这是带有详细说明的图像的保管箱文件夹:带图像的文件夹

更新:我尝试了像 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;
4

7 回答 7

67

这个问题与细胞的高度有关。它不会为您动态调整它。

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

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

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

或者,您可以尝试在 contentView 上设置剪辑以确保所有子视图都留在里面。

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

更新 - 裁剪 contentView

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

看起来这样有效:

cell.clipsToBounds = YES;
于 2014-03-12T17:15:18.370 回答
7

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

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

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

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

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

希望它会帮助你。

谢谢 !

于 2015-03-11T17:42:51.470 回答
2

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

for(UIView *view in cell.contentView.subviews){  
        if ([view isKindOfClass:[UIView class]]) {  
            [view removeFromSuperview];   
        }
    }
于 2014-09-22T11:37:10.150 回答
2

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

for object in cell.contentView.subviews
            {
                object.removeFromSuperview();
            }
于 2015-08-07T13:43:23.283 回答
1

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

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

于 2015-09-01T21:21:15.880 回答
0

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

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

于 2014-03-12T17:18:37.183 回答
0

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

于 2019-11-10T15:23:03.647 回答