我正在尝试使用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
时,它们的大小正确,但图像失真。
答案 0 :(得分:349)
答案 1 :(得分:8)
如果你想扩展你的知识,有一篇关于如何iOS UIView stack is rendered的非常好的文章。还有一篇关于whole drawing pipeline的更深入的文章。
总结:
光栅化 - 所有视图的内容都在视图边界的坐标空间中进行光栅化(绘制或屏幕外像素缓冲区)。这可以是图像数据或自定义绘图(即drawRect:
),但可以是子视图内容。此光栅化考虑了contentMode
属性。
视图边界之外的任何内容都将被丢弃。
合成 - 从子视图到超级视图合成(在彼此之上绘制)结果。这使用了子视图的frame属性。
如果超级视图中的clipsToBounds
属性为YES
,则会丢弃其边界之外的子视图内容。
答案 2 :(得分:2)
有同样的问题,并通过勾选"剪辑子视图"来解决。
图像在故事板预览中正确显示所有视图(3.5,4,4.7,5.5,ipad),但未在模拟器中显示。
我勾选了#34;剪辑子视图"问题解决了。 :)
答案 3 :(得分:1)
答案 4 :(得分:0)
我的子视图正在调整大小,我意识到这是因为xib具有自动布局设置:
答案 5 :(得分:0)
如果一切都失败了,
在viewDidLayoutSubviews方法中对剪辑进行限制。
示例:
override func viewDidLayoutSubviews() {
imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
imageProfile.clipsToBounds = true
imageProfile.layer.masksToBounds = true
}