swift - 使用正确的代码将 UIView 加载到 SwiftUI
问题描述
我的目标是在 SwiftUI 中使用 UIView,我希望在中心有一个红色的 View 100X100,因为我为此使用了这个向下代码并且它正在工作:
struct CustomUIViewController2: UIViewControllerRepresentable {
func makeUIViewController(context: UIViewControllerRepresentableContext<CustomUIViewController2>) -> CustomUIViewControllerModel {
return CustomUIViewControllerModel()
}
func updateUIViewController(_ uiViewController: CustomUIViewControllerModel, context: UIViewControllerRepresentableContext<CustomUIViewController2>) { }
class CustomUIViewControllerModel: UIViewController {
var customUIView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
customUIView.backgroundColor = UIColor.red
view.addSubview(customUIView)
customUIView.translatesAutoresizingMaskIntoConstraints = false
customUIView.heightAnchor.constraint(equalToConstant: 100).isActive = true
customUIView.widthAnchor.constraint(equalToConstant: 100).isActive = true
customUIView.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
customUIView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
}
}
}
但是在使用该代码之后,我注意到我应该使用 loadView 而不是 viewDidLoad 然后我开始将向上代码重构为向下代码,我做到了,但现在结果与我想要的不同!我想要一个红色的 View 100X100 居中,正如您在向下代码中看到的那样,我试图使其居中,但它不起作用,我正在徘徊这个向下代码有什么问题,以使红色 View 100X100 居中!
struct CustomUIViewController: UIViewControllerRepresentable {
func makeUIViewController(context: UIViewControllerRepresentableContext<CustomUIViewController>) -> CustomUIViewControllerModel {
return CustomUIViewControllerModel()
}
func updateUIViewController(_ uiViewController: CustomUIViewControllerModel, context: UIViewControllerRepresentableContext<CustomUIViewController>) {
}
class CustomUIViewControllerModel: UIViewController {
// Use loadView instead of viewDidLoad
override func loadView() {
view = UIView()
view.backgroundColor = UIColor.red
view.translatesAutoresizingMaskIntoConstraints = false
view.heightAnchor.constraint(equalToConstant: 100).isActive = true
view.widthAnchor.constraint(equalToConstant: 100).isActive = true
view.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
view.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
}
}
}
用例:
struct ContentView: View {
var body: some View {
CustomUIViewController()
.background(Color.blue)
CustomUIViewController2()
.background(Color.blue)
}
}
解决方案
当你loadView
这样使用时,在第一行,你正在view
为UIViewController
. 因此,当您将宽度和高度设置为 100 时,这将应用于整个view
.
要解决这个问题,您可以view
在第一行创建您当前拥有的内容,然后为该框添加一个子视图。
struct CustomUIViewController: UIViewControllerRepresentable {
func makeUIViewController(context: UIViewControllerRepresentableContext<CustomUIViewController>) -> CustomUIViewControllerModel {
return CustomUIViewControllerModel()
}
func updateUIViewController(_ uiViewController: CustomUIViewControllerModel, context: UIViewControllerRepresentableContext<CustomUIViewController>) {
}
class CustomUIViewControllerModel: UIViewController {
// Use loadView instead of viewDidLoad
override func loadView() {
view = UIView()
let boxView = UIView()
view.addSubview(boxView)
boxView.backgroundColor = UIColor.red
boxView.translatesAutoresizingMaskIntoConstraints = false
boxView.heightAnchor.constraint(equalToConstant: 100).isActive = true
boxView.widthAnchor.constraint(equalToConstant: 100).isActive = true
boxView.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
boxView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
}
}
}
推荐阅读
- android - Xamarin 跨平台邮政编码?
- networking - LAN使用私有IP地址时ARP如何获取MAC地址
- javascript - JS 按具有两个不同数组和总和值的组对数组值进行分组
- java - .txt 数组来自用户输入
- java - 为什么玩家会从平台上掉下来(矩形层)?
- android - 与 EXPO 分离后的 Android Studio 错误
- ios - WebRTC:Safari 阻止视频画中画?
- ruby-on-rails - Rails 5 / Devise - 以管理员身份删除用户
- python - 如何获得稀疏矩阵的视图?
- android - Android 5.1.1 - 构建运行方式二进制