7

MKMapSnapshotter の startWithCompletionHandler メソッドでマップ ビューのスナップショットを取得しようとしています。カスタム ピン注釈ビューをスナップ ショットに追加したいと考えています。カスタム注釈ビューにラベルがあります。そのため、スナップショットを取得しているときにそのラベルを表示できません。コードは次のとおりです。

 let snapshotter = MKMapSnapshotter(options: options)
    snapshotter.startWithCompletionHandler() {
        snapshot, error in

        if error != nil {
            completion(image: nil, error: error)
            return
        }

        let image = snapshot.image
        let pin = MKPinAnnotationView(annotation: nil, reuseIdentifier: "") // I want to use custom annotation view instead of  MKPinAnnotationView
        let pinImage = UIImage(named: "pinImage")

        UIGraphicsBeginImageContextWithOptions(image.size, true, image.scale);
        image.drawAtPoint(CGPointMake(0, 0))
        var homePoint = snapshot.pointForCoordinate(coordinates[0])
        pinImage!.drawAtPoint(homePoint)

        pinImage!.drawAtPoint(snapshot.pointForCoordinate(coordinates[1]))

        let finalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        completion(image: finalImage, error: nil)
    }

ご覧のとおり、drawAtPoint は UIImage の関数です。UIImageView を使用しようとしてから、サブビューとして imageView にラベルを追加しますが、imageView で drawAtPoint を使用できないため、mapView スナップショットにラベルを追加できないことが問題です。

リンクで私が何を意味するかを見ることができます: https://www.dropbox.com/s/83hnkiqi87uy5ab/map.png?dl=0

アドバイスをありがとう。

4

1 に答える 1

11

カスタム AnnotationView クラスを作成します。MKMapSnapshotter を作成するときに、MKPointAnnotation を座標とタイトルで定義します。その後、カスタム クラスから AnnotationView を定義します。MKPointAnnotation でカスタム AnnotationView を初期化できます。また、drawAtPoint の代わりに drawViewHierarchyInRect メソッドを使用します。

あなたのコードはそのようでなければなりません。

    let snapshotter = MKMapSnapshotter(options: options)
    snapshotter.startWithCompletionHandler() {
        snapshot, error in

        if error != nil {
            completion(image: nil, error: error)
            return
        }

        let image = snapshot.image
        var annotation = MKPointAnnotation()
        annotation.coordinate = coordinates[0]
        annotation.title = "Your Title"

        let annotationView = CustomAnnotationView(annotation: annotation, reuseIdentifier: "annotation")
        let pinImage = annotationView.image

        UIGraphicsBeginImageContextWithOptions(image.size, true, image.scale);

        image.drawAtPoint(CGPointMake(0, 0)) //map

//            pinImage!.drawAtPoint(snapshot.pointForCoordinate(coordinates[0]))                        

       annotationView.drawViewHierarchyInRect(CGRectMake(snapshot.pointForCoordinate(coordinates[0]).x, snapshot.pointForCoordinate(coordinates[0]).y, annotationView.frame.size.width, annotationView.frame.size.height), afterScreenUpdates: true)


        let finalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        completion(image: finalImage, error: nil)
    }
于 2015-08-25T14:45:20.507 に答える