上一篇 SwiftUI 文本 介绍了 SwiftUI 中使用Text
显示文本。
今天我们介绍 SwiftUI 中使用Image
显示图片。
在本章中,我们将探讨Label
的使用,这是最常见的用户界面组件之一,以及用于在屏幕上渲染图像的Image
视图。
与上一章类似,我将通过构建一个简单的示例演示如何使用Image
。
本章涵盖以下主题:
- 什么是SF Symbols以及如何显示系统图像
- 如何显示自定义图像
- 如何调整图像大小
- 如何使用
ignoresSafeArea
显示全屏图像 - 如何创建圆形图像
- 如何为图像应用叠加效果
目录
创建一个新的SwiftUI项目
首先,启动Xcode并创建一个新的项目,选择iOS下的App模板。将项目命名为SwiftUIImage
。组织名称可以填写你的公司或组织名称,例如com.yourcompany
。确保在用户界面(User Interface)选项中选择SwiftUI。点击下一步并选择一个文件夹来保存项目。
保存项目后,Xcode将加载ContentView.swift
文件并显示设计/预览画布。如果看不到预览,可以通过Xcode菜单选择Editor > Canvas来启用。
理解SF Symbols
SF Symbols是Apple设计的一套图标库,包含超过5,000个符号,旨在与San Francisco系统字体无缝集成。这些符号具有九种重量和三种比例,并且可以自动与文本对齐。SF Symbols 5引入了更多的动画和新的符号,增强了自定义符号的功能。
在展示图像之前,让我们讨论图像的来源。你可以为应用提供自己的 图像,但自iOS 13起,Apple引入了一套名为SF Symbols的系统图像集,开发者可以在任何应用中使用。随着iOS 18的发布,Apple进一步改进了图像集,发布了SF Symbols 6,包含超过800个新符号并支持一系列新动画。
这些图标之所以称为符号,是因为它们与Apple内置的San Francisco字体无缝集成。一个主要优点是无需额外安装即可在任何运行iOS 13或更高版本的设备上使用这些符号。
需要注意的是,不同iOS版本对符号的支持有所不同。基本符号集在iOS 13及以上版本均可使用,而最新的SF Symbols仅限于iOS和iPadOS 18.0。这意味着如果你希望在应用中使用最新符号,需要考虑应用的最低支持iOS版本,并为旧系统用户提供备用选项。
通过利用SF Symbols,你可以确保应用图标在Apple平台上具有一致和原生的外观,同时享受其可扩展性和辅助功能。记得在使用新符号时考虑版本兼容性。
要使用符号,你只需要知道符号的名称。Apple发布了一个名为SF Symbols的应用,允许你轻松浏览和查找适合需求的符号。强烈建议在继续下一部分之前安装该应用。
显示系统图像
要在屏幕上显示系统图像(符号),你需要使用Image
视图并初始化systemName
参数,如下所示:
Image(systemName: "cloud.heavyrain")
这将创建一个图像视图并加载指定的系统图像。正如之前提到的,SF Symbols与San Francisco字体无缝集成。你可以通过应用font
修饰符轻松调整图像的大小:
Image(systemName: "cloud.heavyrain")
.font(.system(size: 100))
由于符号实际上是字体的一部分,你可以使用size
参数来调整字体大小,从而改变图像的尺寸。
同样,由于SF Symbols是字体,你可以应用如foregroundStyle
等修饰符来改变其外观。例如,将符号颜色更改为蓝色:
Image(systemName: "cloud.heavyrain")
.font(.system(size: 100))
.foregroundStyle(.blue)
要添加阴影效果,可以使用shadow
修饰符:
Image(systemName: "cloud.heavyrain")
.font(.system(size: 100))
.foregroundStyle(.blue)
.shadow(color: .gray, radius: 10, x: 0, y: 10)
使用自定义图像
除了使用系统图像,你可能需要在应用中使用自己的图像。以下是如何使用Image
视图加载自定义图像的方法。
注意:你可以使用自己的图像,但如果没有合适的图像,可以从Unsplash下载这张图片,并将文件名更改为paris.jpg
以便跟随示例。
步骤:
-
导入图像到资产目录:
- 确保你已经准备好图像文件(例如
paris.jpg
)。 - 按
Command+0
在Xcode中显示项目导航器,选择Assets
。 - 打开Finder并将图像拖到资产目录的侧边栏中。或者,右键点击空白区域选择**Import...**导入图像。
- 确保你已经准备好图像文件(例如
-
在代码中显示图像:
- 使用
Image
视图并传入图像名称:
Image("paris")
- 这将在预览画布中显示图像。但由于图像分辨率较高(4437x6656像素),你可能只会看到图像的一部分。
- 使用
调整图像大小
要调整图像大小,可以使用resizable
修饰符:
Image("paris")
.resizable()
默认情况下,resizable
修饰符会以拉伸模式调整图像,即图像会被拉伸以填满整个视图区域(除顶部和底部区域外)。
完整示例:
Image("paris")
.resizable()
.scaledToFit()
.frame(width: 300)
内容模式:
scaledToFit
:保持图像的原始宽高比,并缩放图像以适应视图区域。scaledToFill
:保持图像的原始宽高比,并缩放图像以填满视图区域,可能会裁剪图像。
例如,使用.scaledToFill
:
Image("paris")
.resizable()
.scaledToFill()
.frame(width: 300)
.clipped()
使用clipped
修饰符可以裁剪超出视图区域的部分,确保图像不会溢出。
创建圆形图像
除了将图像裁剪为矩形形状,SwiftUI还提供了多种形状修饰符,如圆形、椭圆形和胶囊形。要创建圆形图像,可以使用clipShape
修饰符:
Image("paris")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 300, height: 300)
.clipShape(Circle())
或者,使用更简洁的.circle
:
Image("paris")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 300, height: 300)
.clipShape(.circle)
为图像应用叠加效果
SwiftUI提供了overlay
修饰符,允许你在图像上叠加另一个视图。例如,在现有图像上叠加一个系统图像(如heart.fill
):
Image("paris")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 300, height: 300)
.clipShape(.circle)
.overlay(
Image(systemName: "heart.fill")
.font(.system(size: 50))
.foregroundColor(.black)
.opacity(0.5)
)
示例:在图像上叠加文本
你还可以在图像上叠加文本:
Image("paris")
.resizable()
.aspectRatio(contentMode: .fit)
.overlay(
Text("If you are lucky enough to have lived in Paris as a young man, then wherever you go for the rest of your life it stays with you, for Paris is a movable feast.\n\n- Ernest Hemingway")
.fontWeight(.heavy)
.font(.system(.headline, design: .rounded))
.foregroundStyle(.white)
.padding()
.background(Color.black)
.cornerRadius(10)
.opacity(0.8)
.padding(),
alignment: .top
)
在此示例中,overlay
修饰符接受一个Text
视图,并将其叠加在图像的顶部。通过调整alignment
参数,可以控制叠加视图的位置。
使用叠加效果暗化图像
你还可以通过在图像上叠加一个半透明的黑色视图来暗化图像:
Image("paris")
.resizable()
.aspectRatio(contentMode: .fit)
.overlay(
Color.black
.opacity(0.4)
)
或者,使用Rectangle
:
Image("paris")
.resizable()
.aspectRatio(contentMode: .fit)
.overlay(
Rectangle()
.foregroundStyle(.black)
.opacity(0.4)
)
这种方法尤其适用于在明亮的图像上叠加浅色文本,以提高文本的可读性。
示例:在暗化图像上叠加文本
Image("paris")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 300, height: 300)
.overlay(
Color.black
.opacity(0.4)
.overlay(
Text("Paris")
.font(.largeTitle)
.fontWeight(.black)
.foregroundStyle(.white)
.frame(width: 200)
)
)
在这个示例中,我们首先用半透明的黑色叠加层暗化图像,然后在其上叠加一个白色的“Paris”文本。
多色SF Symbols
从iOS 15开始,SF Symbols提供了四 种渲染模式,允许你为符号应用多种颜色。比如,square.and.arrow.down
符号支持调色板渲染。你可以为符号应用两种或更多对比色。
在SwiftUI中,可以使用symbolRenderingMode
修饰符来更改渲染模式,并使用foregroundStyle
应用多种颜色:
Image(systemName: "square.and.arrow.down")
.symbolRenderingMode(.palette)
.foregroundStyle(.indigo, .yellow, .gray)
.font(.system(size: 200))
在此代码中,我们将符号渲染模式设置为palette
,并通过foregroundStyle
修饰符应用多种颜色。
可变颜色
SF Symbols还支持可变颜色功能,你可以通过调整百分比值来改变符号的颜色。这在表示进度等场景中特别有用。
示例:使用可变颜色
Image(systemName: "slowmo", variableValue: 0.6)
.symbolRenderingMode(.palette)
.foregroundStyle(.indigo)
.font(.largeTitle)
在此示例中,我们为符号设置了variableValue
参数,并通过foregroundStyle
应用颜色。可变颜色适用于所有渲染模式,允许你灵活地调整符号的视觉效果。
总结
本章探讨了在SwiftUI中处理图像的多种方法。我们展示了如何轻松显示图像,并应用一系列修饰符来实现所需的视觉效果。其中,SF Symbols作为内置图标系统,对于独立开发者来说尤其有价值,它消除了寻找和集成第三方图标的需求,大大简化了开发过程。
通过利用SwiftUI的图像功能和SF Symbols,你可以轻松创建视觉上吸引人且一致的界面,节省时间并确保应用符合Apple的设计语言,提升整体用户体验。随着你继续构建SwiftUI项目,记得充分探索这些图像工具的潜力,打造出精美且专业的应用。
继续学习SwiftUI的高级功能,如动画、数据绑定和自定义控件,将进一步提升你的开发技能,帮助你创建更具吸引力和互动性的应用。