我使用MKMapView
和MKPointAnnotation
过去有过一些经验,我曾经在地图上放了一些图钉。
这次我试图更进一步,使用MKPinAnnotationView
,写一个标签和一些引脚。
不幸的是,它并没有像我期望的那样完成。
这是我想要做的:
我有一张地图(一个MKMapView对象),当我触摸它时,我在触摸点放了一个引脚,然后进行了一些计算,这给了我地图上的第二个点。我把第二个引脚(位于第二个点)放在最后一个引脚上,我想放一个标签,说" Hello Second!"。
以下是相关代码:
class ViewController: UIViewController, MKMapViewDelegate {
var mapView:MKMapView!, touchPoint,secondPoint:MKPointAnnotation!
override func viewDidLoad() {
super.viewDidLoad()
mapView = MKMapView()
...........
let mapTap = UITapGestureRecognizer(target: self,
action: #selector(ViewController.mapTouchHandler))
mapView.addGestureRecognizer(mapTap)
}
func mapTouchHandler(gesture:UITapGestureRecognizer) {
...........
// Compute map coordinates for the touch point (tapGeoPoint).
if touchPoint == nil {
touchPoint = MKPointAnnotation()
mapView.addAnnotation(touchPoint);
}
touchPoint.coordinate = CLLocationCoordinate2D(latitude: tapGeoPoint.latitude,
longitude: tapGeoPoint.longitude)
...........
computeSecondPoint(url: someComputedURL)
}
func computeSecondPoint(url searchURL:String) {
let reqURL = NSURL(string: searchURL)!, session = URLSession.shared,
task = session.dataTask(with: reqURL as URL) {
(data: Data?, response: URLResponse?, error: Error?) in
if error == nil {
do {let allData = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray
.................
// Compute map coordinates for the second point (secondPointCoord).
if self.secondPoint == nil {
self.secondPoint = MKPointAnnotation()
self.mapView.addAnnotation(self.secondPoint)
}
DispatchQueue.main.async {
() -> Void in
self.secondPoint.coordinate = CLLocationCoordinate2D(latitude: secondPointCoord.latitude,
longitude: secondPointCoord.longitude)
self.secondPoint.title = "Hello Second!"
}
} catch let error as NSError {print(error.localizedDescription)}
} else {
print("Error inside \(#function):\n\(error)")
}
}
task.resume()
}
func mapView(_ mapView: MKMapView,
viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let identifier = "pin"
var view: MKPinAnnotationView
if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
as? MKPinAnnotationView {
dequeuedView.annotation = annotation
view = dequeuedView
} else {
view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
view.canShowCallout = true
view.calloutOffset = CGPoint(x: -5, y: 0)
}
return view
}
}
现在发生的情况是,引脚按预期放置,但我没有在第二个上看到任何标签。 我还注意到,如果我点击第二个引脚所在的位置(在这种情况下,第二个引脚将保持在同一位置),则标签出现(应该始终如此)。如果我再次点击(不是那么近),那么标签会再次消失(尽管它不应该)。
我的代码(上图)中有什么东西不对吗? 任何相关的提示将不胜感激。
答案 0 :(得分:1)
你在
中提到的标题self.secondPoint.title = "Hello Second!"
是点击注释引脚时出现的标注视图的标题。如果您希望每次都可以将MKAnnotationView
子类化,并在自定义引脚视图中添加标签,则需要显示标签和图像。您可以按以下方式自定义
class CustomAnnotationView : MKPinAnnotationView
{
let helloLabel:UILabel = UILabel.init(frame:CGRectMake(0, 0, 100, 40)) //your desired frame
func showLabel(title : String)
{
helloLabel.text = title
helloLabel.textAlignment = .Center
//set further properties
self.addSubview(helloLabel)
}
fun hideLabel() {
helloLabel.removeFromSuperview()
}
}
答案 1 :(得分:0)
我已经使用了谷歌地图,但它应该适用于你...
let position = CLLocationCoordinate2DMake(latitude,longitude)
let location = GMSMarker(position: position)
location.icon = image
location.icon? = self.imageWithImage(image, scaledToSize: CGSize(width: 50.0, height: 50.0))
location.title = "the photo is clicked here!!"
location.map = MapView
答案 2 :(得分:0)
尝试此解决方案这将对您有所帮助
首先创建MyAnnotation引脚
if(geo_accuracy == "0")
{
colorofpin = .Blue
}else if (geo_accuracy == "1")
{
colorofpin = .Red
}else
{
colorofpin = .Green
}
var locationAnnotation = MyAnnotation(coordinate: location,
title: p_user_name!,
subtitle: "",
pinColor: colorofpin,
getTag:i)
/* And eventually add them to the map */
//aryNotation.addObject(locationAnnotation)
aryNotation.append(locationAnnotation)
mapview委托方法
func mapView(mapView: MKMapView,
viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?{
if annotation is MyAnnotation == false{
return nil
}
/* First typecast the annotation for which the Map View has
fired this delegate message */
let senderAnnotation = annotation as! MyAnnotation
// -------------------------- For ios 9 -------------------
let reuseId = "pin"
var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
if pinView == nil {
pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
pinView!.canShowCallout = true
}else{
pinView!.annotation = annotation
}
pinView!.tag = senderAnnotation.getTag;
// print(senderAnnotation.getTag)
if annotation is MyAnnotation {
//print(senderAnnotation.pinColor)
if(senderAnnotation.pinColor == .Red)
{
if(currentIndex == senderAnnotation.getTag)
{
//print("currentIndex==\(currentIndex)********")
pinView!.image = UIImage(named: "jivemap_pin_rough_o.png")
pinView!.layer.zPosition = 1
pinView?.bringSubviewToFront(self.view)
// pinView!.superview!.bringSubviewToFront(view)
}else
{
pinView!.image = UIImage(named: "jivemap_pin_rough_g.png")
pinView!.layer.zPosition = 0
}
}
else
{
if(currentIndex == senderAnnotation.getTag)
{
//print("currentIndex==*********\(currentIndex)********")
pinView!.image = UIImage(named: "jivemap_pin_o.png")
pinView!.layer.zPosition = 1
}else
{
pinView!.image = UIImage(named: "jivemap_pin_g.png")
pinView!.layer.zPosition = 0
}
}
pinView!.rightCalloutAccessoryView = UIButton(type: UIButtonType.DetailDisclosure) as UIView
// pinView
// return pinView
}
return pinView
//return annotationView
}
这是我的报废课。这堂课将满足你的所有问题
import UIKit
import MapKit
/* This will allow us to check for equality between two items
of type PinColor */
func == (left: PinColor, right: PinColor) -> Bool{
return left.rawValue == right.rawValue
}
/* The various pin colors that our annotation can have */
enum PinColor : String{
case Blue = "Blue"
case Red = "Red"
case Green = "Green"
case Purple = "Purple"
/* We will convert our pin color to the system pin color */
func toPinColor() -> MKPinAnnotationColor{
switch self{
case .Red:
return .Red
case .Green:
return .Green
case .Purple:
return .Purple
default:
/* For the blue pin, this will return .Red but we need
to return *a* value in this function. For this case, we will
ignore the return value */
return .Red
}
}
}
class MyAnnotation: NSObject, MKAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String?
var subtitle: String?
var pinColor: PinColor!
var getTag:Int!
var annoationIndex = 0
init(coordinate: CLLocationCoordinate2D,
title: String,
subtitle: String,
pinColor: PinColor,
getTag: Int){
self.coordinate = coordinate
self.title = title
self.subtitle = subtitle
self.pinColor = pinColor
self.getTag = getTag
super.init()
}
convenience init(coordinate: CLLocationCoordinate2D,
title: String,
subtitle: String,
gettag: Int){
self.init(coordinate: coordinate,
title: title,
subtitle: subtitle,
pinColor: .Blue,
getTag: gettag)
}
}