所以我的项目中有以下内容。
每个的代码如下:
内容视图
import SwiftUI
import UIKit
struct ContentView: View {
var body: some View {
VStack(alignment: .center, spacing: 0) {
VStack {
Color.blue
.frame(height: 50)
}
VStack {
HStack {
Color.green
.frame(height: 100)
Text("Text")
Color.green
.frame(height: 100)
}
}
VStack { // content view
GeometryReader { geometry in
VStack {
CustomViewRepresentable()
.frame(width: geometry.size.width, height: geometry.size.height)
.background(.gray)
.border(.red, width: 1)
}
.frame(width: geometry.size.width, height: geometry.size.height)
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
自定义视图
import UIKit
class CustomView: UIView {
private let containerView = UIView()
override func layoutSubviews() {
containerView.center = self.center
}
func addContainerView() {
containerView.frame = CGRect(origin: .zero, size: CGSize(width: 300, height: 300))
addSubview(containerView)
containerView.center = self.center
}
}
自定义视图可表示
import UIKit
import SwiftUI
struct CustomViewRepresentable: UIViewRepresentable {
typealias UIViewType = CustomView
func makeUIView(context: Context) -> CustomView {
let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
customView.addContainerView()
return customView
}
func updateUIView(_ uiView: CustomView, context: Context) {
}
}
我面临的问题是 CustomView 中的 containerView 不会显示,除非我使用可表示内部的框架初始化 CustomView。
func makeUIView(context: Context) -> CustomView {
let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
我不明白为什么需要这样做,因为我希望 CustomView 获取它嵌入的 VStack 的完整宽度和高度。因此我认为只要这样做
CustomViewRepresentable()
.frame(width: geometry.size.width, height: geometry.size.height)
VStack 内部应该可以正常工作,但显然不行。那么,让
CustomViewRepresentable
填充其父级同时保持 containerView
始终居中的最佳方式是什么?
无需在
CustomView
函数中提供func makeUIView(context: Context) -> CustomView
框架。将 let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
代码替换为 let customView = CustomView()
后,在我这边工作。请使用下面的代码检查。
内容查看
import SwiftUI
import UIKit
struct ContentView: View {
var body: some View {
VStack(alignment: .center, spacing: 0) {
VStack {
Color.blue
.frame(height: 50)
}
VStack {
HStack {
Color.green
.frame(height: 100)
Text("Text")
Color.green
.frame(height: 100)
}
}
VStack { // content view
GeometryReader { geometry in
VStack {
CustomViewRepresentable()
.background(.gray)
.border(.red, width: 1)
}
.frame(width: geometry.size.width, height: geometry.size.height)
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
自定义视图
import UIKit
class CustomView: UIView {
private let containerView = UIView()
override func layoutSubviews() {
containerView.center = self.center
}
func addContainerView() {
containerView.frame = CGRect(origin: .zero, size: CGSize(width: 300, height: 300))
addSubview(containerView)
containerView.center = self.center
}
}
自定义视图可表示
import UIKit
import SwiftUI
struct CustomViewRepresentable: UIViewRepresentable {
typealias UIViewType = CustomView
func makeUIView(context: Context) -> CustomView {
let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
customView.addContainerView()
return customView
}
func updateUIView(_ uiView: CustomView, context: Context) {
}
}