UIViewContentModeScaleAspectFill不裁剪


144

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

我的理解是,这应导致以我设置的尺寸绘制图像,并且图像将填充图像的区域,并裁剪超出我为图像视图设置的尺寸的图像部分。但是,仍然绘制的图像大于或小于我为其设置的100x100尺寸。

如果将设置contentModeUIviewContentModeScaleToFill,则图像将以100x100精确绘制,但会失真以适合这些尺寸。有什么想法为什么长宽比填充没有按预期裁剪?

这是我的代码:

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

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

为了更好地说明,这是我所看到的屏幕截图。绿色方形的UIView含有UIImageView我的工作。我将其背景色设置为绿色,并将视图的框设置为100x100。作为测试,UIImageViews尺寸为50x50。如您所见,当使用时...AspectFill,图片的尺寸不会调整为50x50,在某些情况下会偏离我想要的位置。使用时...ScaleToFill,它们的尺寸正确,但是图像失真。

屏幕截图说明了问题

Answers:


352

你可以尝试将剪辑设置为边界吗

[_photoview setClipsToBounds:YES];

或直接在您的Storyboard / Xib中:

在此处输入图片说明


10
就是这样-谢谢。(我添加了上面的屏幕截图,以更好地显示我所看到的内容,更多地作为示例,如果有人遇到此问题。)
Josh Buhler

3
在InterfaceBuilder中,(无用地)重命名为“ Clips subviews”(注意:在这种情况下,它没有clib“ subviews”,名称是错误的:它剪辑了SELF AND subviews)
Adam

3
勾选NIB文件中的“剪辑子视图”选项可以完成相同的操作。干杯。
codeburn 2014年

但是,如果您想使用CALayer属性添加阴影,该怎么办:(在它后面添加另一个视图对我而言并不理想
Rambatino 2015年

如果像我一样使用自动布局,则还有另一个可能的原因,这是NSLayoutConstraint“ UIView-Encapsulated-Layout-Height”打破了UIImageView大小限制。
ewiinnnnn

8

如果您想扩展自己的知识,那么有一篇关于iOS UIView堆栈如何呈现的非常好的文章。还有关于整个绘图管道的更深入的文章。

综上所述:

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

    视图范围之外的所有内容都将被丢弃。

  2. 组合 -结果从子视图到超级视图被合成(彼此绘制)。这将使用子视图的frame属性。

    如果该clipsToBounds属性位于YES超级视图上,则它将在其范围之外丢弃子视图内容。


2

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

在情节提要预览中,所有视图(3.5、4、4.7、5.5,ipad)的图像均正确显示,但在模拟器中却没有。

在我勾选“剪辑子视图”后,问题得以解决。:)



0

我的子视图正在调整大小,我意识到这是因为xib设置了自动布局: 在此处输入图片说明


0

如果一切失败

在viewDidLayoutSubviews方法中将剪辑剪辑到边界。

范例:

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.