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

所以我有代码,这是成功的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; } 

我有一个十分之一的部分。 随着每一行重用,我删除了contentView的所有子视图(我试过alloc-init UITableViewCell,但带来了相同的结果)。

在iOS 7.0上,UILabel只显示在它所属的单元格中。 但在7.1 UILabel继续显示在另一个单元格。 什么是interresting,当我点击单元格,它停止被其他人重叠,但直到我点击上面的单元格。 我的问题是,如何使它在像7.0ones一样的7.1设备上工作。

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

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

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

更新:我尝试了一些东西,但没有为我工作。

 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; 

这个问题与你的牢房的高度有关。 它不会为你dynamic调整。

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

如果你想让你的文本在一定的高度上剪辑,那么你需要设置行数,而不是设置为0,因为这会让它永远持续下去。

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

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

根据你想要的最终结果,你可以做到dynamic的高度和基于内容的变化。 有一堆与此相关的SO问题。

更新 – 剪裁contentView

我不得不自己尝试一下,但代替这个,这里有一些与剪辑contentView相关的链接:

  • 停止contentView的剪辑 – 你实际上想要做相反的事情。
  • 添加子视图 – 看起来类似于你正在做的事情。

看起来像这样的作品:

 cell.clipsToBounds = YES; 

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

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

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

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

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

希望它会帮助你。

谢谢 !

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

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

@Gaurav你的答案应该是被接受的答案。 谢谢!

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

在iOS 8中使用storyboard / IB有类似的行为。

修复的方法是将Bottom Space to: Superview添加Bottom Space to: Superview从原始单元格的内容视图的最底部视图到底部的Bottom Space to: Superview约束。 其他的观点和限制都是从最上面来的。

你在使用故事板吗? 如果是这样的话,select故事板中的表格视图控制器,并取消“底部底部条”您也可以以编程方式执行此操作。

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