繁体   English   中英

快速自定义地图类

swift custom map class

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在学习Swift,并且想创建一个MKMapKit的子类来封装某些特定功能,例如检查两点之间的距离并创建自定义注释,并将所有地图代码分成一个类。

我创建了一个类:

class GameMapViewController: MKMapView, MKMapViewDelegate{...}

我在主视图控制器中的代码中初始化类(并将其作为子视图添加到情节提要上的视图,以便可以更轻松地控制它的位置):

gameMap = GameMapViewController(container: mapViewHolder)

当我想从自定义注释中触发segue时,一切设置都正常,并且所有工作都可以进行:

func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!) {...}

当我点击注释标注时, didSelectAnnotationView会被调用,但是我没有正在寻找的方法performSegueWithIdentifier ,所有针对类似问题的解决方案都建议我使用...。

(我尝试过将MapKit View放在情节提要上,并更改其类以使用GameMapViewController但没有GameMapViewController任何init函数)

我在猜测如何初始化自定义类?

MainViewController.swift:

override func viewDidLoad() {
super.viewDidLoad()
....
// Create the game map
gameMap = GameMapViewController(container: mapViewHolder)
mapViewHolder.addSubview(gameMap)

...

}

GameMapViewController.swift:

import UIKit
import MapKit


class GameMapViewController: MKMapView, MKMapViewDelegate{

var spanQuestion:MKCoordinateSpan = MKCoordinateSpanMake(180, 180)
var spanAnswer:MKCoordinateSpan = MKCoordinateSpanMake(180, 180)
var hasUserCityLocationGuess: Bool = false

var containingView: UIView

override init(){
    println ("GameMapViewController init")
    containingView = UIView()
    super.init(frame: CGRect(x: 0, y: 0, width: 1000, height: 1000))

    self.delegate=self
    var latDeltaAnswer:CLLocationDegrees = 50
    var lngDeltaAnswer:CLLocationDegrees = 50
    spanAnswer = MKCoordinateSpanMake(latDeltaAnswer, lngDeltaAnswer)

    var latDeltaQuestion:CLLocationDegrees = 180
    var lngDeltaQuestion:CLLocationDegrees = 180
    spanQuestion = MKCoordinateSpanMake(latDeltaQuestion, lngDeltaQuestion)



}

required init(coder aDecoder: NSCoder) {
    containingView = UIView()
    super.init(coder: aDecoder)
    self.delegate = nil
    println ("GameMapViewController init with decoder")
}


convenience init(container: UIView) {
    println ("GameMapViewController convenience")
    self.init()
    self.delegate = self
    containingView = container


}

func mapViewDidFinishLoadingMap(mapView: MKMapView!) {
    println("mapViewDidFinishLoadingMap")
}

func mapViewWillStartLoadingMap(mapView: MKMapView!) {

    self.frame = CGRect (x: 0, y: 0, width: containingView.frame.width, height: containingView.frame.height)
    self.contentMode = UIViewContentMode.ScaleAspectFill
    superview?.sizeToFit()
    var guessPlaceRecognizer = UILongPressGestureRecognizer(target: self, action: "guessPlace:")
    guessPlaceRecognizer.minimumPressDuration = 1.0
    mapView.addGestureRecognizer(guessPlaceRecognizer)
    mapView.mapType = MKMapType.Satellite

}

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    if overlay is MKCircle {
        var circleRenderer = MKCircleRenderer(overlay: overlay)
        circleRenderer.strokeColor = UIColor.redColor()
        circleRenderer.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1)
        circleRenderer.lineWidth = 1
        //userOverlayCircleRender = circleRenderer
        return circleRenderer
    } else {
        return nil
    }
}

func guessPlace(gestureRecognizer:UIGestureRecognizer){

    let guessPlaceFirst = NSUserDefaults.standardUserDefaults().boolForKey("guess_place_preference")

    if guessPlaceFirst {
        var touchPoint = gestureRecognizer.locationInView(self)
        var newCoord:CLLocationCoordinate2D = self.convertPoint(touchPoint, toCoordinateFromView: self)
        var userAnnotation = UserPointAnnotation()
        userAnnotation.coordinate = newCoord
        self.addAnnotation(userAnnotation)


        var getLat: CLLocationDegrees = newCoord.latitude
        var getLon: CLLocationDegrees = newCoord.longitude
        var circleCenter: CLLocation =  CLLocation(latitude: getLat, longitude: getLon)
        addRadiusCircle(circleCenter)
        hasUserCityLocationGuess = true
    }

}

func showCity() {
    let location = CLLocationCoordinate2D(latitude: (currentCity["latitude"]! as CLLocationDegrees), longitude: (currentCity["longitude"]! as CLLocationDegrees))
    let region:MKCoordinateRegion = MKCoordinateRegionMake(location, self.spanAnswer)
    let city: String = currentCity["city"]! as String
    let conditions: String = currentCity["description"] as String
    let country: String = currentCity["country"]! as String
    let address = "\(city), \(country)"
    let cityAnnotation = CityPointAnnotation()

    cityAnnotation.title = address
    cityAnnotation.subtitle = "\(conditions)"
    cityAnnotation.coordinate = location


    self.setRegion(region, animated: true)
    self.addAnnotation(cityAnnotation)
    self.selectAnnotation(cityAnnotation, animated: true)


}

