在UITableViewCell中复杂调整单元格大小

时间:2013-07-17 02:38:35

标签: iphone ios uitableview

我正在编写一个通用iOS应用程序(iPhone和iPad),它主要基于TableView。每个单元格都有多个文本区域,我需要根据内容调整高度。我在Storyboard中定义了所有表格和单元格,我真的希望保持这种方式(更容易用尺寸图形化地看看它会是什么样的。)

问题在于我需要大量信息来计算单元格的最终大小(单元格和子视图的故事板高度,标签宽度,字体大小......)。我以前在代码中只有常量,我会手写值但是:

  • 每次改变故事板时都会感到很痛苦
  • 我的标签可以有不同的宽度(不同类型的单元格,iPhone / iPad),我有很多,所以在这种情况下,它真的有很多常量来跟踪

我使用那个解决方案:

在Cell中我有一些静态变量,它们被设置一次以记住大小(它是从故事板中获取然后很好):

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];
}

感觉如此hackish我觉得我完全错过了什么,但我想不出别的东西。有没有好办法呢?

谢谢!

1 个答案:

答案 0 :(得分:0)

首先,我认为您应该使用自定义单元格来执行此类操作。现在每次如果你需要改变宽度/高度,你只需要那个单元格的边界。关于标签和文本字段宽度/高度你可以做(​​self.textview.bounds),然后你可以根据需要设置偏移量。这不是黑客,而是根据逻辑的纯编码,因为每次如果你改变设备它将相应地采取边界,所以不需要记住任何东西。 希望这有效:)