SwiftUI 教程

SwiftUI 主页 SwiftUI 概览 SwiftUI 与 UIkit

SwiftUI 环境

SwiftUI 安装和环境配置 SwiftUI 基本组件 SwiftUI 构建第一个应用程序

SwiftUI 视图

SwiftUI 视图 SwiftUI 自定义文本视图 SwiftUI 自定义图像视图 SwiftUI 堆栈

SwiftUI 绘制形状

SwiftUI 形状 SwiftUI 绘制线条 SwiftUI 绘制矩形 SwiftUI 绘制圆角矩形 SwiftUI 绘制三角形 SwiftUI 绘制圆形 SwiftUI 绘制星形 SwiftUI 绘制多边形 SwiftUI 绘制饼图 SwiftUI 使用内置形状

SwiftUI 文本

SwiftUI 文本视图 SwiftUI 文本输入和输出

SwiftUI 颜色

SwiftUI 颜色 SwiftUI 颜色选择器 SwiftUI 渐变 SwiftUI 调整颜色

SwiftUI 效果

SwiftUI 效果 SwiftUI 混合效果 SwiftUI BLur 效果 SwiftUI 阴影效果 SwiftUI 悬停效果

SwiftUI 动画

SwiftUI 动画 SwiftUI 创建动画 SwiftUI 创建显式动画 SwiftUI 多个动画 SwiftUI 过渡 SwiftUI 不对称过渡 SwiftUI 自定义过渡

SwiftUI 图像

SwiftUI 图像 SwiftUI 图像作为背景 SwiftUI 旋转图像 SwiftUI 媒体

SwiftUI 视图布局

SwiftUI 视图布局 SwiftUI 视图大小 SwiftUI 视图间距 SwiftUI 视图填充

SwiftUI UI 控件

SwiftUI UI 控件 SwiftUI 按钮 SwiftUI 复选框 SwiftUI 菜单栏 SwiftUI 工具栏 SwiftUI 搜索栏 SwiftUI 文本字段 SwiftUI 滑块 SwiftUI 切换 SwiftUI 选择器 SwiftUI 菜单

SwiftUI 列表 &表格

SwiftUI 列表 SwiftUI 静态列表 SwiftUI 动态列表 SwiftUI 自定义列表 SwiftUI 表格

SwiftUI 表单

SwiftUI 表单 SwiftUI 在部分中拆分表单

SwiftUI 事件处理

SwiftUI 事件处理 SwiftUI 手势 SwiftUI 剪贴板 SwiftUI 拖放 SwiftUI 焦点 SwiftUI 警报

SwiftUI 杂项

SwiftUI 容器 SwiftUI 导航 SwiftUI 通知 SwiftUI 跨平台 UI SwiftUI 数据 SwiftUI 可访问性

SwiftUI 框架集成

SwiftUI 框架集成 SwiftUI 与 UIKit 交互 SwiftUI 创建 macOS 应用

SwiftUI 有用资源

SwiftUI 有用资源 SwiftUI 讨论


SwiftUI- 与 UIKit 交互

在某些情况下,您可能需要将 UIKit 组件或功能集成到 SwiftUI 应用程序中。SwiftUI 提供了一些机制,让您可以在需要时使用 UIKit 组件,同时仍可从 SwiftUI 对其余 UI 的声明性特性中受益。

要从 SwiftUI 与 UIKit 交互,您需要使用 UIViewRepresentable 和 UIViewControllerRepresentable 协议。这些协议允许您包装 UIKit 组件(如视图或视图控制器)并将它们嵌入 SwiftUI 中。

  • UIViewRepresentable

  • UIViewControllerRepresentable

UIViewRepresentable

当您想要将 UIKit 视图(如 UIButton、UILabel、UISlider、UITextField 等)包装到 SwiftUI 视图中时,使用 UIViewRepresentable 协议。当您需要没有直接 SwiftUI 等效项的特定 UIKit 视图时,这很有用。

