UIViewContentModeScaleAspectFill不剪切

时间:2011-07-10 01:37:26

标签: ios uiimageview

我正在尝试使用UIImageView以固定尺寸(100x100)绘制一些缩略图。我已将图片视图的边框尺寸设置为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;

为了更好地说明,这里是我所看到的截图。绿色方块是UIView,其中包含我正在使用的UIImageView。我将它们的背景颜色设置为绿色,并将视图的帧设置为100x100。作为测试,UIImageViews的大小为50x50。如您所见,使用...AspectFill时,图像的大小不会达到50x50,在某些情况下会偏离我喜欢的位置。使用...ScaleToFill时,它们的大小正确,但图像失真。

Screenshot illustrating problem

6 个答案:

答案 0 :(得分:349)

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

[_photoview setClipsToBounds:YES];

如果可以,直接在Storyboard / Xib中:

enter image description here

答案 1 :(得分:8)

如果你想扩展你的知识,有一篇关于如何iOS UIView stack is rendered的非常好的文章。还有一篇关于whole drawing pipeline的更深入的文章。

总结:

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

    视图边界之外的任何内容都将被丢弃。

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

    如果超级视图中的clipsToBounds属性为YES,则会丢弃其边界之外的子视图内容。

答案 2 :(得分:2)

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

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

我勾选了#34;剪辑子视图"问题解决了。 :)

答案 3 :(得分:1)

检查"剪辑子视图"直接在Storyboard / Xib中也为我工作。 enter image description here

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果一切都失败了,

在viewDidLayoutSubviews方法中对剪辑进行限制。

示例:

  override func viewDidLayoutSubviews() {

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