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;
为了更好地说明,下面是我所看到的截图。 绿色方块是包含我正在使用的UIImageView
的UIView
。 我已经将他们的背景颜色设置为绿色,并将视图的框架设置为100×100。 作为一个testing, UIImageViews
的大小为50×50。 正如你所看到的,当使用...AspectFill
,图像的大小不是50×50,在某些情况下是偏离我想要的位置。 当使用...ScaleToFill
,它们的大小正确,但图像失真。
你可以尝试设置剪辑到界限
[_photoview setClipsToBounds:YES];
或者如果你可以直接在你的Storyboard / Xib中:
如果你想扩大你的知识有一个非常好的文章,如何iOS的UIView堆栈呈现 。 还有一个关于整个绘图pipe道的更深入的文章。
综上所述:
-
栅格化 – 在视图边界的坐标空间中,所有视图的内容都被栅格化(绘制或离屏像素缓冲区)。 这可能是图像数据或自定义绘图(即
drawRect:
但子视图内容。 这个栅格化考虑了contentMode
属性。任何超出视图范围的东西都会被丢弃。
-
构图 – 结果从子视图到超级视图进行合成(绘制在彼此之上)。 这使用子视图的框架属性。
如果在
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 }