gpt4 book ai didi

ios - 自定义标注 View 按钮到 map

转载 作者:行者123 更新时间:2023-11-30 12:03:01 25 4
gpt4 key购买 nike

我正在开发一个 MapView,单击任何自定义注释图钉时,我将显示自定义标注 View (从 xib 文件加载)。

从此自定义标注中,我有一个 UIButton,我已经可以检测到对此按钮的点击,但我想在 map 上进行访问,例如基本标注中的 : view?.rightCalloutAccessoryView。

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView,  {

if view.annotation!.isKind(of: MKUserLocation.self){
return
}

let customView = (Bundle.main.loadNibNamed("CustomCalloutView", owner: self, options: nil))?[0] as! CustomCalloutView;
let calloutViewFrame = customView.frame;
customView.frame = CGRect(x: -calloutViewFrame.size.width/2.23, y: -calloutViewFrame.size.height+10, width: 315, height: 170)

view.addSubview(customView)

let region = MKCoordinateRegion(center: pinToZoomOn!.coordinate, span: span)

mapView.setRegion(region, animated: true)
}

路线是根据经典标注正确计算的,但我不知道如何通过自定义标注的按钮访问我的 map 。

我的自定义CalloutViewClass:

import UIKit
import MapKit

class CustomCalloutView: MKAnnotationView {

@IBOutlet weak var goButton: UIButton!

@IBAction func goButton(_ sender: AnyObject) {
print("Button clicked sucessfully")
}

// MARK: - Detect taps on callout

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let hitView = super.hitTest(point, with: event)
if hitView != nil {
superview?.bringSubview(toFront: self)
}
return hitView
}

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
let rect = self.bounds
var isInside = rect.contains(point)
if !isInside {
for view in subviews {
isInside = view.frame.contains(point)
if isInside {
break
}
}
}
return isInside
}
}

如果有人有一个想法,这会对我陷入这个问题有所帮助。

提前谢谢您。

最佳答案

选项 1:在传递给 CustomCalloutView 的闭包中捕获 MKMapView 实例

添加将在按钮操作上调用的闭包。闭包将捕获 MKMapView 实例,您将能够在其中找到我们。

class CustomCalloutView: MKAnnotationView {
var didTapGoButton: (() -> Void)?

@IBAction func goButton(_ sender: AnyObject) {
didTapGoButton?()
}
}

选项 2:添加对 MKMapView 的弱引用作为标注的属性

这不是一个干净的解决方案,但在某些情况下它可能是一个选项。您只需创建一个弱属性,存储对 CustomCalloutView

MKMapView 实例的引用
class CustomCalloutView: MKAnnotationView {
weak var mapView: MKMapView?
}

配置

这就是为这两种解决方案连接 CustomCalloutView 的方法。请记住使用 swift capture list 来捕获对 MKMapView 实例的弱引用。没有它,您可能会创建一个强大的引用循环。

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)  {
// ...
let customView = (Bundle.main.loadNibNamed("CustomCalloutView", owner: self, options: nil))?[0] as! CustomCalloutView;
// Option 1
customView.didTapGoButton = { [weak mapView ] in
print(mapView?.annotations.count)
}
// Option 2
customView.mapView = mapView
// ...
}

关于ios - 自定义标注 View 按钮到 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46989663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com