示例

以下 SwiftUI 程序用于 UIViewRepresentable。

import SwiftUI
import UIKit

// 步骤 1:创建一个符合 UIViewRepresentable 的自定义 SwiftUI 视图
struct CustomButton: UIViewRepresentable {
   var title: String
   var action: () -> Void
   
   // 创建 UIKit 视图
   func makeUIView(context: Context) -> UIButton {
      let button = UIButton(type: .system)
      button.setTitle(title, for: .normal)
      button.addTarget(context.coordinator, action: #selector(Coordinator.buttonTapped), for: .touchUpInside)
      return button
   }   
   // 使用新数据更新 UIKit 视图
   func updateUIView(_ uiView: UIButton, context: Context) {
      uiView.setTitle(title, for: .normal)
   }   
   // 步骤 2:创建一个 Coordinator 类来管理交互
   class Coordinator: NSObject {
      var parent: CustomButton      
      init(parent: CustomButton) {
         self.parent = parent
      }      
      @objc func buttonTapped() {
         parent.action()  // 当按钮被点击时执行操作
      }
   }   
   // 创建一个协调器来处理按钮操作
   func makeCoordinator() -> Coordinator {
      return Coordinator(parent: self)
   }
}
// 步骤 3:在 SwiftUI 视图中使用自定义 UIKit 按钮
struct ContentView: View {
   var body: some View {
      VStack {
         CustomButton(title: "Tap me!") {
            print("Button was tapped!")
         }.padding()
      }
   }
}
@main
struct MyApp: App {
   var body: some Scene {
      WindowGroup {
         ContentView()
      }
   }
}

输出

与 UIKit 交互

UIViewControllerRepresentable

UIViewControllerRepresentable 协议用于将 UIKit 视图控制器(例如,UIImagePickerController、UIActivityViewController、UIPageViewController)包装到 SwiftUI 中。

示例

以下 SwiftUI 程序用于 UIViewControllerRepresentable。

import SwiftUI
import UIKit

// 步骤 1:创建一个符合 UIViewControllerRepresentable 的自定义 SwiftUI 视图
struct ImagePicker: UIViewControllerRepresentable {
   @Binding var selectedImage: UIImage?
   @Binding var isPresented: Bool
   
   // 创建 UIKit 视图控制器
   func makeUIViewController(context: Context) -> UIImagePickerController {
      let picker = UIImagePickerController()
      picker.delegate = context.coordinator
      return picker
   }   
   // 使用新数据更新 UIKit 视图控制器
   func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {
      // Nothing to update in this case
   }   
   // 步骤2:创建一个Coordinator类来管理交互
   class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
      var parent: ImagePicker
      
      init(parent: ImagePicker) {
         self.parent = parent
      }      
      // Handle image picking
      func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
         if let image = info[.originalImage] as? UIImage {
            parent.selectedImage = image
         }
         parent.isPresented = false
      }      
      // Handle cancellation
      func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
         parent.isPresented = false
      }
   }   
   // Create the coordinator
   func makeCoordinator() -> Coordinator {
      return Coordinator(parent: self)
   }
}
// 步骤 3:在 SwiftUI 视图中使用自定义图像选择器
struct ContentView: View {
   @State private var isImagePickerPresented = false
   @State private var selectedImage: UIImage?
   
   var body: some View {
      VStack {
         if let selectedImage = selectedImage {
            Image(uiImage: selectedImage)
               .resizable()
               .scaledToFit()
               .frame(width: 200, height: 200)
         }
         
         Button("Pick an Image") {
            isImagePickerPresented.toggle()
         }.imagePicker(isPresented: $isImagePickerPresented, selectedImage: $selectedImage)  // Custom ImagePicker
      }
   }
}
@main
struct MyApp: App {
   var body: some Scene {
      WindowGroup {
         ContentView()
      }
   }
}

输出

与 UIKit 交互