如何根据屏幕大小设置UITableViewCell的高度

6
我从网上下载了文本和图片数据。我将这些数据放入UITableView中,并希望图像成为UITableViewCell的背景。 所有图片都具有相同的分辨率620x350。
由于各款iPhone尺寸不同,因此我需要根据屏幕大小缩放图像的宽度和高度,并对UITableViewCell进行相同处理。
有哪些最佳解决方案?
谢谢。

1
为什么?更大的屏幕的意义在于能够在屏幕上显示更多的信息。从你所描述的来看,如果你只是要显示相同数量的信息,那么支持更大的屏幕有何意义呢? - rmaddy
1
我不知道如何在保持相同的宽高比的情况下调整图像大小。这实际上是我的问题。 - igrrik
3个回答

3
最佳和清洁的解决方案就是通过调整单元格高度,让图片被自动调整大小。具体操作如下:
1. 在你的单元格中添加一个UIImageView并设置你想要的尺寸,当单元格高度实际存在时; 2. 设置这个UIImageView的约束条件,至少包括顶部、底部和其中一侧边框(右侧或左侧),还要设置保持宽高比例的约束条件;
这样,当单元格增长时,图像会随着高度增加,并且由于有约束条件的保持比例作用,它的宽度也会变化,始终保持正确和成比例的大小。
现在,你只需要编写单元格高度的代码即可。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    static CGFloat cellDefaultHeight = /*the default height of the cell*/;
    static CGFloat screenDefaultHeight = /*the default height of the screen i.e. 480 in iPhone 4*/;

    CGFloat factor = cellDefaultHeight/screenDefaultHeight

    return factor * [UIScreen mainScreen].bounds.size.height;
}

显然,将 UIImageViewcontentMode 设置为 AspectFill

谢谢您的回答,看起来是正确的。但在我开始尝试之前,只有一个问题。 默认情况下,故事板应该使用什么尺寸? 我的故事板是标准的600x600,我为每个屏幕计算了图像的大小,我有 3.5 / 4英寸屏幕的320x180 4.7英寸的375x211 5.5英寸的414x233显然,宽度是屏幕的最大宽度,高度是根据1.77的宽高比计算的。这些中哪一个应该默认使用?还有,我需要放UIImageView吗?为什么不使用单元格的背景呢? - igrrik
默认单元格的高度取决于320像素宽屏幕的设置,这是您可以决定的。同样,如果将图像作为背景放置或不放置,则在屏幕高度较高且宽度相同时(例如iPhone 5),会出现比例问题。该图像将被重复显示。 - Matteo Gobbi
是的。谢谢。它几乎可以工作,除了一个问题。看看这些截图。在主视图中,图像被裁剪,在所有设备上都发生。 https://www.dropbox.com/s/evuse7mqi3q7tsc/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202015-01-24%20%D0%B2%202.58.17.png?dl=0 https://www.dropbox.com/s/m0rssbq83dau4pd/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202015-01-24%20%D0%B2%202.58.38.png?dl=0 - igrrik
这取决于您设置的图像。 - Matteo Gobbi

2

只需使用- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

即可。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
  CGFloat aspectRatio = 350.0f/620.0f;
   return aspectRatio * [UIScreen mainScreen].bounds.size.width;// assuming that the image will stretch across the width of the screen
}

谢谢你的回答。所以如果我理解正确的话,这将根据屏幕大小给我图像的新高度,是吗?但我不确定在哪里放置它来设置单元格的高度。 - igrrik
棘手的部分是约束条件。这段代码不够。然后,在一行中有三个错误:原始类型的指针;整数除以浮点数;末尾没有句号分号。 - Matteo Gobbi
@Bennie,谢谢。你的代码是正确的。不过,我需要使用Matteo Gobbi答案中的约束条件。 - igrrik
如果你打算使用我的方法,那么不太清楚为什么(@igrrik)选择这个作为正确答案。 - Matteo Gobbi

-1
你可以在HTTableViewDelegate中使用-tableView:heightForRowAtIndexPath:方法来返回每个单元格的高度。在你的情况下,你需要像这样的代码:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return [UIScreen mainScreen].bounds.size.height;
}

这样会得到屏幕的分辨率,对吧?然后我需要做类似于 switch-case 语句的东西,在那里设置单元格的宽度和高度? - igrrik
没有图像约束,它无法正常工作。此外,它只返回所有单元格的屏幕高度。 - Matteo Gobbi
他并没有问如何将图像适应单元格大小,而是询问如何将单元格高度设置为屏幕高度。将图像调整到单元格大小是容易的部分。 - AdamPro13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接