निम्नलिखित कोड पर विचार करें:

VStack{
    Text("A reference text")
    Text("(Adjust the length of this line to match the one above)")
}

मैं चाहता हूं कि दूसरा Text() फ़ॉन्ट आकार में छोटा किया जाए ताकि ऊपर दिए गए वाक्य की लंबाई बिल्कुल हो। मैंने पहले ही कोशिश कर ली है:

Text("(Adjust the length of this line to match the one above)")
     .scaledToFit()
     .minimumScaleFactor(0.01)

लेकिन ऐसा लगता है कि काम नहीं कर रहा है। इसे कैसे प्राप्त किया जा सकता है?

2
Khashayar Abri 4 सितंबर 2021, 22:17

3 जवाब

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

आपको संदर्भ दृश्य का आकार प्राप्त करने की आवश्यकता है

struct ScaledTextView: View {
    @State var textSize: CGSize =  CGSize.zero
    var body: some View {
        VStack{
            Text("A reference text")
                .viewSize(viewSize: $textSize) //Get initial size and any changes
            Text("(Adjust the length of this line to match the one above)")
            //If you want it to be a single line set the limit
            //.lineLimit(1)
            
            //Set the dependent's view frame, you can just set the width if you want, height is optional
                .frame(width: textSize.width, height: textSize.height)
                .scaledToFit()
                .minimumScaleFactor(0.01)
        }
    }
}
//Make it reusable and keep the view clean
extension View{
    func viewSize(viewSize: Binding<CGSize>) -> some View{
        return self.background(
            //Get the size of the View
            GeometryReader{geo in
                Text("")
                //detects changes such as landscape, etc
                    .onChange(of: geo.size, perform: {value in
                        //set the size
                        viewSize.wrappedValue = value
                    })
                //Initial size
                    .onAppear(perform: {
                        //set the size
                        viewSize.wrappedValue = geo.size
                    })
            }
        )
    }
}
1
lorem ipsum 4 सितंबर 2021, 21:38

यहाँ संभव सरल दृष्टिकोण है

VStack {
    let ref = "A reference text"
    let target = "(Adjust the length of this line to match the one above)"
    Text(ref)
    Text(ref).opacity(0)
        .overlay(Text(target)
            .scaledToFit()
            .minimumScaleFactor(0.01)
        )
}

demo

2
Asperi 4 सितंबर 2021, 20:02

यह एक ऐसा तरीका है जो छोटे टेक्स्ट की ऊंचाई को ठीक नहीं करता है।

struct ContentView: View {
    @State private var width: CGFloat?

    var body: some View {
        VStack {
            Text("A reference text")
                .background(
                    GeometryReader { geo in
                        Color.clear.onAppear { width = geo.size.width }
                    }
                )

            Text("(Adjust the length of this line to match the one above)")
                .scaledToFit()
                .minimumScaleFactor(0.01)
        }
        .frame(width: width)
        .border(Color.red)
    }
}

नतीजा:

Result

1
George 4 सितंबर 2021, 20:38