2012-03-29 58 views
1

我想了解一个常见的正确的自定义单元格高度计算方法。
我的单元格是从笔尖加载的,它们有两个多行UILabels,一个在另一个之上。
目前我在viewDidLoad中创建特殊配置单元格,并在heightForRowAtIndexPath中使用它。iOS正确的heightForRowAtIndexPath计算方式

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    [self configureCell:self.configurationCell forIndexPath:indexPath]; 
    CGRect configFrame = self.configurationCell.frame; 
    configFrame.size.width = self.view.frame.size.width; 
    self.configurationCell.frame = configFrame; 

    [self.configurationCell layoutSubviews]; 

    UILabel *label = (UILabel *)[self.configurationCell viewWithTag:2]; 
    float height = label.frame.origin.y + label.frame.size.height + 10; 

    return height; 
} 

它的作品,但似乎是一个坏的方式。我认为必须为每个项目和每个方向预先计算高度。但是我无法找到一种让它更好,更直接的方法。
你能帮我吗?
单元格标签的样式(如字体和屏幕边框的偏移量)必须从nib文件加载(单元格在nib内)。

新增的小区的layourSubviews方法:标签

-(void) layoutSubviews { 

    [super layoutSubviews]; 

    [self.shortDescriptionLabel resize]; 

    CGRect longDescriptionFrame = self.longDescriptionLabel.frame; 
    longDescriptionFrame.origin.y = self.shortDescriptionLabel.frame.origin.y + self.shortDescriptionLabel.frame.size.height + 5; 
    self.longDescriptionLabel.frame = longDescriptionFrame; 

    [self.longDescriptionLabel resize]; 
} 

调整大小的方法简单地增加了它的高度,以适合所有文本。所以单元格的高度计算为longDescriptionLabel.bottom + 10.简单的代码,但不是很漂亮。

回答

1

看起来您正在尝试在heightForRowAtIndexPath内部创建子视图。视图创作应该在cellForRowAtIndexPath中完成。

根据您的实施,您只能确定单元布局后的高度。这是不好的,因为对于每个单元,UITableView调用heightForRowAtIndexPath,而不是在数据重新加载时看到可见的。因此,即使不要求可见,也会创建所有单元格的子视图。

为了优化这个实现,你必须找出某种公式来确定高度,而不是布置视图。即使您的布局是有弹性的或具有可变的高度,给定的文字矩形,仍然可以确定其高度。使用[NSString sizeWithFont:]来确定其显示的矩形。将这些信息记录在您的数据代表中。当调用heightForRowAtIndexPath时,直接返回。

+0

我没有在heightForRowAtIndexPath中创建任何东西。我只是为单元格视图设置文本和调用布局。这个配置单元在viewDidLoad的nib文件中创建一次。所以你错了 - 在heightForRowAtIndexPath里面没有创建视图。我想找出直接的方法来进行计算。在控制器中获取单元格的字体大小和尺寸对我来说太复杂了。 – Division 2012-03-29 16:48:51

+0

那么你没有提供任何'layoutSubviews'的内容,所以对我来说这是一个黑匣子。尽管如此,我的建议仍然存在。你不应该在''heightForRowAtIndexPath''中做任何复杂的事情,因为每行都会调用它。我正在讨论在哪里安排你的观点的最佳选择。如果你觉得它太复杂了,那么你不需要这个优化。 – 2012-03-30 00:01:04

+0

我在我的文章中添加了layoutSubviews方法。如你所见,这并不复杂。我应该用高度预先计算来取代这个简单的方法吗? – Division 2012-03-30 08:15:45