大师学SwiftUI第18章Part1 - 图片选择器和相机

如今,个人设备主要用于处理图片、视频和声音,苹果的设备也不例外。SwiftUI可以通过​​Image​​视图显示图片,但需要其它框架的支持来处理图片、在屏幕上展示视频或是播放声音。本章中我们将展示Apple所提供的这类工具。

图片选择器

SwiftUI内置了一个​​PhotosPicker​​结构体用于生成一个视图,允许用户从图片库中选择一张或多张照片。以下为该视图的初始化方法。

  • PhotosPicker(selection: Binding, maxSelectionCount: Int?, selectionBehavior: PhotosPickerSelectionBehavior, matching: PHPickerFilter?, preferredItemEncoding: EncodingDisambiguationPolicy, photoLibrary: PHPhotoLibrary, label: Closure):这一初始化方法通过由参数所指定的配置创建一个​​PhotosPicker​​视图。​​selection​​参数是一个存储所选项指针的绑定属性。​​maxSelectionCount​​参数是我们希望用户选取的最大图片数。​​selectionBehavior​​参数指定如何进行选取。该结构体具有类型属性​​default​​(复选框选取)、​​ordered​​(数字选取)、​​continous​​(实时选取)和​​continousAndOrdered​​(实时数字选择)。​​matching​​参数指定视图所包含的资源类型。这个结构体的类型属性有​​bursts​​、​​cinematicVideos​​、​​depthEffectPhotos​​、​​images​​、​​livePhotos​​、​​panoramas​​、​​screenRecordings​​、​​screenshots​​、​​slomoVideos​​、​​timelapseVideos​​和​​videos​​。​​preferredItemEncoding​​参数指定用于处理资源的编码。这个结构体包含类型属性​​automatic​​(默认值)、​​current​​和​​compatible​​。​​photoLibrary​​参数提供对图片库的访问。该结构体带有类型方法​​shared()​​。​​label​​参数是一个闭包,提供视图所生成按钮的标签。

因获取资源会耗费时间,选择器并不直接返回图片和视频,而是一个稍后可供我们提取的资源指针。框架为此定义了​​PhotosPickerItem​​结构体。该结构体包含如下访问媒体资源的属性和方法。

  • itemIdentifier:该属性返回资源标识符的字符串。
  • loadTransferable(type: Type):这一异步方法加载资源并将其赋值给由​​type​​参数指定数据类型的实例。这个参数的数据类型必须遵循​​Transferable​​协议。

要访问​​ç​​结构体,我们必须导入PhotosUI框架。此外,视图需要一个​​@State​​属性用于存储所选资源。要启用多选,该属性必须存储​​PhotosPickerItem​​结构体的数组,而对于单选,该属性只需要存储一个可选的​​PhotosPickerItem​​值。如下所示。

示例18-1:创建一个图片选择器

import SwiftUI
import PhotosUI

struct ContentView: View {
    @State private var selected: PhotosPickerItem?
    @State private var picture: UIImage?
    var body: some View {
        NavigationStack {
            VStack {
                Image(uiImage: picture ?? UIImage(named: "nopicture")!)
                    .resizable()
                    .scaledToFit()
                Spacer()
                PhotosPicker(selection: $selected, matching: .images, photoLibrary: .shared()) {
                    Text("Select a photo")
                        .padding()
                        .buttonStyle(.borderedProminent)
                }
                .onChange(of: selected, initial: false) { old, item in
                    Task(priority: .background) {
                        if let data = try? await item?.loadTransferable(type: Data.self) {
                            picture = UIImage(data: data)
                        }
                    }
                }
            }
        }
    }
}

​PhotosPicker​​初始化方法中的大部分参数都是可选的。本例中,我们只需要告诉选择在哪里存储所选资源的指针,需要对用户显示哪种资源(图片),以及从哪里获取(共享库)。

​PhotosPicker​​结构体创建了一个打开选取资源视图的按钮。在视图中选中资源后,指针会存储到​​@State​​属性中。这意味着我们可以通过​​onChange()​​修饰符监控属性的变化。在选中新图片后,我们开启一个异步任务对所选资源调用​​loadTransferable()​​方法。该方法加载图片,将其转换成一个​​Data​​结构体返回。如果成功,我们使用这个数据初始化一个​​UIImage​​对象,并将其赋值给​​picture​​属性显示到屏幕上。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值