所以我有代码,它在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;
答案 0 :(得分:61)
问题与细胞的高度有关。它不会为你动态调整。
你可能会注意到,当你滚动并且上面的视图不在视图中时,重叠的文本会随之消失。
如果您希望文本在某个高度进行剪辑,则需要设置行数,而不是将其设置为0,因为这样可以让它永远持续。
lineBreakMode
不会生效,因为它没有停止。
您可以尝试在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个约束都会有所帮助。在使用表视图或集合视图时,必须应用所有四个约束(前导,尾随,顶部,底部)。