UITableViewCell 转换中断 iOS 11

UITableViewCell Transform Breaks in iOS 11

在我构建的应用程序中,我有一个 table 视图,通过 运行 cellForRowAtIndexPath 中的以下代码显示每个单元格左侧的图像:

cell.imageView.image = [UIImage imageNamed:myImage];

但是图片太大了,所以我把它缩小了:

cell.imageView.transform = CGAffineTransformMakeScale(0.3, 0.3);

这在 iOS 10 中工作得很好。但是一旦我使用 iOS 11 SDK 升级到最新的 Xcode,图像就会变得很大。事实证明,转换图像视图的第二行代码现在什么也没做:我可以将其注释掉,将 0.3 更改为其他内容,等等,但没有任何区别。 CGAffineTransformMakeScale 在新的 Xcode 中仍然有文档,所以我假设它没有被弃用,但是为什么这会与 iOS 11 中断,我该如何修复它?有任何想法吗?提前致谢!请注意,我使用的是 Objective-C.

编辑:

刚刚尝试对代码进行 3 处更改:

  1. 将第二行改为cell.imageView.transform = CGAffineTransformMakeScale(0.0000001, 0.0000001);。没有任何反应(即图像视图和其中的图像仍然一样大)。

  2. 将第二行改为cell.imageView.transform = CGAffineTransformMakeScale(0, 0);。图像从图像视图中消失,但图像视图的大小仍然相同,您可以看出来,因为它仍然取代单元格中的文本并将其推到最右边。

  3. 删除第一行代码(不再将图像分配给图像视图)。图像视图消失,文本一直移动到单元格的左侧。

也许这可以帮助阐明正在发生的事情?

因此,如果您尝试调整图像大小以适应 imageView,您实际上应该像这样使用 imageView 的 contentMode 属性:

cell.imageView.contentMode = UIViewContentModeScaleAspectFit;

或 Swift 其他人

cell.imageView.contentMode = .scaleAspectFit

这会保留图像的尺寸并将最大尺寸的图像适合imageView而不改变尺寸

您也可以尝试 UIViewContentModeScaleAspectFit(或 Swift 中的 .scaleAspectFill),它基本上完全填满了 imageView 的尺寸,但如果图片更宽或更高比图像视图裁剪不适合的内容。

以下是直接来自 Obj-C 和 Swift 源文件的所有内容模式:

typedef NS_ENUM(NSInteger, UIViewContentMode) {
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit,      // contents scaled to fit with fixed aspect. remainder is transparent
UIViewContentModeScaleAspectFill,     // contents scaled to fill with fixed aspect. some portion of content may be clipped.
UIViewContentModeRedraw,              // redraw on bounds change (calls -setNeedsDisplay)
UIViewContentModeCenter,              // contents remain same size. positioned adjusted.
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
};

public enum UIViewContentMode : Int {
    case scaleToFill
    case scaleAspectFit // contents scaled to fit with fixed aspect. remainder is transparent
    case scaleAspectFill // contents scaled to fill with fixed aspect. some portion of content may be clipped.
    case redraw // redraw on bounds change (calls -setNeedsDisplay)
    case center // contents remain same size. positioned adjusted.
    case top
    case bottom
    case left
    case right
    case topLeft
    case topRight
    case bottomLeft
    case bottomRight
}

编辑:

因为我看到您也有兴趣更改 imageView 本身的尺寸 ("to leave more room for the text") 我的建议实际上是在故事板中或以编程方式使用 AutoLayout 添加您自己的尺寸imageView 并根据需要调整大小和位置,而不是在单元格上使用默认的 imageView 作为 convenient/standardized 工具。

如果您对此不熟悉,我会 google 获取 AutoLayout 教程。或者 "using AutoLayout to create custom UITableViewCell"

如果您实际上不想创建自己的子类,您可以尝试在某处设置 `cell.imageView.frame = ..." 以手动将其调整为您想要的大小,然后设置其内容模式以确保图片非常适合静止。

看到这个问题:How do I make UITableViewCell's ImageView a fixed size even when the image is smaller

找到了我自己的问题的答案,感谢保罗对这个问题的回答:

CGSize  itemSize = CGSizeMake(50, 50);
UIGraphicsBeginImageContextWithOptions(itemSize, false, 0);
CGRect  imageRect = CGRectMake(0, 0, itemSize.width, itemSize.height);
[cell.imageView.image drawInRect:imageRect];
cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

我仍然不知道为什么旧的 CGAffineTransformMakeScale 不再工作了,但这已经完成了工作。