我试图调整我的表格视图中的一个单元格的高度。我正在调整单元格的“大小检查器”内的“行高”设置的大小。当我在我的iPhone上运行应用程序时,单元格的默认大小设置自表格视图中的“行大小”。

如果我改变了表格视图的“行大小”,那么所有单元格的大小都会改变。我不想这样做,因为我只想为一个单元格自定义大小。我已经看到了很多关于这个问题的程序化解决方案的帖子,但如果可能的话,我更喜欢通过故事板来实现。


当前回答

如果你想设置一个静态行高,你可以这样做:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 120;
}

其他回答

在动态单元格上,UITableView上设置的rowHeight总是覆盖单个单元格的rowHeight。

但是在静态单元格上,在单个单元格上设置rowHeight可以覆盖UITableView的。

不确定这是否是一个漏洞,苹果可能是故意这么做的?

对于动态单元格,UITableView上设置的rowHeight总是覆盖单个单元格的rowHeight。

在我看来,这种行为是个bug。任何时候你都必须在两个地方管理UI,这很容易出错。例如,如果您在故事板中更改单元格大小,您必须记住在highightforrowatindexpath:中也要更改它们。在苹果修复这个错误之前,目前最好的解决方法是重写highightforrowatindexpath:,但是使用故事板中的实际原型单元格来确定高度,而不是使用神奇的数字。这里有一个例子:

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    /* In this example, there is a different cell for
       the top, middle and bottom rows of the tableView.
       Each type of cell has a different height.
       self.model contains the data for the tableview 
    */
    static NSString *CellIdentifier;
    if (indexPath.row == 0) 
        CellIdentifier = @"CellTop";
    else if (indexPath.row + 1 == [self.model count] )
        CellIdentifier = @"CellBottom";
    else
        CellIdentifier = @"CellMiddle";

    UITableViewCell *cell = 
              [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    return cell.bounds.size.height;
}

这将确保对原型单元格高度的任何更改将在运行时自动拾取,并且您只需要在一个地方管理您的UI:故事板。

你可以做的另一件事是到你的文档大纲,选择原型单元格嵌套的表格视图。然后在大小检查器上,将表视图行高更改为所需的值,并取消选中“自动”框。

我认为这是一个bug。

尝试调整高度不是通过实用工具检查器,而是直接通过鼠标拖动故事板。

我用这个方法解决了这个问题。

我最近一直在纠结这个问题。我的问题是上面发布的解决方案使用highightforrowatindexpath:方法可以在模拟器中的iOS 7.1中工作,但如果简单地切换到iOS 8.1,就会完全搞砸结果。

我开始阅读更多关于自调整单元格的内容(在iOS 8中引入,阅读这里)。很明显,在iOS 8中使用UITableViewAutomaticDimension会有所帮助。我尝试使用这种技术并删除了highightforrowatindexpath:瞧,它现在在iOS 8中完美地工作了。但是iOS 7并没有。我该怎么办呢?我需要heightForRowAtIndexPath: iOS 7,而不是iOS 8。

以下是我的解决方案(为简洁起见进行了修改),借鉴了@JosephH上面发布的答案:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.estimatedRowHeight = 50.;
    self.tableView.rowHeight = UITableViewAutomaticDimension;

    // ...
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
        return UITableViewAutomaticDimension;

    } else {
        NSString *cellIdentifier = [self reuseIdentifierForCellAtIndexPath:indexPath];
        static NSMutableDictionary *heightCache;
        if (!heightCache)
            heightCache = [[NSMutableDictionary alloc] init];
        NSNumber *cachedHeight = heightCache[cellIdentifier];
        if (cachedHeight)
            return cachedHeight.floatValue;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    CGFloat height = cell.bounds.size.height;
    heightCache[cellIdentifier] = @(height);
    return height;
    }
}

- (NSString *)reuseIdentifierForCellAtIndexPath:(NSIndexPath *)indexPath {
    NSString * reuseIdentifier;
    switch (indexPath.row) {
        case 0:
            reuseIdentifier = EventTitleCellIdentifier;
            break;
        case 2:
            reuseIdentifier = EventDateTimeCellIdentifier;
            break;
        case 4:
            reuseIdentifier = EventContactsCellIdentifier;
            break;
        case 6:
            reuseIdentifier = EventLocationCellIdentifier;
            break;
        case 8:
            reuseIdentifier = NotesCellIdentifier;
            break;
        default:
            reuseIdentifier = SeparatorCellIdentifier;
            break;
    }

    return reuseIdentifier;
}

SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@“8.0”)实际上来自我正在使用的一组宏定义,这是我在某处找到的(非常有用)。它们被定义为:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)