8

一个应用程序包含一个包含自定义 UITableViewCell 的 UITableView。该单元格又​​包含一个 UIImageView。

问题是在 cellForRowAtIndexPath 中设置图片会使图片占据整个 UITableViewCell 区域:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"bigrect" ofType:@"png"];
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];

    cell.imageView.image = image;

    return cell;
}

在此处输入图像描述

在 IB 中,已选择“Aspect Fit”作为模式,但更改此字段对结果没有明显影响。

但是,当从 IB 设置图像时,在我的代码中没有调用 cell.imageView.image = image 时,结果正是我希望看到的。图像保持在我为 IB 中的 UIImageView 定义的范围内,并且不会尝试缩放以适应 UITableViewCell 的整个垂直高度:

在此处输入图像描述

我使用的图像是 1307x309 像素,以防万一。测试在 iOS 6.1 模拟器上运行。

我从UIIMageView 文档中注意到了这一点:

在 iOS 6 及更高版本中,如果您为此视图的 restoreIdentifier 属性分配一个值,它会尝试保留显示图像的框架。具体来说,该类保留视图的边界、中心和变换属性的值以及底层的锚点属性。在恢复过程中,图像视图会恢复这些值,以便图像与以前完全一样。有关状态保存和恢复如何工作的更多信息,请参阅 iOS App Programming Guide。

但是,我无法在文档中的此处或其他地方找到任何解决问题的方法。在“身份”下的 IB 中的 UIImageView 中添加“Foo”的“恢复 ID”并没有改变行为。取消选中“使用自动布局”也没有改变行为。

设置图像时,如何防止 iOS 在 UITableViewCell 中调整 UIImageView 的大小?

4

1 回答 1

6

事实证明,UITableViewCell 显然已经有一个名为“imageView”的属性,它覆盖了单元格的整个背景。设置此 imageView 对象的 image 属性设置背景图像,而不是我感兴趣的图像。

将我的方法更改为以下内容,同时确保 CustomCell 具有“myImageView”属性解决了问题:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"bigrect" ofType:@"png"];
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];

    cell.myImageView.image = image;

    return cell;
}

这个 SO对一个稍微不同的问题的回答为我指明了正确的方向。

于 2013-04-03T21:43:21.653 回答