लाइनलिमिट काम नहीं करता है:

TextField("Text", text: $model.commitDescr)
     .multilineTextAlignment(.leading)
     .lineLimit(5)

लाइनलिमिट कुछ भी नहीं बदलता - मैं 10-20-30 लाइनें प्रदर्शित करने में सक्षम हूं।

स्क्रॉलव्यू के साथ इसी तरह से डायमिक ऊंचाई के बजाय अधिकतम हाइट (400) है:

ScrollView() {
     TextField("Text", text: $model.commitDescr)
         .multilineTextAlignment(.leading)
         .lineLimit(5)
}
.frame(minHeight: 20, maxHeight: 400)

निम्नलिखित भी ठीक से काम नहीं करता है:

TextField("Text", text: $model.commitDescr)
     .multilineTextAlignment(.leading)
     .lineLimit(5)
     .frame(minHeight: 20, maxHeight: 400)
0
Andrew 4 सितंबर 2021, 20:42

4 जवाब

सबसे बढ़िया उत्तर

यहाँ इस मुद्दे का एक तरीका है:

struct ContentView: View {
    
    @State private var commitDescr: String = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

    var body: some View {

        TextEditorView(string: $commitDescr)
  
    }
    
}


struct TextEditorView: View {
    
    @Binding var string: String
    @State private var textEditorHeight : CGFloat = CGFloat()

    var body: some View {
        
        ZStack(alignment: .leading) {

            Text(string)
                .lineLimit(5)
                .foregroundColor(.clear)
                .padding(.top, 5.0)
                .padding(.bottom, 7.0)
                .background(GeometryReader {
                    Color.clear.preference(key: ViewHeightKey.self,
                                           value: $0.frame(in: .local).size.height)
                })
            
            TextEditor(text: $string)
                .frame(height: textEditorHeight)
               
        }
        .onPreferenceChange(ViewHeightKey.self) { textEditorHeight = $0 }
        
    }
    
}


struct ViewHeightKey: PreferenceKey {
    static var defaultValue: CGFloat { 0 }
    static func reduce(value: inout Value, nextValue: () -> Value) {
        value = value + nextValue()
    }
}
3
swiftPunk 4 सितंबर 2021, 18:54

@उपलब्ध(iOS 14.0, macOS 11.0, *)

TextField के बजाय TextEditor का उपयोग करें

TextEditor(text: $text)
      .fixedSize(horizontal: false, vertical: true)
      .multilineTextAlignment(.leading)
 

उपयोग उदाहरण में:

 ScrollView {
    VStack{
        TextEditor(text: $text)
            .frame(minHeight: 40, alignment: .leading)
            .frame(maxHeight: MAX_HEIGHT)
            .cornerRadius(10, antialiased: true)
            .foregroundColor(.black)
            .font(.body)
            .padding()
            .fixedSize(horizontal: false, vertical: true)
            .multilineTextAlignment(.leading)
     }
     .background(Color.red)

 }
2
keyvan yaghoubian 4 सितंबर 2021, 20:57

आम तौर पर, टेक्स्टफिल्ड केवल टेक्स्ट की एक पंक्ति के लिए होता है। इनपुट की कई पंक्तियों के लिए, एक TextEditor() देशी SwiftUI में एक बेहतर समाधान हो सकता है। आप इसके लिए एक .frame(maxHeight: XX, संरेखण: .leading) भी सेट कर सकते हैं।

0
user200000 4 सितंबर 2021, 18:02

निश्चित ऊंचाई, स्क्रॉल करने की अनुमति देता है

TextField के बजाय TextEditor का इस्तेमाल करें। फिर आप जो चाहें maxHeight सेट करें।

struct ContentView: View {
    @State private var text = ""

    var body: some View {
        TextEditor(text: $text)
            .frame(maxHeight: 300)
    }
}

नतीजा:

Result

पंक्तियों की निश्चित संख्या, कोई स्क्रॉलिंग नहीं

अगर आप TextEditor के साथ प्रदर्शित होने वाली पंक्तियों की संख्या को सीमित करना चाहते हैं , आप ऐसा करने के लिए SwiftUI-Introspect का उपयोग कर सकते हैं।

उदाहरण:

struct ContentView: View {
    @State private var text = ""

    var body: some View {
        TextEditor(text: $text)
            .introspectTextView { textView in
                textView.textContainer.maximumNumberOfLines = 5
                textView.textContainer.lineBreakMode = .byTruncatingTail
            }
    }
}

नतीजा:

Result

0
George 4 सितंबर 2021, 18:25