Skip to main content

SwiftUI专辑009-SwiftUI中使用UIKit

· 预计阅读2分钟

headerimg SwiftUI 是 在 WWDC 2019 上宣布 的,仅适用于运行 iOS 13 及更高版本的设备。由于其相对不成熟,与 UIKit 相比,SwiftUI 可能缺乏广泛的 API 支持。例如,截至 2021 年 7 月,只能使用 UIKit 的UIImagePickerController选择图片和视频。因此,需要在 SwiftUI 中实现某些 UIKit API。

本章,我们将看看如何在 SwiftUI 中使用 UIKit API。我们将创建一个包装UIActivityIndicatorView的View,然后在 SwiftUI 中显示一个ActivityIndicator。

Getting ready​

新建一个SwiftUI工程,叫做UIKitToSwiftUI

How to do it…​

我们能够通过UIViewRepresentable协议来在SwiftUI中显示UIKit View。

  1. 新建文件,选择Swift File,命名ActivityIndicator
  2. 替换import Foundation为import SwiftUI
import SwiftUI
  1. 修改ActivityIndicator遵循UIViewRepresentable协议
struct ActivityIndicator: UIViewRepresentable {
var animating: Bool
func updateUIView(_ activityIndicator: UIActivityIndicatorView, context: Context) {
if self.animating {
activityIndicator.startAnimating()
} else {
activityIndicator.stopAnimating()
}
}

func makeUIView(context: Context) -> UIActivityIndicatorView {
return UIActivityIndicatorView()
}
}
  1. 打开ContentView.swift,使用我们刚刚的ActivityIndicator
struct ContentView: View {
@State var animated = false
var body: some View {
VStack {
ActivityIndicator(animating: animated)
HStack {
Toggle(isOn: $animated) {
Text("Toggle Activity")
}
}
}
}
}

最终结果:

image-20211224150803446

How it works…​

我们通过实现UIViewRepresentable协议来将UIKit View包裹为一个SwiftUI View。

在 ActivityIndicator.swift 文件中,我们实现了一个 struct, 遵循UIViewRepresentable协议。

协议要求我们实现 makeUIView 和 updateUIView 这两个函数。

makeUIView 负责创建和准备View

updateUIView 负责当animation改变时更新 UIView。