Luk*_*Fan 8 layout swift swiftui
在我看来,我有很多文本和周围的边框,但有时会被切断并在末尾有“...”。我尝试过使用 .layout.layoutPriority()和.fixedSize(),奇怪的是,根据我使用的地点和频率,.layoutPriority()它不会在同一位置和每台设备上被切断。iPhone 8 iOS 13.3 模拟器中的屏幕截图。\n提前感谢您的帮助。
这是我当前的代码
\n\nimport SwiftUI\nimport SafariServices\n\nstruct WhatIsStopView: View {\n\n @State var show4 = false\n\n var body: some View {\n GeometryReader { geometry in\n ScrollView(.vertical) {\n VStack(alignment: .leading, spacing: 30) {\n HStack(spacing: 15) {\n Text("whatIsAStop")\n Image(systemName: "camera")\n }.font(.largeTitle)\n VStack(alignment: .leading, spacing: 45) {\n VStack(alignment: .leading, spacing: 25) {\n Text("inPhotographyAStop").layoutPriority(2)\n\n Text("stopDoubling").fontWeight(.semibold).layoutPriority(2)\n\n Text("forExample").layoutPriority(2)\n\n VStack {\n Image("exposure-stops").resizable()\n .aspectRatio(contentMode: .fit)\n Text("stopIsAMeasure").italic().layoutPriority(2)\n }\n\n Text("amountOfLightCaptured").layoutPriority(2)\n\n }\n\n VStack(alignment: .leading, spacing: 25) {\n Text("stopsAndShutterSpeed").font(.headline).layoutPriority(2)\n\n Text("shutterSpeedMeasures").layoutPriority(2)\n\n VStack {\n Image("exposure-stops-shutter-speed").resizable()\n .aspectRatio(contentMode: .fit)\n Text("commonShutterSpeedStops").italic().layoutPriority(2)\n }\n\n Text("forExampleChanging").layoutPriority(2)\n\n Text("mostCamerasAllow").layoutPriority(2)\n }\n\n VStack(alignment: .leading, spacing: 25) {\n Text("stopsAndISOSpeed").font(.headline).layoutPriority(2)\n\n Text("ISOSpeedDescribes").layoutPriority(2)\n\n VStack {\n Image("exposure-stops-iso-speed").resizable()\n .aspectRatio(contentMode: .fit)\n Text("commonISOSpeedStops").italic().layoutPriority(2)\n }\n\n Text("ISOIsMeasured").layoutPriority(2)\n\n Text("forExampleSwitching").layoutPriority(2)\n }\n\n VStack(alignment: .leading, spacing: 25) {\n Text("stopsAndAperture").font(.headline).layoutPriority(2)\n\n Text("apertureIsMeasured").layoutPriority(2)\n\n VStack {\n Image("exposure-stops-aperture").resizable()\n .aspectRatio(contentMode: .fit)\n Text("commonApertureStops").italic().layoutPriority(2)\n }\n\n Text("becauseOfTheWay").layoutPriority(2)\n\n Text("asWithShutterSpeed").layoutPriority(2)\n }\n\n VStack(alignment: .leading, spacing: 25) {\n\n Text("stopsAreInterchangeable").font(.headline).layoutPriority(2)\n\n Text("theGreatThing").layoutPriority(2)\n\n Text("letsSay").layoutPriority(2)\n\n Text("thisChangeOf").layoutPriority(2)\n\n Text("youCouldOpen").layoutPriority(2)\n\n Text("alternativelyYouCould").layoutPriority(2)\n\n Text("asYouCanSee").layoutPriority(2)\n }\n\n VStack(alignment: .leading, spacing: 25) {\n\n Text("conderationsWhenAdjustingExposure").font(.headline).layoutPriority(2)\n\n Text("whenAdjustingTheThree").layoutPriority(2)\n\n Text("shutterSpeedIf").layoutPriority(2)\n\n Text("apertureA").layoutPriority(2)\n\n Text("ISOSpeedThe").layoutPriority(2)\n\n Text("asWithEverything").layoutPriority(2)\n\n Text("exposureStopsAreA").layoutPriority(2)\n }\n\n Divider()\n\n HStack {\n Button(action: {\n self.show4.toggle()\n }) {\n Text("linkToOriginalArticle").padding().foregroundColor(.white)\n .background(LinearGradient(gradient: .init(colors: [.yellow,.purple]), startPoint: .leading, endPoint: .trailing))\n .cornerRadius(20)\n .sheet(isPresented: self.$show4) {\n photography().edgesIgnoringSafeArea(.all)\n }\n }\n Spacer()\n Text("\xc2\xa9 Photography Mad")\n }\n\n }.padding()\n .overlay(\n RoundedRectangle(cornerRadius: 16)\n .stroke((LinearGradient(gradient: .init(colors: [.purple,.blue]), startPoint: .leading, endPoint: .trailing)), lineWidth: 4)\n )\n Spacer()\n }.padding()\n VStack {\n AdView().frame(width: 320, height: 50)\n }.edgesIgnoringSafeArea([.top, .leading, .trailing])\n }\n }\n .navigationBarTitle(Text("whatIsAStop"), displayMode: .inline)\n }\n}\n\nstruct WhatIsStopView_Previews: PreviewProvider {\n static var previews: some View {\n WhatIsStopView()\n .environment(\\.locale, .init(identifier: "fr"))\n }\n}\n\n\nstruct photography : UIViewControllerRepresentable {\n\n func makeUIViewController(context: UIViewControllerRepresentableContext<photography>) -> SFSafariViewController {\n let controller = SFSafariViewController(url: URL(string: "https://www.photographymad.com/pages/view/what-is-a-stop-of-exposure-in-photography")!)\n return controller\n }\n func updateUIViewController(_ uiViewController: SFSafariViewController, context: UIViewControllerRepresentableContext<photography>) {\n\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
在 iOS 14 中你可以尝试
对于水平扩展尝试
.fixedSize(horizontal: false, vertical: true)
Run Code Online (Sandbox Code Playgroud)
对于垂直扩展尝试
.fixedSize(horizontal: true, vertical: false)
Run Code Online (Sandbox Code Playgroud)
小智 1
这种行为是很正常的。
布局优先级可让您控制视图在空间有限时缩小或在空间充足时扩展的容易程度。默认情况下,所有视图的布局优先级均为 0,这意味着它们每个都有平等的机会增大或缩小。当您将文本的布局优先级设置为 1(高于 0)时,它将自动占用所有可用空间。
当您将 all 设置Textfields为layoutPriority(1)时,这意味着所有文本字段再次具有相同的优先级,并且视图决定哪一个将展开。
您可以通过以下示例进行检查。
struct layout: View {
let text: String = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."
var body: some View {
VStack(alignment: .leading, spacing: 25) {
Text(text)
Text(text)
Text(text)
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在将 嵌入VStack到scrollView. 因为会scrollView自动展开,所以当视图不适合时,所有文本Textfields都会显示完整的文本,而无需使用布局优先级。
您会看到,灵活视图中通常不需要布局优先级。
在您的代码中,您使用 ageometryReader但没有设置约束。因此,请检查您的代码,是否geometryReader限制了视图的大小。