我正在编写一个主要基于 TableView 的通用 iOS 应用程序(iPhone 和 iPad)。每个单元格都有多个文本区域,我需要根据内容调整高度。我在 Storyboard 中定义了所有的表格和单元格,我真的很想保持这种状态(更容易以图形方式查看大小)。
问题是我需要大量信息来计算单元格的最终大小(单元格和子视图的故事板高度、标签宽度、字体大小......)。我曾经在我的代码中只有常量,我会在其中手写值,但是:
- 每次更改故事板时都很难更改
- 我的标签可以有不同的宽度(不同类型的单元格,iPhone/iPad),我有很多这样的标签,所以在这种情况下,需要跟踪大量的常量
我使用该解决方案:
在单元格中,我设置了一次静态变量以记住大小(它是从情节提要中获取的,这很好):
static float cellDefaultHeight;
static float contactsLabelDefaultHeight;
static float contactsLabelDefaultWidth;
static float contactsLabelFontSize;
-(void) awakeFromNib
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// instantiate static variables with the constants
cellDefaultHeight = self.contentView.bounds.size.height;
contactsLabelDefaultHeight = self.contacts.bounds.size.height;
contactsLabelDefaultWidth = self.contacts.bounds.size.width;
contactsLabelFontSize = self.contacts.font.pointSize;
});
}
+ (CGFloat) heightForCellWithData:(NSDictionary *)data
{
// use constants and data to compute the height
return height
}
在计算任何单元格大小之前的表中,我必须实例化一个以设置静态变量:
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// get one instance before any size computation
// or the constant won't be there
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
static NSString *CellIdentifier = @"identifier";
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
});
return [MyCell heightForCellWithData:theData];
}
感觉太骇人听闻了,我觉得我完全错过了一些东西,但我想不出别的东西。有什么好的方法吗?
谢谢!