2.5 使用 Image 视图绘制图片

使用 Image 视图渲染图片,图片来源可以是本地,系统图标,或者 UIImage 等比较常见的来源途径。

加载本地图片的代码如下,跟 Text 差不多:

var body: some View {
    Image("example-image")
}

example-image 是图片名称,放置在 Assets.xcassets 文件夹里。在这,再次重温下 some View 这个关键字,之前学习的 body 里都是 Text,现在变成了 Image,一样正常工作。

SwiftUI 的 Image 可以设置不同的缩放,跟 UIImageView 的 contentMode 一样。默认情况下,图片的显示大小很可能不符合我们的需求,甚至超过屏幕范围,如果添加 resizable() 可以填充到所有的可用空间:

var body: some View {
    Image("example-image")
        .resizable()
}

但这个填充模式的缺点也很明显,图片被强制拉伸,导致宽高比例失真。如果需要保持宽高比例,需要添加 aspectRatio 修改器,并传入 .fill.fit 参数,如下:

Image("example-image")
    .resizable()
    .aspectRatio(contentMode: .fill)

注意:在目前的 Xcode 测试版中,存在一个 bug ,使用 .fit 可能会导致图片还是被拉伸。

如果需要指定宽高,则可以使用 .frame(width: 100, height: 100) 修改器。

var body: some View {
    Image("example-image")
        .resizable()
        .frame(width: 100, height: 100)
}

使用 Image(systemName:) 可以加载 Apple 的  San Francisco 字体图标,只需传入图标名称的字符串,如下:

Image(systemName: "cloud.heavyrain.fill")

由于是字体,所以可以使用 foregroundColor().font() 来定义图标的颜色和大小:

var body: some View {
    Image(systemName: "cloud.heavyrain.fill")
        .foregroundColor(.red)
        .font(.largeTitle)
}

如果要自定义尺寸则可以使用 .font(.system(size: 64)) 传入字号大小。更多图标可以参考 SF Symbols

你也可以载入已经存在的 UIImage 视图,可以使用 Image(uiImage: ),记得 return 关键字:

var body: some View {
    guard let img = UIImage(named: "example-image") else {
        fatalError("Unable to load image")
    }
    return Image(uiImage: img)
}