【问题标题】:Why UIImageView's image can extend beyond itself?为什么 UIImageView 的图像可以超越自身?
【发布时间】:2015-03-02 18:57:43
【问题描述】:

以前,我认为 UIImageView 的图像不能超出视图。然而,最近我读了IOS8 编程一书,它说:

您还应该注意 UIImageView 的 clipsToBounds 属性;如果它是 false,它的图像,即使它比图像视图大,即使它没有被 contentMode 缩小,也可以完整地显示,超出图像视图本身。

然后我做了一些简单的测试,这是真的。

问题来了:苹果设计UIImageView这个功能的目的是什么?我,目前,找不到它的优势。我认为这会使contentMode 成为假财产。

这是一个例子:

这是一个refreshView,上面在UITableView 中带有自定义的下拉刷新动画。我设置了一个与 refreshView 大小相同的UIImageView 并将其添加为背景视图。相关代码在这里:

let imgView = UIImageView()
imgView.frame = self.bounds
imgView.image = UIImage(named: "refresh-view-bg.png")
imgView.contentMode = .ScaleAspectFill
imgView.clipsToBounds = true
self.addSubview(imgView)

效果很好:

但是,当我注释这一行时:

imgView.clipsToBounds = true

变成这样:

图像超出 UIImageView

ps:我在这个演示中没有使用 autoLayout

【问题讨论】:

  • 不是专门为UIImageView 做的,但对任何UIView 都是如此。
  • 但是图像是属性而不是子视图@A-Live
  • 没关系,作为UIViewUIImageView 的实例可以像任何其他UIView 一样在其边界之外绘制内容,它也与自动布局没有直接关系,而是绘图实现的结果。

标签: ios objective-c uiimageview


【解决方案1】:

这是由于自动布局。 UIImageView 通过计算图像大小返回其-intrinsicContentSize。如果您想避免这种情况,您应该设置一个宽度(或高度)约束,或者如果您想共享视图时的空间是否与周围的其他视图一起布置,请使用content hugging/compression resistance 优先级。

【讨论】:

  • 但是当我不给它布局约束时,只需设置 UIImageView 的框架。也会出现这个问题。
  • 因为如果您的项目启用了自动布局,自动布局将适用于所有视图,并且如果发现可能发生冲突的内容,则不会关心您的框架。停止使用框架,使用自动布局越快越好。即使您没有设置约束,当您放置视图时,自动布局也会将自动调整大小的掩码转换为约束。
  • 我想当你打开项目的自动布局时,如果你不给视图约束,系统会使用它的帧数据。顺便说一句,我确实喜欢 AutoLayout。但基本上,我认为问题与布局无关 :) @Andrea
  • @Carrl 很抱歉,但事实并非如此,这就是为什么你有一个名为 setTranslatesAutoresizingMaskIntoConstraints 的属性,你可以查看关于自动布局的第一个 WWDC 视频,他们解释得很清楚。可能不是问题,但如果是你,我无论如何都会调查并尝试使用 xcode 6 的新功能来调试视图,这样你就可以完美地看到 3d 的帧
猜你喜欢
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多