用途:系统性指导 iOS 开发中 SwiftUI 与 UIKit 的互操作,重点是桥接模式本身,而非被桥接的具体业务视图。
主要能力与用法:
- UIViewRepresentable:将 UIView 子类(如 MKMapView、WKWebView)接入 SwiftUI。makeUIView 只调用一次用于创建;updateUIView 在每次 SwiftUI 状态变化时调用,应做增量修补而非重建;dismantleUIView 用于清理观察者/计时器。状态可经 Coordinator 与 @Binding 双向同步。注意 SwiftUI 掌管布局,不应修改被包装视图的 center、bounds、frame、transform,需要自定义尺寸时应重写 intrinsicContentSize 或 sizeThatFits(_:)。包装 UIScrollView 子类时可通过 setContentScrollView 让导航栏大标题正确折叠。
- UIViewControllerRepresentable:包装完整控制器,如 PHPickerViewController、MFMailComposeViewController、SFSafariViewController;通过 Coordinator 处理回调与关闭,不直接调用 controller.dismiss。
- UIGestureRecognizerRepresentable(iOS 18+):在 SwiftUI 中使用 UIKit 手势识别器,实现 handleUIGestureRecognizerAction;context.converter 可把 UIKit 坐标转换到 SwiftUI 坐标空间。iOS 18 之前可用透明 UIView 包装加 Coordinator 作为回退方案。
- UIHostingController:在 UIKit 导航层级中嵌入 SwiftUI 视图,支持 push 或模态呈现,以及作为子控制器嵌入(iOS 16+ 可设 sizingOptions 为 intrinsicContentSize)。
- UIHostingConfiguration(iOS 16+):在 UICollectionView/UITableView 单元格中使用 SwiftUI。
限制与注意事项:updateUIView 调用频繁,需避免无谓工作;闭包捕获易产生循环引用,建议用 Coordinator;SwiftUI 动画与 CAAnimation、UIViewPropertyAnimator 等存在不兼容;资料中未提供收费、价格或具体安装命令等信息。