Mode 属性如何影响图像

视图的内容模式属性说明了其内容的布局方式。在 Interface Builder 中,可以在 Attributes Inspector 中选择各种模式。

StackOverflow 文档

让我们使用两个图像视图来查看各种模式的工作原理。

StackOverflow 文档

缩放到填充

StackOverflow 文档

图像高度和宽度被拉伸以匹配 UIImageView 的大小。

Aspect Fit

StackOverflow 文档

拉伸图像的最长边(高度或宽度)以匹配视图。这使得图像尽可能大,同时仍然显示整个图像而不会扭曲高度或宽度。 (我将 UIImageView 背景设置为蓝色,以便它的大小清晰。)

Aspect 填充

StackOverflow 文档

拉伸图像的最短边(高度或宽度)以匹配视图。与 Aspect Fit 类似,图像的比例不会与其原始宽高比失真。

重绘

StackOverflow 文档

重绘仅适用于需要进行自定义缩放和调整大小的自定义视图。我们没有使用自定义视图,因此我们不应该使用 Redraw。请注意,这里 UIImageView 只给出了与 Scale to Fill 相同的结果,但它在幕后做了更多的工作。

关于 Redraw, Apple 文档说:

内容模式适用于回收视图内容,但是当你特别希望自定义视图在缩放和调整大小操作期间重绘时,你也可以将内容模式设置为 UIViewContentModeRedraw 值。将视图的内容模式设置为此值会强制系统调用视图的 drawRect:方法以响应几何体更改。通常,应尽可能避免使用此值,并且当然不应将其与标准系统视图一起使用。

中央

StackOverflow 文档

图像在视图中居中,但图像的长度和宽度未拉伸。

最佳

StackOverflow 文档

图像的上边缘在视图顶部水平居中,图像的长度和宽度未拉伸。

底部

StackOverflow 文档

图像的下边缘水平居中于视图的底部,图像的长度和宽度未拉伸。

剩下

StackOverflow 文档

图像的左边缘垂直居中于视图的左侧,图像的长度和宽度未被拉伸。

对

StackOverflow 文档

图像的右边缘垂直居中于视图的右侧,图像的长度和宽度不会拉伸。

左上方

StackOverflow 文档

图像的左上角位于视图的左上角。图像的长度和宽度未拉伸。

右上

StackOverflow 文档

图像的右上角位于视图的右上角。图像的长度和宽度未拉伸。

左下方

StackOverflow 文档

图像的左下角位于视图的左下角。图像的长度和宽度未拉伸。

右下角

StackOverflow 文档

图像的右下角位于视图的右下角。图像的长度和宽度未拉伸。

笔记

  • 这个例子来自这里 。

  • 如果内容(在我们的例子中是图像)与视图大小相同(在我们的例子中是 UIImageView),那么更改内容模式将没有明显的区别。

  • 有关 UIImageView 以外的其他视图的内容模式的讨论,请参阅此问题和此问题。

  • 在 Swift 中,要设置为以编程方式设置内容模式,请执行以下操作:

      imageView.contentMode = UIViewContentMode.scaleToFill
      imageView.contentMode = UIViewContentMode.scaleAspectFit
      imageView.contentMode = UIViewContentMode.scaleAspectFill
      imageView.contentMode = UIViewContentMode.redraw
      imageView.contentMode = UIViewContentMode.center
      imageView.contentMode = UIViewContentMode.top
      imageView.contentMode = UIViewContentMode.bottom
      imageView.contentMode = UIViewContentMode.left
      imageView.contentMode = UIViewContentMode.right
      imageView.contentMode = UIViewContentMode.topLeft
      imageView.contentMode = UIViewContentMode.topRight
      imageView.contentMode = UIViewContentMode.bottomLeft
      imageView.contentMode = UIViewContentMode.bottomRight