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 处更改:
将第二行改为cell.imageView.transform = CGAffineTransformMakeScale(0.0000001, 0.0000001);
。没有任何反应(即图像视图和其中的图像仍然一样大)。
将第二行改为cell.imageView.transform = CGAffineTransformMakeScale(0, 0);
。图像从图像视图中消失,但图像视图的大小仍然相同,您可以看出来,因为它仍然取代单元格中的文本并将其推到最右边。
删除第一行代码(不再将图像分配给图像视图)。图像视图消失,文本一直移动到单元格的左侧。
也许这可以帮助阐明正在发生的事情?
因此,如果您尝试调整图像大小以适应 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 不再工作了,但这已经完成了工作。
在我构建的应用程序中,我有一个 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 处更改:
将第二行改为
cell.imageView.transform = CGAffineTransformMakeScale(0.0000001, 0.0000001);
。没有任何反应(即图像视图和其中的图像仍然一样大)。将第二行改为
cell.imageView.transform = CGAffineTransformMakeScale(0, 0);
。图像从图像视图中消失,但图像视图的大小仍然相同,您可以看出来,因为它仍然取代单元格中的文本并将其推到最右边。删除第一行代码(不再将图像分配给图像视图)。图像视图消失,文本一直移动到单元格的左侧。
也许这可以帮助阐明正在发生的事情?
因此,如果您尝试调整图像大小以适应 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 不再工作了,但这已经完成了工作。