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 交互