2

前言:这是一个相当抽象的问题。

我有一些单元格UITableView使用不同的图像,具体取决于单元格的高度(以 50px 为增量,从 50px 到 1000px 高)。我遇到了一个奇怪的问题,当应用程序首次加载时,cellForRowAtIndexPath报告前三个单元格(无论三个单元格是否都在屏幕上)的高度为 100px,然后当我向下滚动并再次向上滚动时,它们的高度会恢复到正确的值。屏幕上没有高度变化,只有使用的图像发生变化,以及cell.frame.size.height我的NSLog陈述中的值。

我一直在登录,heightForRowAtIndexPath并且cellForRowAtIndexPath我可以在他们离开时验证高度是否正确heightForRowAtIndexPath。但是,当输入 时cellForRowAtIndexPath,前三个高度都统一设置为 100。然后我向下滚动直到这三个单元格离开屏幕,然后向上滚动,.height值已更改为正确的值。

总结一下,我的问题是:

heightForRowAtIndexPath在最后和最开始之间是否有任何代码cellForRowAtIndexPath可以改变cell.frame.size.height这些前几个单元格的值?

为什么这个问题只发生在前三个单元格上?而且,为什么他们会在稍后重新加载时恢复?我认为重用标识符可能是原因,但它们在首次加载时仍被分配了该标识符,所以这不重要,不是吗?

编辑:我认为 100px 高度来自故事板中原型单元格的行高,就好像我将其更改为 101px 一样,前三个单元格最初为 101px。

编辑:这是我用来设置图像的代码,虽然这部分正在工作,但它只是使用了错误的值:

UIImage *cappedBG;
float cellHeight = cell.contentView.frame.size.height;

if (cellHeight <= 51) {
    cappedBG = [[UIImage imageNamed: @"bg50.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
} else if (cellHeight <= 101) {
    cappedBG = [[UIImage imageNamed: @"bg100.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
} else if (cellHeight <= 151) {
    cappedBG = [[UIImage imageNamed: @"bg150.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
} else if (cellHeight <= 201) {
    cappedBG = [[UIImage imageNamed: @"bg200.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
} else {
    cappedBG = [[UIImage imageNamed: @"bg250.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
} 
4

3 回答 3

4

您只是不能依赖tableView:cellForRowAtIndexPath:. 您在该方法中配置的单元格的框架将在代码从此方法返回后设置。

您获得的值不是该特定行的实际高度。您从刚刚出列的单元格中获得高度。如果没有单元格出列,则使用刚刚创建的单元格的高度。100 可能是故事板/笔尖中单元格的高度。
这个高度与将要显示的单元格的高度无关。

由于您已经计算了行高,因此请tableView:heightForRowAtIndexPath:使用此值。

float cellHeight = [self tableView:tableView heightForRowAtIndexPath:indexPath];

if (cellHeight <= 51) {
    cappedBG = [[UIImage imageNamed: @"bg50.png"] resizableImageWithCapInsets: UIEdgeInsetsMake(25, 25, 25, 25) resizingMode: UIImageResizingModeStretch];
...
于 2013-03-20T10:32:51.687 回答
1

您不应该真正在 cellForRowAtIndexPath 中进行单元格的布局。

最好的方法是创建一个 UITableViewCell 子类,其中包含您需要的所有 UI 元素。

然后在子类中你可以覆盖- (void)layoutSubviews.

这样您就可以将所有内容分开,而不是将所有内容都放在视图控制器中。

于 2013-03-19T14:09:18.510 回答
1

目前,在查看您的问题后,我认为您在使用不同的单元格高度时遇到了问题(滚动时)。我相信您没有在 heightForRowAtIndexPath 中给出正确的值。

以下是我编写的简单代码。这段代码在表格中显示了 20 行,交替行有不同的大小。(我用不同的颜色来区分)

#pragma mark - TableView DataSource Methods

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.row %2 == 0) return 50;
    else return 100;
}

// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *stringCellIdentifier = @"BookOutVehicleCell";

    UITableViewCell *tableViewCell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:stringCellIdentifier];

    if (tableViewCell == nil)
        tableViewCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:stringCellIdentifier] autorelease];

    if(indexPath.row %2 == 0) tableViewCell.contentView.backgroundColor = [UIColor redColor];
    else  tableViewCell.contentView.backgroundColor = [UIColor greenColor];

       return tableViewCell;

}

#pragma mark - TableView Delegate Methods
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

}

这是输出。

在此处输入图像描述

在这种情况下,即使我们上下滚动 tableview,行高也不会改变。

希望这可以帮助。对不起,如果我误解了你的问题。如果您提供代码片段会很好。它会让我们更好地了解这个问题。

编辑: 根据我对问题的理解,您正在为每行/单元格获得正确的高度,但是您在单元格中使用了一个图像视图,它将根据单元格的高度显示不同的图像。检查以下是否适合您:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *stringCellIdentifier = @"BookOutVehicleCell";

        UITableViewCell *tableViewCell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:stringCellIdentifier];

        if (tableViewCell == nil)
            tableViewCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:stringCellIdentifier] autorelease];

       //Check your height here and use appropriate image 
       if(cell.contentView.frame.size.height <100)
       {
            image = "xxx.png";
       }
       else
       if(cell.contentView.frame.size.height >=100 && cell.contentView.frame.size.height <200)
       {
           image = "yyy.png";
       }


    }

谢谢。

于 2013-03-19T14:38:16.270 回答