func cityInfoClick(sender:UIButton){
    //sender.performSegueWithIdentifier("segueCityWebView")
}




func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    // Handle any custom annotations.

    if annotation is CityPointAnnotation {

        // Try to dequeue an existing pin view first.
        let reuseId = "CityPointAnnotationView"
        var annotationView = self.dequeueReusableAnnotationViewWithIdentifier(reuseId)
        if annotationView == nil {
            annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
            annotationView.image = UIImage(named: "marker.png")
            annotationView.rightCalloutAccessoryView = UIButton.buttonWithType(.InfoDark) as UIButton
            annotationView.canShowCallout = true
            return annotationView;

        } else {

            annotationView.annotation = annotation
        }

        return annotationView

    }
    return nil;
}

func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!) {
    println("didSelectAnnotationView")
}

func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!, calloutAccessoryControlTapped control: UIControl!) {
    println("calloutAccessoryControlTapped1")

    ///////////////////
    // I want to do a segue here
    // but nothing has the method performSegueWithIdentifier (self, mapView, control....)
    ///////////////////


}


func resetMap(){
    self.removeAnnotations(self.annotations)
    self.removeOverlays(self.overlays)
    var region:MKCoordinateRegion = MKCoordinateRegionMake(self.centerCoordinate, spanQuestion)
    self.setRegion(region, animated: true)
    hasUserCityLocationGuess = false

}
func addRadiusCircle(location: CLLocation){

    var radius = NSUserDefaults.standardUserDefaults().doubleForKey("guess_place_radius") as CLLocationDistance
    var circle = MKCircle(centerCoordinate: location.coordinate, radius: radius )

    self.removeOverlays(self.overlays)
    self.addOverlay(circle)


}

func doGeoCode( cityObject:PFObject ) -> Bool {
    ....
}

func userCityLocationGuess(userGuessTemp:Int)->NSDictionary {
    ....

}

}

1 个回复

这是因为您混淆了视图和视图控制器。 您有一个视图( MKMapView子类,但您正在命名该视图并尝试将其用作控制器。它也可以完成控制器的工作。

因此,您实际上应该有一个拥有并配置地图视图(纯MKMapView )的视图控制器,然后它可以与segue交互。

1 Automapper - 快速自定义地图

我想做一个从DateTime src到DateTime? dest的快速简单映射DateTime? dest DateTime? dest这样,如果src == DateTime.MinValue它将设置dest = null 。 有没有一种不需要制作新映射解析器的快速简便的方法来做到这一点? ...

2 快速导入自定义类?

我有一个简单的主从设置,带有两个表视图控制器。 在主控制器中,我创建了一个自定义类,我想在我的详细信息控制器中使用该自定义类。 现在我知道swift已取消实现类,但是当我尝试在我的详细信息控制器中创建此类的新对象时,它变为“未声明”。 是否应该有进口声明? 还是我错过了什么? 这是我的 ...

2015-06-05 21:52:25 1 679   ios/ swift
4 自定义UIButton类,动画快速

是否可以创建带有onclick动画的UIButton类,该动画将在用户每次触摸按钮时自动调用 ? 所以我不想在必须调用button.buttonclicked()的ViewController中创建一个动作。 每当我使用此类时,这应该会自动发生。 有可能做这样的事情吗? ...

5 具有自定义类的无序地图

我在这里是新问题,这是我的第一个问题。(我在查看此站点时发现了我问题的一些答案,但由于我的情况与我有所不同,所以我不明白它们的含义。)首先让我向您展示一些代码:这是我的课: 然后,我将创建一个函数来执行此操作,但是列表很长: 因此,我可以致电商品ID,并随时获取单独的颜色,类型和 ...

6 GSON自定义类,包含地图

我有一个包含映射的对象,其中映射中的每个值都是另一个对象,该对象由一些基元和一个列表组成,如下所示: 为了便于讨论,我有一个类实例,其中保存了一些信息(可以从下面的解析json进行描述,不那么重要...)。 当我使用GSON序列化此类时,将在服务器端按如下方式检索它: 当我尝试 ...

2013-01-15 11:04:46 2 263   map/ gson
8 快速在Google地图中自定义标记

我想在单击Google地图中的图钉时显示我的自定义视图。 我已经在xib文件中为它的自定义视图疯狂了,并在func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {的委托方法中调用了该文件func map ...

9 快速自定义类初始化

我试图实现快速扩展UIControl的自定义类,不能完全解决初始化问题。 当我尝试使用以下方法创建此类的实例时: 我收到错误: 编写此自定义初始化程序的正确方法是什么? ...

10 自定义类列表,快速更新视图

我是 Swift 新手,对于基本问题很抱歉。 我创建了一个自定义类,我想在 SwiftUI 中显示这个自定义类的列表。 我想跟踪此列表中的更改(新元素,已删除元素)。 我不能改变类的性质,但我可以创建或不创建自定义类,此类的实例列表。 如果我对列表使用@State Objects,则不会显示任 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM