【问题标题】:How to set UITableViewCell height depending on screen size如何根据屏幕大小设置 UITableViewCell 高度
【发布时间】:2015-01-23 21:53:54
【问题描述】:

我从网上下载数据,它由文本和图像组成。我将这些数据放入 UITableView,我希望图像成为 UITableViewCell 的背景。 所有图像的分辨率均为 620x350。

所有的 iPhone 都有不同的屏幕尺寸,所以我需要根据屏幕尺寸缩放图像的宽度和高度,并对 UITableViewCell 执行此操作。

什么是最好的解决方案?

谢谢。

【问题讨论】:

  • 为什么?大屏幕的重点是能够在屏幕上显示更多信息。根据您的描述,如果您只想显示相同数量的信息,为什么还要支持更大的屏幕?
  • 我不知道如何在保持相同纵横比的情况下调整图像大小。这实际上是我的问题。

标签: ios objective-c uitableview


【解决方案1】:

最好和干净的解决方案,它只是调整单元格的高度,让图像通过自动布局自动调整大小

很简单:

  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,我计算了每个屏幕的图像尺寸,我有 320x180 用于 3.5/4 英寸屏幕 375x211 用于 4.7 英寸 414x233 用于 5.5 英寸显然宽度是屏幕的最大宽度,高度计算为纵横比为 1.77。我应该默认使用哪一个?我还需要放 UIImageView 吗?为什么不使用单元格的背景?
  • 320px 宽度的屏幕的默认单元格的高度是您可以决定的。同样是否将图像作为背景,但在这种情况下,当屏幕较高且宽度相同(即 iPhone 5)时,您会遇到比例问题。图像将被重复。
  • 是的。谢谢你。它几乎可以工作,除了一个问题。看截图。在主视图中,图像被剪切,并且发生在所有设备上。 dropbox.com/s/evuse7mqi3q7tsc/…dropbox.com/s/m0rssbq83dau4pd/…
  • 这取决于您设置的图像。
【解决方案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
}

【讨论】:

  • 感谢您的回答。因此,如果我理解您,这将根据屏幕尺寸为我提供图像的新高度,对吗?但我不知道把它放在哪里,设置单元格的高度。
  • 棘手的部分是约束。这段代码是不够的。然后,在 1 行中,您有 3 个错误:原始指针;浮点数的 int 除法;最后没有点逗号。
  • @Bennie,谢谢。你的代码是对的。不过,我需要使用来自 Matteo Gobbi 答案的约束。
  • 如果您要使用我的方法,为什么 (@igrrik) 选择此作为正确答案还不清楚。
【解决方案3】:

您可以使用HTTableViewDelegate 中的-tableView:heightForRowAtIndexPath: 方法返回每个单元格的高度。在你的情况下,你会想要这样的东西:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

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

【讨论】:

  • 所以这会给出屏幕的分辨率,对吧?然后我必须像 switch-case 语句一样,在哪里设置单元格的宽度和高度?
  • 如果没有对图像的约束,它就不能正常工作。此外,这只是返回所有具有屏幕高度的单元格。
  • 他没有问如何使图像适合单元格。他问如何将单元格高度设置为屏幕高度。将图像调整为单元格大小是很容易的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 2015-09-12
  • 2020-11-22
  • 1970-01-01
  • 2013-08-23
相关资源
最近更新 更多