UIViewContentModeScaleAspectfill 非剪切

我试图绘制一些缩略图在一个固定的大小(100x100)使用 UIImageView。我已经将我的图像视图的帧大小设置为100x100,并将 contentMode设置为 UIViewContentModeScaleAspectFill

我的理解是,这应该导致图像绘制在我设置的大小,图像将填充图像的区域,并剪辑图像的任何部分以外的大小我设置的图像视图。但是,图像仍然绘制大于或小于我为它设置的100x100大小。

如果我将 contentMode设置为 UIviewContentModeScaleToFill,那么图像的绘制精确到100x100,但是它被扭曲以适应这些尺寸。知道为什么方面填充没有按预期剪切吗?

这是我的密码:

_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];


CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;

为了更好地说明,这里是我所看到的截图。绿色方块是包含我正在处理的 UIImageViewUIView。我已经将它们的背景颜色设置为绿色,视图的框架设置为100x100。作为测试,UIImageViews的大小为50x50。正如您所看到的,当使用 ...AspectFill时,图像的大小不是50x50,并且在某些情况下会偏离我希望它们的位置。使用 ...ScaleToFill时,它们的大小正确,但图像失真。

Screenshot illustrating problem

55613 次浏览

你能尝试设置剪辑的边界

[_photoview setClipsToBounds:YES];

如果可以的话,也可以直接在你的故事板/Xib 上:

enter image description here

如果你想扩展你的知识有一个真正的好文章关于如何 呈现 iOSUIView 堆栈。还有一篇关于 整个绘图管道的更深入的文章。

总之:

  1. 栅格化 -所有视图的内容都在视图边界的坐标空间中进行栅格化(绘制或屏幕外的像素缓冲区)。这可能是图像数据或自定义绘图(即 drawRect:) ,但子视图内容。这种栅格化考虑到了 contentMode的属性。

    任何超出视图范围的东西都会被丢弃。

  2. 组合 -结果是从子视图到超视图的组合(相互叠加)。这将使用子视图的框架属性。

    如果超视图上的 clipsToBounds属性是 YES,那么它将丢弃其边界之外的 地区内容。

我的子视图正在调整大小,我意识到这是因为 xib 有自动布局设置: enter image description here

有同样的问题,并通过勾选“剪辑副图”来解决。

在故事板预览中,图像对于所有视图(3.5,4,4.7,5.5,ipad)都显示正确,但是在模拟器中却没有。

在我勾选“ Clip Subviews”之后,问题就解决了。 :)

直接在 Storyboard/Xib 中检查“ Clip subviews”也对我有用。 enter image description here

如果一切都失败了,

在 viewDidLayoutSubviews 方法中将剪辑做到界限。

例如:

  override func viewDidLayoutSubviews() {


imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
imageProfile.clipsToBounds = true
imageProfile.layer.masksToBounds = true
}