一:将UIKit 中UIViewController融入SwiftUI
建立中转层
1),创建SwiftUI文件,引入UIViewControllerRepresentable协议
import SwiftUI
import UIKit
struct MainViewUI<View>: UIViewControllerRepresentable{
}
2),设置controller类型,一般都是继承UIViewController
import SwiftUI
import UIKit
struct MainViewUI<View>: UIViewControllerRepresentable{
typealias UIViewControllerType = UIViewController
}
3),实现两个协议
一:使UIKit的controller映射到SwiftUI
二:controller更新后需要做的操作
import SwiftUI
import UIKit
struct MainViewUI<View>: UIViewControllerRepresentable{
func makeUIViewController(context: Context) -> UIViewController {
let VC = UIKitVC()
return VC
}
func updateUIViewController(_ vc: UIViewController, context: Context) {
}
typealias UIViewControllerType = UIViewController
}
使用
NavigationLink("Show UIKit VC", destination: MainViewUI<Any>())
注:UIKit的controller代码,即UIKitVC
import UIKit
class UIKitVC: UIViewController ,UITableViewDelegate,UITableViewDataSource{
override func viewDidLoad() {
super.viewDidLoad()
let label = UILabel.init(frame: CGRect.init(x: 0, y: 0, width: 200, height: 30))
label.text = "这是UIKit中的视图"
self.view.addSubview(label)
//顶部88,底部83
let tabView = UITableView.init(frame: CGRect.init(x: 0, y: 30, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height-230))
self.view.addSubview(tabView)
tabView.delegate = self
tabView.dataSource = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
if cell == nil {
cell = UITableViewCell.init(style: .subtitle, reuseIdentifier: "cell")
}
cell?.textLabel?.text = "标题"
cell?.detailTextLabel?.text = "小标题"
cell?.imageView?.image = UIImage.init(named: "menu")
return cell!
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
}
截屏2021-02-12 15.47.47.png
二:使用UIKit中的view
大致方式和Controller相同,只是引入协议不同,此处引入UIViewRepresentable协议
建立中转层
import SwiftUI
struct ShowUIKitView<View> :UIViewRepresentable{
func makeUIView(context: Context) -> UIView {
let contentView = UIKitView.init(frame: CGRect.init(x: 50, y: 50, width: 200, height: 200))
return contentView
}
func updateUIView(_ uiView: UIView, context: Context) {
}
typealias UIViewType = UIView
}
使用方式
在SwiftUI中调用
ShowUIKitView<Any>()
.padding(.leading,20)
.padding(.top,50)
其余当作SwiftUI控件正常使用
注:UIKit中view的代码
import UIKit
class UIKitView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
let imgV = UIImageView.init(frame: CGRect.init(x: 0, y: 0, width: 50, height: 50))
imgV.image = UIImage.init(named: "menu")
self.addSubview(imgV)
imgV.layer.cornerRadius = 6
imgV.layer.masksToBounds = true
let label = UILabel.init(frame: CGRect.init(x: 50, y: 0, width: 100, height: 60))
label.numberOfLines = 0
label.text = "这是UIKit中的视图"
self.addSubview(label)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
截屏2021-02-12 15.59.49.png
三:UIKit使用SwiftUI
UIHostingController承载SwiftUI中的view
let vc = MainUIView.init()
let swiftUIVC = UIHostingController.init(rootView: vc)
swiftUIVC.hidesBottomBarWhenPushed = true
self.navigationController?.pushViewController(swiftUIVC, animated: true)