Swift TextView展开父视图,导致隐藏文本

Swift TextView展开父视图,导致隐藏文本,swift,swiftui,Swift,Swiftui,我的问题如下图所示: 我尝试在父视图和文本字段上使用.fixedSize(水平:垂直),但没有任何积极的结果 文本字段: struct TheTextField: UIViewRepresentable { @Binding var text : String @Binding var placeholder : String func makeCoordinator() -> TheTextField.Coordinator { ret

我的问题如下图所示:

我尝试在父视图和文本字段上使用.fixedSize(水平:垂直),但没有任何积极的结果

文本字段:

struct TheTextField: UIViewRepresentable {
    @Binding var text : String
    @Binding var placeholder : String
    
    func makeCoordinator() -> TheTextField.Coordinator {
        return TheTextField.Coordinator(parent1: self)
    }
    
    func makeUIView(context: UIViewRepresentableContext<TheTextField>) -> UITextView {
        let tview = UITextView()
        tview.isEditable = true
        tview.isUserInteractionEnabled = true
        tview.isScrollEnabled = false
        tview.text = placeholder
        tview.textColor = .gray
        tview.font = .systemFont(ofSize: 20)
        tview.delegate = context.coordinator
        return tview
    }
    
    func updateUIView(_ uiView: UITextView, context: UIViewRepresentableContext<TheTextField>) {
        
    }
    
    class Coordinator : NSObject, UITextViewDelegate {
        var parent : TheTextField
        
        init(parent1 : TheTextField) {
            parent = parent1
        }
        
        func textViewDidChange(_ textView: UITextView) {
            self.parent.text = textView.text
        }
        
        func textViewDidBeginEditing(_ textView: UITextView) {
            textView.text = ""
            textView.textColor = .label
        }
    }
}

您可以从项目的.storyboard文件轻松编辑标签属性。 将lines更改为0,将line break属性更改为所需的类型,然后可以拥有标签所需的任意多行。

导入SwiftUI
结构UITextViewWrapper:UIViewRepresentable{
@绑定变量文本:字符串
@绑定变量计算高度:CGFloat
func makeCoordinator()->UITextViewWrapper.Coordinator{
返回UITextViewWrapper.Coordinator(文本:$text,高度:$calculatedHeight)
}
func makeUIView(上下文:UIViewRepresentableContext)->UITextView{
让tview=UITextView()
tview.isEditable=true
tview.isUserInteractionEnabled=true
tview.IsCrollenabled=错误
tview.textColor=.gray
tview.font=.systemFont(字体大小:20)
tview.delegate=context.coordinator
tview.setContentCompressionResistancePriority(.defaultLow,用于:。水平)
返回电视视图
}
func updateUIView(uiView:UITextView,context:UIViewRepresentableContext){
如果uiView.text!=self.text{
uiView.text=self.text
}
如果uiView.window!=nil,则uiView.isFirstResponder{
uiView.becomeFirstResponder()
}
}
静态函数重新计算权重(视图:UIView,结果:绑定){
让newSize=view.sizeThatFits(CGSize(宽度:view.frame.size.width,高度:CGFloat.greatestfinitemagnity))
如果result.wrappedValue!=newSize.height{
DispatchQueue.main.async{
必须异步调用result.wrappedValue=newSize.height/
}
}
}
类协调器:NSObject、UITextViewDelegate{
var文本:绑定
var计算高度:绑定
初始(文本:绑定,高度:绑定){
self.text=文本
自计算高度=高度
}
func textViewDidChange(textView:UITextView){
text.wrappedValue=textView.text
UITextViewWrapper.RecreacteHeight(视图:textView,结果:calculatedHeight)
}
func textViewDidBeginEditing(uTEXTVIEW:UITextView){
textView.text=“”
textView.textColor=.label
}
}
}

我添加了根据Asperi建议的文本长度来动态改变高度的功能。

你应该考虑这个谢谢!我采用了我的代码来实现一个动态高度,它将根据文本长度进行更改。现在,每当我键入内容时,背景视图就会消失或重新出现
Divider()
TheTextField(text: self.$imageToUpload.textCaption, placeholder: self.$placeholder).padding(.horizontal)
Spacer()
import SwiftUI

struct UITextViewWrapper: UIViewRepresentable {
    @Binding var text : String
    @Binding var calculatedHeight: CGFloat
    
    func makeCoordinator() -> UITextViewWrapper.Coordinator {
        return UITextViewWrapper.Coordinator(text: $text, height: $calculatedHeight)
    }
    
    func makeUIView(context: UIViewRepresentableContext<UITextViewWrapper>) -> UITextView {
        let tview = UITextView()
        tview.isEditable = true
        tview.isUserInteractionEnabled = true
        tview.isScrollEnabled = false
        tview.textColor = .gray
        tview.font = .systemFont(ofSize: 20)
        tview.delegate = context.coordinator
        tview.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
        return tview
    }
    
    func updateUIView(_ uiView: UITextView, context: UIViewRepresentableContext<UITextViewWrapper>) {
        if uiView.text != self.text {
            uiView.text = self.text
        }
        if uiView.window != nil, uiView.isFirstResponder {
            uiView.becomeFirstResponder()
        }
    }
    
    static func recalculateHeight(view: UIView, result: Binding<CGFloat>){
        let newSize = view.sizeThatFits(CGSize(width: view.frame.size.width, height: CGFloat.greatestFiniteMagnitude))
        if result.wrappedValue != newSize.height {
            DispatchQueue.main.async {
                result.wrappedValue = newSize.height // !! must be called asynchronously
            }
        }
    }
    
    class Coordinator : NSObject, UITextViewDelegate {
        var text : Binding<String>
        var calculatedHeight : Binding<CGFloat>
        
        init(text: Binding<String>, height: Binding<CGFloat>) {
            self.text = text
            self.calculatedHeight = height
        }
        
        func textViewDidChange(_ textView: UITextView) {
            text.wrappedValue = textView.text
            UITextViewWrapper.recalculateHeight(view: textView, result: calculatedHeight)
        }
        
        func textViewDidBeginEditing(_ textView: UITextView) {
            textView.text = ""
            textView.textColor = .label
        }
    }
}