如何将忽略安全区域的 MapView 与我的其余内容与 Swift UI 对齐?
How to align a MapView that ignores the safe area with the rest of my content with Swift UI?
我是 Swift 编码的新手,只是想尝试一下。因此,我在这里尝试了这个初学者系列的运气:
https://developer.apple.com/tutorials/swiftui/creating-and-combining-views
问题:
我可以完成教程,到目前为止看起来还不错,但后来我想在 MapView
和其余内容之间添加一个 Divider
。我运行陷入布局问题。正如他们所说,MapView
覆盖了整个顶部区域,但在 iPhone 11
上,布局在 MapView
和下一个 Divider
之间增加了一个很大的差距。
到目前为止我尝试过的:
我正在尝试 VStack
间距和预览设置,但无法使间隙真正消失,除非我删除 edgesIgnoreSafeArea()
属性 即。
在 PreviewProvider
中,我可以将 Layout
设置为 sizeThatFits
。这就是我希望它最终呈现的方式,但不仅仅是在预览中。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack(spacing: 0.0) {
MapView()
.frame(width: .infinity, height: 300.0)
.edgesIgnoringSafeArea(.top) // this will ignore the top spacing
Divider()
.frame(height: 2)
.background(Color.black)
ImageMaskedView()
.offset(y: -130.0)
.padding(.bottom, -130)
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
HStack(alignment: .top) {
Text("Joshua Tree National Park")
.font(.subheadline)
Spacer()
Text("California")
.font(.subheadline)
}
}
.padding(10)
Spacer() // this will push the rest up
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.previewDevice("iPhone 11")
}
}
import SwiftUI
import MapKit
struct MapView: UIViewRepresentable {
func makeUIView(context: Context) -> MKMapView {
MKMapView(frame: .zero)
}
func updateUIView(_ uiView: MKMapView, context: Context) {
let coordinate = CLLocationCoordinate2D(latitude: 34.011286, longitude: -116.166868)
let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)
let region = MKCoordinateRegion(center: coordinate, span: span)
uiView.setRegion(region, animated: true)
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView()
}
}
左: iPhone 11
(地图和分隔线之间的巨大差距),右:预览使用sizeThatFits
(正确)
问题:
我需要调整什么才能使其正常工作?我是否需要另一种布局,或者我是否必须为整个内容设置固定大小,或者我应该做什么?我只希望最外层布局中的元素尽可能紧凑,然后在各个元素上应用填充、偏移等。
我错过了什么?
您必须在设置框架高度之前应用 edgesIgnoringSafeArea
。如果您首先将高度设置为 300.0,它将计算没有安全区域的元素的位置,因此需要更多 space,从而创建白色 space.
MapView()
.edgesIgnoringSafeArea(.top) // this will ignore the top spacing
.frame(height: 300.0)
我是 Swift 编码的新手,只是想尝试一下。因此,我在这里尝试了这个初学者系列的运气: https://developer.apple.com/tutorials/swiftui/creating-and-combining-views
问题:
我可以完成教程,到目前为止看起来还不错,但后来我想在 MapView
和其余内容之间添加一个 Divider
。我运行陷入布局问题。正如他们所说,MapView
覆盖了整个顶部区域,但在 iPhone 11
上,布局在 MapView
和下一个 Divider
之间增加了一个很大的差距。
到目前为止我尝试过的:
我正在尝试 VStack
间距和预览设置,但无法使间隙真正消失,除非我删除 edgesIgnoreSafeArea()
属性 即。
在 PreviewProvider
中,我可以将 Layout
设置为 sizeThatFits
。这就是我希望它最终呈现的方式,但不仅仅是在预览中。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack(spacing: 0.0) {
MapView()
.frame(width: .infinity, height: 300.0)
.edgesIgnoringSafeArea(.top) // this will ignore the top spacing
Divider()
.frame(height: 2)
.background(Color.black)
ImageMaskedView()
.offset(y: -130.0)
.padding(.bottom, -130)
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
HStack(alignment: .top) {
Text("Joshua Tree National Park")
.font(.subheadline)
Spacer()
Text("California")
.font(.subheadline)
}
}
.padding(10)
Spacer() // this will push the rest up
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.previewDevice("iPhone 11")
}
}
import SwiftUI
import MapKit
struct MapView: UIViewRepresentable {
func makeUIView(context: Context) -> MKMapView {
MKMapView(frame: .zero)
}
func updateUIView(_ uiView: MKMapView, context: Context) {
let coordinate = CLLocationCoordinate2D(latitude: 34.011286, longitude: -116.166868)
let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)
let region = MKCoordinateRegion(center: coordinate, span: span)
uiView.setRegion(region, animated: true)
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView()
}
}
左: iPhone 11
(地图和分隔线之间的巨大差距),右:预览使用sizeThatFits
(正确)
问题:
我需要调整什么才能使其正常工作?我是否需要另一种布局,或者我是否必须为整个内容设置固定大小,或者我应该做什么?我只希望最外层布局中的元素尽可能紧凑,然后在各个元素上应用填充、偏移等。
我错过了什么?
您必须在设置框架高度之前应用 edgesIgnoringSafeArea
。如果您首先将高度设置为 300.0,它将计算没有安全区域的元素的位置,因此需要更多 space,从而创建白色 space.
MapView()
.edgesIgnoringSafeArea(.top) // this will ignore the top spacing
.frame(height: 300.0)