UIViewContentModeScaleAspectFill不剪裁

我正在尝试使用UIImageView以固定大小(100×100)绘制一些缩略图图像。 我将图像视图的框架大小设置为100×100,并将contentMode设置为UIViewContentModeScaleAspectFill

我的理解是,这应该使图像以我设置的大小绘制,并且图像将填充图像的区域,并剪切图像视图外的大小的任何部分。 但是,图像仍然绘制得比我为它设置的100×100大小更大或更小。

如果我将contentMode设置为UIviewContentModeScaleToFill ,那么图像的精确度就是100×100,但是它会被扭曲以适应这些维度。 任何想法为什么方面填充没有按预期剪裁?

这是我的代码:

 _photoView = [[UIImageView alloc] initWithImage:photoImage]; _photoView.contentMode = UIViewContentModeScaleAspectFill; [self addSubview:_photoView]; CGRect photoFrame = _photoView.frame; photoFrame.size = CGSizeMake(100, 100); _photoView.frame = photoFrame; 

为了更好地说明,下面是我所看到的截图。 绿色方块是包含我正在使用的UIImageViewUIView 。 我已经将他们的背景颜色设置为绿色,并将视图的框架设置为100×100。 作为一个testing, UIImageViews的大小为50×50。 正如你所看到的,当使用...AspectFill ,图像的大小不是50×50,在某些情况下是偏离我想要的位置。 当使用...ScaleToFill ,它们的大小正确,但图像失真。

说明问题的截图

你可以尝试设置剪辑到界限

 [_photoview setClipsToBounds:YES]; 

或者如果你可以直接在你的Storyboard / Xib中:

在这里输入图像说明

如果你想扩大你的知识有一个非常好的文章,如何iOS的UIView堆栈呈现 。 还有一个关于整个绘图pipe道的更深入的文章。

综上所述:

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

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

  2. 构图 – 结果从子视图到超级视图进行合成(绘制在彼此之上)。 这使用子视图的框架属性。

    如果在clipsToBounds属性为YES ,那么它将在其边界外放弃子视图内容。

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

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

我勾选“剪辑子视图”后,问题就解决了。 🙂

直接在Storyboard / Xib中检查“剪辑子视图”也适用于我。 在这里输入图像说明

我的子视图正在调整,我意识到这是因为xib有自动布局设置: 在这里输入图像说明

如果一切失败,

将剪辑剪切到viewDidLayoutSubviews方法中。

例如:

  override func viewDidLayoutSubviews() { imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2 imageProfile.clipsToBounds = true imageProfile.layer.masksToBounds = true }