SwiftUI 实现拖拽文件

169 阅读3分钟

在 SwiftUI 中,您可以使用 onDrop 修饰符来实现拖放文件的功能

定义了一个 fileURL 状态变量,用于存储拖放的文件的 URL

使用 onDrop 修饰符,我们为视图添加了一个拖放处理程序。我们指定了接受的文件类型为 public.file-url,并使用闭包来处理拖放的文件。在闭包中,我们首先检查提供程序中是否存在文件,然后加载第一个文件,并将其转换为 URL 对象。最后,我们使用 DispatchQueue.main.async 来将状态变量 fileURL 更新为新的 URL 对象。

import SwiftUI

struct DragAndDropView: View {
    @State var fileURL: URL? = nil
    
    var body: some View {
        VStack {
            if let fileURL = fileURL {
                Text("已选择文件:\(fileURL.lastPathComponent)")
            } else {
                Text("将文件拖拽到此区域")
            }
        }
        .frame(width: 300, height: 300)
        .onDrop(of: ["public.file-url"], isTargeted: nil) { providers -> Bool in
            guard let item = providers.first else { return false }
            item.loadItem(forTypeIdentifier: "public.file-url", options: nil) { (data, error) in
                guard let urlData = data as? Data,
                      let fileURL = URL(dataRepresentation: urlData, relativeTo: nil) else { return }
                DispatchQueue.main.async {
                    self.fileURL = fileURL
                }
            }
            return true
        }
    }
}

SwiftUI 如何设置窗口大小

import SwiftUI

@main
struct WindowSizeApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .frame(minWidth: 500, minHeight: 300) // 设置最小宽度和高度
                .frame(maxWidth: .infinity, maxHeight: .infinity) // 设置最大宽度和高度
        }
    }
}

支持的类型都有什么

在 SwiftUI 中,您可以使用 onDrop 修饰符的 of 参数来指定支持的文件类型。以下是一些常见的文件类型及其对应的 UTI(Uniform Type Identifier):

  • 图片文件:

    • public.image: 通用的图像类型,支持 JPEG、PNG、GIF 等格式。
    • public.png: PNG 图像格式。
    • public.jpeg: JPEG 图像格式。
    • public.gif: GIF 图像格式。
    • public.tiff: TIFF 图像格式。
    • public.heic: HEIC 图像格式。
  • 文本文件:

    • public.plain-text: 纯文本文件。
    • public.comma-separated-values-text: 逗号分隔值 (CSV) 文件。
    • public.tab-separated-values-text: 制表符分隔值 (TSV) 文件。
    • public.rtf: 富文本格式 (RTF) 文件。
  • PDF 文件:

    • com.adobe.pdf: Adobe PDF 文件。
  • 音频文件:

    • public.audio: 通用音频类型。
    • public.mp3: MP3 音频格式。
    • public.mpeg-4-audio: MPEG-4 音频格式。
    • public.wav: WAV 音频格式。
  • 视频文件:

    • public.movie: 通用视频类型。
    • public.mp4: MP4 视频格式。
    • public.mpeg: MPEG 视频格式。

fileURL 是一个表示文件在计算机上位置的 URL(统一资源定位符)。在上述示例代码中,fileURL 是一个用于存储用户拖放文件的 URL。

URL 是一种标识资源位置的方式,可以是本地文件系统中的文件、网络上的资源,或者其他支持的资源。在这个示例中,fileURL 用于存储用户拖放的图像文件的位置。

通过使用 URL 类型,我们可以轻松地访问文件的路径、名称和其他属性,进而进行文件操作,例如加载图像、读取文本内容等。

第二个参数 isTargeted

onDrop 修饰符中的 isTargeted 参数是一个可选参数,用于指定拖放操作是否有目标对象。当用户拖动文件时,如果鼠标位置在接受拖放的视图之内,则会显示目标对象指示器。这个参数决定了视图是否被认为是目标对象。

isTargeted 参数有三种可能的取值:

  • 如果设置为 nil,则表示视图始终被认为是目标对象。这意味着无论鼠标位置如何,都会显示目标对象指示器。
  • 如果设置为 true,则表示只有当鼠标位于视图的特定区域内时才会显示目标对象指示器。在这种情况下,您需要在视图中使用 GeometryReader 来定义目标区域。
  • 如果设置为 false,则表示视图永远不会被认为是目标对象,即使鼠标位于视图之内。这意味着不会显示目标对象指示器。

默认情况下,isTargeted 参数为 nil,这意味着视图始终被认为是目标对象。