SwiftUI 设置图片的自适应

5 min read

SwiftUI 的图片视图可以以不同的方式缩放,就像 UIImageView 的内容模式一样。

默认情况下,图像视图会自动调整其大小以适应其内容,这可能会使它们超出屏幕范围。 如果添加 resizable() 修饰符,则图像将自动调整大小,以使其填满所有可用空间,无论是在您指定的帧内还是在屏幕上可用的任何空间:

Image("rome")
.resizable()
.frame(height: 200)
但是,这也可能导致图像的原始长宽比失真,因为它将在所有尺寸上拉伸所需的任何量以使其填充空间。

如果要保持其宽高比,则应使用 .fill 或 .fit 添加一个 AspectRatio 修饰符,如下所示:

Image("rome")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 250)

.contentShape(Rectangle())

这将使图像保持其原始比例,并在指定大小的框架内适当缩放。 添加 .contentShape(Rectangle()) 可以确保图像可以正确捕获触摸事件。

您还可以使用 .scaledToFit() 或 .scaledToFill() 明确设置视图缩放行为。 scaledToFit() 将调整大小,以使图像适合可用空间并保留其宽高比,而 scaledToFill() 将以相同的方式调整大小,但可能会裁剪图像以填充框架。

Image("rome")
.scaledToFit()

Image("rome")
.scaledToFill()
.frame(width: 250, height: 150)
.clipped()

注意,在使用 scaledToFill() 缩放时,使用 clipped() 对图像进行修剪以确保它不扩展到框架之外。