iOS 7.1 UitableviewCell内容与下面的内容重叠

时间:2014-03-12 17:07:05

标签: ios uitableview uilabel autolayout ios7.1

所以我有代码,它在iOS 7.0上成功运行,但在7.1中却没有。我有一个简单的tableview,代码为:

- (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.1ones这样的7.1设备上运行。

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

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

这是包含详细说明的图片的dropbox文件夹: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;

7 个答案:

答案 0 :(得分:61)

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

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

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

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

您可以尝试在contentView上设置剪辑,以确保所有子视图都保留在内部。

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

更新 - 剪切contentView

我必须自己尝试一下,但取而代之的是,这里有一些与剪切内容相关的链接:

看起来很有效:

cell.clipsToBounds = YES;

答案 1 :(得分:6)

以下是重复单元格内容的完美解决方案。

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

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

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

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

希望它能帮到你。

谢谢!

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

chunkWidth

答案 4 :(得分:1)

had similar behavior in iOS 8, using storyboard / IB.

fix was to add a Bottom Space to: Superview constraint from the bottom-most view to bottom of the prototype cell's Content View. The other views and constraints were all anchored from the top.

答案 5 :(得分:0)

你在使用故事板吗? 如果是这样,请在故事板中选择表视图控制器,然后取消选中&#34;在底栏下&#34; 您也可以通过编程方式执行此操作。

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

答案 6 :(得分:0)

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