SwiftUI 使用 UIKit 控件

SwiftUI 使用 UIKit 控件

由于 SwiftUI 才出来不久,所以有些功能不太好实现,好在苹果提供了接口帮助我们把 UIKit 控件转换为 SwiftUI 使用的控件。

  1. UIView 使用 UIViewRepresentable 协议
struct AppleIDLoginButton: UIViewRepresentable {
    private let type: ASAuthorizationAppleIDButton.ButtonType
    private let style: ASAuthorizationAppleIDButton.Style

    init(type: ASAuthorizationAppleIDButton.ButtonType = .default,
         style: ASAuthorizationAppleIDButton.Style = .white) {
        self.type = type
        self.style = style
    }

    func makeUIView(context: UIViewRepresentableContext<AppleIDLoginButton>) -> ASAuthorizationAppleIDButton {
        return .init(type: type, style: style)
    }

    func updateUIView(_ uiView: ASAuthorizationAppleIDButton, context: UIViewRepresentableContext<AppleIDLoginButton>) {

    }
}

初始化时会调用 makeUIView 方法,状态更新时会调用updateUIView 方法,具体调用时机可自己测试。

使用:

AppleIDLoginButton(type: .default)
    .frame(height: 44)
    .onTapGesture {
        // code...
}
  1. UIViewController 使用 UIViewControllerRepresentable 协议

UIViewControllerRepresentable 协议提供方法与UIViewRepresentable 类似。这里使用 SwiftUI 与 Combine 编程 中的代码。

struct SafariView: UIViewControllerRepresentable {
    let url: URL
    let onFinished: () -> Void

    func makeUIViewController(context: UIViewControllerRepresentableContext<SafariView>) -> SFSafariViewController {
        let controller = SFSafariViewController(url: url)
        controller.delegate = context.coordinator
        return controller
    }

    func updateUIViewController(
        _ uiViewController: SFSafariViewController,
        context: UIViewControllerRepresentableContext<SafariView>) {

    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, SFSafariViewControllerDelegate {
        let parent: SafariView

        init(_ parent: SafariView) {
            self.parent = parent
        }

        func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
            parent.onFinished()
        }
    }
}

makeCoordinator 方法在 UIViewRepresentable 协议中也有。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 十月份参加极光黑客马拉松一天时间写了个简单的 火车票 OCR 应用“票夹”,当时由于时间和熟练程度原因,并没有试下...
    Nemocdz阅读 2,047评论 1 2
  • 开始之前:请确保你的系统版本为macOS 10.15及以上版本且已经安装了Xcode 11。这种组合使您可以在Xc...
    Augs阅读 3,055评论 0 7
  • 重点参考链接: View Programming Guide for iOS https://developer....
    Kevin_Junbaozi阅读 4,554评论 0 15
  • 7、不使用IB是,下面这样做有什么问题? 6、请说说Layer和View的关系,以及你是如何使用它们的。 1.首先...
    AlanGe阅读 726评论 0 1
  • 说到与UIKit的集成不免会觉得有些鸡肋,因为现在很难做到只支持iOS13,不过到iOS14时,这种集成就变得必不...
    西西的一天阅读 7,134评论 0 13