我刚刚更新了一个Objective-C iOS应用,以使用" new" iOS 8故事板。在更新所有约束之后,我注意到在滚动时,一些标题标签(海关单元格)似乎缩进,这不是我想让他们做的。当我改变滚动方向时似乎总是会发生,但我并不完全确定如何重现它。我不知道在哪里寻找解决方案,但我很确定它与约束没有任何关系。下面是一些细胞的图片。前两个是正确缩进的,后两个没有。
我该怎么做才能防止这种缩进?
答案 0 :(得分:2)
在cellForRowAtIndexPath
方法中,您可以使用自定义文字在您的单元格上添加标签作为子视图。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] init];
}
UILabel *title = [[UILabel alloc] init];
title.text = @"my text";
title.frame = CGRectMake(0,0,desiredWidth,rowHeight); // setting the origin at (0,0) should position the label over that indentation you don't want
[titleview addSubview:title];
return cell;
}
答案 1 :(得分:1)
我也遇到了这个问题并做了一些研究。
要重现它,您似乎需要一个使用自动布局来布局其子视图的自定义表格视图单元格。滚动表格视图并且滚动方向改变并且受影响的单元格移动到可见屏幕之外时会发生缩进,并且在更改方向期间手指没有从屏幕上抬起时,再次返回到视图中。
显而易见的第一个嫌疑人是细胞再利用。在这样的自定义单元格实现中覆盖prepareForReuse似乎可以解决问题:
-(void)prepareForReuse{
[super prepareForReuse];
[self layoutSubviews];
}
问题是这是否是一个错误。当一个单元排队等待重用时,似乎发生了一些使自动布局约束无效的事情。进一步的研究(断点,NSLog等)表明所有布局约束都保持正确的值。从那里可以得出结论,layoutSubviews可能解决问题,事实证明是这样。
这是一个错误吗?也许不吧。 The docs for prepareForReuse说:
出于性能原因,您应该只重置与内容无关的单元格属性,例如,alpha,编辑和选择状态。 tableView中的表视图的委托:cellForRowAtIndexPath:应该在重用单元格时始终重置所有内容。
所以对此的严格解释是,当涉及自动布局时,您可能必须在tableView中重新调用:cellForRowAtIndexPath:通过从那里调用单元格上的layoutSubviews,因为自动布局约束 部分内容。这似乎也表明prepareForReuse可能不是重新布局的预期位置。无论如何,两种方式似乎都可以完成这项工作,如果有人知道哪种方式更好,请随时发表评论。
答案 2 :(得分:0)
您是以编程方式更改视图框架还是其他UI?
如果您使用自动布局并以编程方式更改视图,有时会发生这种情况。