मेरे पास एक ForEach
लूप के साथ एक लंबवत ScrollView
है जिसमें HStack
के अंदर Text
, Image
, और दो Text
हैं। मैं प्रत्येक पंक्ति की वस्तुओं को एक दूसरे के साथ संरेखण में रखना चाहता हूं। मैंने VStack
को alignment .leading
के साथ लपेटने का प्रयास किया है, लेकिन कुछ नहीं किया। मेरे पास जो समस्या है वह यह है कि पाठ पंक्तिबद्ध नहीं है। स्विफ्टयूआई के लिए अभी भी बहुत नया है इसलिए किसी भी मदद की सराहना की जाएगी।
ScrollView(.vertical) {
ForEach(self.daily.forecast, id: \.date) { forecast in
HStack (spacing : 10){
Text(forecast.date ?? "")
.fontWeight(.bold)
Spacer()
RequestImage(Url("IMAGE_URL"))
.aspectRatio(contentMode: .fit)
.frame(width: 30, height: 30)
.clipped()
Spacer()
Text("\(forecast.maxTemp)")
.fontWeight(.bold)
Text("\(forecast.minTemp)")
.fontWeight(.bold)
}
}
}
.padding(.all, 15)
.onAppear() {
authorize {_ in
loadForecast()
}
}
अद्यतन: मैं थोड़ा और करीब आने में सक्षम था लेकिन चीजें अभी भी गठबंधन नहीं हैं जहां मैं उन्हें चाहता हूं।
ScrollView(.vertical) {
ForEach(self.daily.forecast, id: \.date) { forecast in
HStack (spacing : 10){
Text(date)
.font(.title3)
.fontWeight(.bold)
.frame(minWidth: 45)
Spacer()
RequestImage(Url("IMAGE_URL"))
.aspectRatio(contentMode: .fit)
.frame(width: 35, height: 35)
.frame(minWidth: 50)
.clipped()
Spacer()
Text(maxTemp)
.font(.title3)
.fontWeight(.bold)
.frame(minWidth: 45)
Text(minTemp)
.font(.title3)
.fontWeight(.bold)
.foregroundColor(Color.secondary)
.frame(minWidth: 45)
}
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
}
}
.padding(.all, 15)
.onAppear() {
authorize {_ in
loadForecast()
}
}
3 जवाब
यहां संभावित समाधान का एक डेमो है। Xcode 12.4 / iOS 14.4 . के साथ तैयार
struct DemoWeatherLayout: View {
private var dayOfTheWeek = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sut"]
var body: some View {
ScrollView {
VStack {
ForEach(dayOfTheWeek, id: \.self) {
WeatherRowView(day: $0,
icon: ["sun.max", "cloud.sun", "cloud", "cloud.snow"].randomElement()!,
low: Array(-5..<0).randomElement()!,
high: Array(1..<15).randomElement()!)
}
}.padding()
}
}
}
struct WeatherRowView: View {
var day: String
var icon: String
var low: Int
var high: Int
var body: some View {
HStack {
Text(day)
.frame(maxWidth: .infinity, alignment: .leading)
Image(systemName: icon)
.frame(maxWidth: .infinity, alignment: .leading)
HStack {
Text("+XXº").foregroundColor(.clear)
.overlay(Text(String(format: "%+d", low)), alignment: .leading)
Text("+XXº").foregroundColor(.clear)
.overlay(Text(String(format: "%+d", high)), alignment: .leading)
}
}
}
}
तीन सुझाव:
alignment
पैरामीटर कोHStack
में जोड़ें:HStack(alignment: .lastTextBaseline, spacing: 10) { ... //others options: .top, .center, .firstTextBaseline...
minLength
पैरामीटर कोSpacer
में जोड़ें:Spacer(minLength: 0)
लेकिन रिक्ति के साथ: 10HStack
में यह थोड़ा बेमानी है। आपspacing: 10
कोSpacer(minLength: 10)
के लिए हटा सकते हैंText("\(forecast.minTemp)").fontWeight(.bold)
के बाद अंत में एकSpacer(minLength: 0)
जोड़ें
मैं @Asperi उत्तर को सही के रूप में स्वीकार करने जा रहा हूं। यूआई वास्तव में तब से बदल गया है जब से कहा गया लेबल बेहतर फिट हो गया है। बाकी सभी की सराहना करें। कोड बहुत बदसूरत है लेकिन काम करता है। सुनिश्चित नहीं है कि यह 100% सही है।
HStack (spacing: 10){
Text(date)
.font(.title3)
.fontWeight(.bold)
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
Spacer()
RequestImage(Url("IMAGE_URL_HERE"))
.aspectRatio(contentMode: .fit)
.frame(width: 35, height: 35)
.frame(minWidth: 55)
.clipped()
Spacer()
Text(maxTemp)
.font(.title3)
.fontWeight(.bold)
.frame(minWidth: 50)
.background(Color.orange)
.cornerRadius(5)
Text(minTemp)
.font(.title3)
.fontWeight(.bold)
.frame(minWidth: 50)
.background(Color.blue)
.cornerRadius(5)
}
संबंधित सवाल
नए सवाल
swiftui
SwiftUI ग्राफिकल यूजर इंटरफेस को परिभाषित करने के लिए एप्पल की घोषणात्मक स्विफ्ट एपीआई है। किसी भी प्लेटफ़ॉर्म पर SwiftUI के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।