我正在尝试将一个MapAnnotation项目添加到我的Map()视图中MapKit。
如果您在文本字段中手动添加坐标,则一切正常,但我找不到任何通过点击地图来添加坐标的方法。
我在互联网上阅读了很多内容,但没有找到任何有关onTap()地图事件处理的信息。
这是我到目前为止的地图视图的样子:
struct MyMap : View {
@State private var myRegion:MKCoordinateRegion = {
var newRegion = MKCoordinateRegion()
newRegion.center.latitude = 53.7576508
newRegion.center.longitude = -11.1811597
newRegion.span.latitudeDelta = 0.1
newRegion.span.longitudeDelta = 0.1
return newRegion
}()
@State private var annotationItems : [Annotation] = [
Annotation(name: "Pin1", description: "myDescription", coordinate: CLLocationCoordinate2D(latitude: 123.7576508, longitude: -7.2373215))
]
var body: some View {
ZStack {
Map(coordinateRegion: self.$myRegion, interactionModes: .all, annotationItems: annotationItems){ item in
MapAnnotation(coordinate: item.coordinate){
PinView(pin: item)
} …Run Code Online (Sandbox Code Playgroud) 我已经阅读了Apple关于自定义模式演示文稿的所有文档,但我找不到这个答案.当使用自定义动画呈现视图控制器时,我们可以返回3个内容(如果转换不是交互式的,交互式可以返回4个):呈现控制器和两个动画控制器(一个用于存在,一个用于解除).
在演示控制器和当前动画控制器中,Apple的代码都不包含约束.关于框架的讨论范围是Apple建议在当前动画控制器中设置所呈现的视图控制器视图的框架(如下):
// Always add the "to" view to the container.
// And it doesn't hurt to set its start frame.
[containerView addSubview:toView];
toView.frame = toViewStartFrame;
Run Code Online (Sandbox Code Playgroud)
......就是这样.
我遇到的问题是模拟器(以及我拥有的设备)中的这些呈现的视图控制器无法识别双高状态栏.更确切地说,没有一种解决方案适用于所有模拟器 - 在新模拟器(如iPhone 8)中工作的解决方案在旧的模拟器(如iPhone 5)中不起作用.如果我让Apple使用默认的UIKit动画来处理演示文稿,则所呈现的视图控制器可以很好地处理双高状态栏.因此,我可以假设所呈现的视图控制器中的约束不是问题.
所以我转向演示控制器containerViewDidLayoutSubviews和containerViewWillLayoutSubviews方法,没有任何运气:
override func containerViewDidLayoutSubviews() {
super.containerViewDidLayoutSubviews()
presentedViewController.view.frame = containerView!.bounds
}
Run Code Online (Sandbox Code Playgroud)
上面的代码仅在第一次引入双高状态栏时才在模拟器中工作; 从那以后,这种方法变得反应迟钝.要验证这一点:
override func containerViewDidLayoutSubviews() {
super.containerViewDidLayoutSubviews()
presentedViewController.view.frame = containerView!.bounds
print("did layout")
}
Run Code Online (Sandbox Code Playgroud)
在首次引入双高状态栏后,上述方法停止打印到控制台.但是,如果我将任务更改为不会改变所呈现视图框架大小的内容,例如更改其背景颜色:
override func containerViewDidLayoutSubviews() {
super.containerViewDidLayoutSubviews()
presentedViewController.view.backgroundColor = UIColor.blue
print("did layout")
}
Run Code Online (Sandbox Code Playgroud)
方法永远不会破坏.无论出于何种原因,在此方法中更改显示的视图框架的大小会在双高度状态栏的第一个切换之后中断该方法.我很想解释这种行为.不太可能是一个bug,但看起来像一个.
无论如何,Apple说如果正确使用自动布局,程序员就什么都不做!所以我的问题是,我们应该在何处或如何给出所呈现的视图控制器的视图约束,以便它可以适应其临时容器?因为,IMO,那就是问题所在.呈现的视图控制器由转换的容器视图拥有,该视图是由UIKit提供的临时视图,我们没有太多的主导权.如果我们可以将呈现的视图锚定到该容器,则所有问题都将得到解决.但我从未见过苹果这样做,甚至没有谈过这个.
注:显式锚定所呈现的视图到所述容器的任何地方视图 - 在本动画控制器(动画其完成处理程序之前或在)中,在呈现控制器,或在自适应委托方法 - 如所提到的不产生一致的结果早. …