2013-06-20 148 views
4

我有一个自动布局的问题。我有一个UITableViewCell和里面的一个视图。我想这个观点比细胞小,所以我加约束:UITableViewCell自动布局

  • 垂直空间(10)顶
  • 垂直空间(10)底部
  • 水平空间(10)领先的空间
  • 水平空间(10)尾部的空格

时的tableView显示单元显示良好,但随后如果我向下滚动的tableView和滚动备份,在细胞中的观点是调整,现在需要在充分空间细胞。

正确的单元格: enter image description here

不正确的小区(滚动之后) enter image description here

我已经搜索到了这一点,但无法找到类似的话

。 我觉得这个人有同样的问题,但没有回答: Similar problem

感谢您的任何帮助提前!

+0

请在这里添加您的相关代码:) – iPatel

+0

您是从一个笔尖或故事板加载单元,还是完全使用代码创建它?你在使用'UITableViewCell'的自定义子类吗? –

+0

@robmayoff我为这个单元使用一个xib并从xib载入它。我也为这个 – Lukas

回答

3

我终于找到了我的问题的答案here。在我的自定义UITableViewCell类,我做了这样的:

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 

    for (NSLayoutConstraint *cellConstraint in self.constraints) 
    { 
     [self removeConstraint:cellConstraint]; 

     id firstItem = cellConstraint.firstItem == self ? self.contentView : cellConstraint.firstItem; 
     id seccondItem = cellConstraint.secondItem == self ? self.contentView : cellConstraint.secondItem; 

     NSLayoutConstraint* contentViewConstraint = [NSLayoutConstraint constraintWithItem:firstItem 
                       attribute:cellConstraint.firstAttribute 
                       relatedBy:cellConstraint.relation 
                        toItem:seccondItem 
                       attribute:cellConstraint.secondAttribute 
                       multiplier:cellConstraint.multiplier 
                        constant:cellConstraint.constant]; 

     [self.contentView addConstraint:contentViewConstraint]; 
    } 
} 

我猜的内容视图重新调整其内容或类似的东西。如果有更简单的解释和更简单的方法,我仍在等待其他答案。非常感谢您的帮助!

+1

在xib(或storyboard)中的“UITableViewCell”上创建的约束直接连接到单元格,而不是连接到其'contentView'子视图。但他们需要连接到'contentView'才能正确布局。这就是您的修复工程的原因。我不知道这是Xcode中的错误还是UIKit中的错误。 –

+0

@robmayoff - 我相信这是一个IB/XCode错误,而不是UIKit。如果您检查由XCode 4.6发出的故事板XML,那么很明显约束会添加到单元格,而contentView则会添加到contentView的子视图。在4.6版以后的XCode版本中,这被纠正了,约束属于contentView。 – TomSwift

0

生成此问题是因为您的UITableView重复使用单元格创建新单元格。 我给你一些可能对你有所帮助的建议。

1)

之间
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     /// Your code; 
    } 
return cell; 

} 

1)你的UIView添加到cell.contentView.

EDITED添加UIView

你按照我的编辑答案之前,我想告诉你,下面的代码对内存管理不利,因为它会为每行UITableView创建一个新的单元,所以要小心。

但是如果UITableView有限制的行(50-100可能是)使用下面的代码更好,如果它适合你。

NSString *CellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if(cell == nil) 
    { 
    } 
+0

使用UITableViewCell的一个自定义的子类谢谢,但是这不起作用。我不明白为什么会发生这种情况,这在简单的uiview中不会发生,只是在tableviewcell中。也许我需要设置[view setNeedsLayout]或类似的东西,为自动布局约束在tableview单元格中工作? – Lukas

+0

@Lukas检查我的编辑答案:) – iPatel

+0

再次感谢您的帮助,但它会非常缓慢和低效。我想以适当的方式来做:) – Lukas

1

今天我有同样的问题,使用Xcode 5和故事板。最初,我的自定义表格视图单元格会正确显示,但是当我滚动浏览表格视图并重用单元格时,布局会变得很糟糕。此修复程序是调用setNeedsLayout像这样:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    SettingTableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:@"Setting" forIndexPath:indexPath]; 

    [tableViewCell.contentView setNeedsLayout]; 

    return tableViewCell; 
} 


真正的问题:

我叫我的标签出口textLabel,这是相同的名称的UITableViewCell内置的标签属性。这造成了各种奇怪。只要将outlet名称更改为唯一的名称,我的布局问题就解决了。

+0

我想所有的单元格都应该有一个内部的视图,将这个视图连接成单元格内容视图,然后只添加里面的内容,比如uilabels和其他东西。这种方式似乎摆脱了所有的问题。 – Lukas

+0

我有与“imageView”相同的问题。非常感谢 –

相关问题