提问人:batman 提问时间:8/28/2023 最后编辑:batman 更新时间:8/28/2023 访问量:58
如何使自定义 UIViewRepresentable 填充其父 VStack 并在其中居中设置自定义子视图?
How to make a custom UIViewRepresentable fill its parent VStack and have custom subview centered in it?
问:
所以我在我的项目中有以下内容。
- ContentView ~ 包含 3 个 vstack。
- CustomView ~ 具有固定大小为 300x300 的 containerView 的自定义视图,应始终在 ContentView 中居中
- CustomViewRepresentable ~ 一个 UIViewRepresentable,用于将 CustomView 插入到 ContentView 中。
每个代码如下:
内容视图
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
}
}
CustomViewRepresentable
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,否则 CustomView 中的 containerView 不会显示。
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
答:
0赞
Mohd Sultan
8/28/2023
#1
无需提供框架功能。在用我这边的工作替换代码之后。请使用以下代码进行检查。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
}
}
CustomViewRepresentable
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) {
}
}
评论
let customView = CustomView()
makeUIView
let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
customView = CustomView()