SwiftUIでカスタム地図を表示する(その2)

 その1ではカスタムタイルを表示しました。今度は手元で生成した情報を重ねてみます。

前回(その1)

(予備知識)

SwiftでPNG画像を作成する

//カンバスを作る
UIGraphicsBeginImageContext(CGSize

let context = UIGraphicsGetCurrentContext()

//お絵描きをする(ぬりつぶす)

context.setFillColor(fill)

context.fill(CGRect(x: 0, y: 0, width: 256,height: 256))

//イメージオブジェクトに変換する        

let tileImage = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()

//PNGに変換する

tileImage?.pngData()


SwiftでのErrorの返し方

SwiftならErrorをEnumで定義すると明確なうえ、NSErrorにもそれらしくCASTされるようだ。


カスタムTileOverlayを作る

PUNIO, "Xamarin.iOSで地図にTileを追加したりしてみる", プログラムの事とか,Hatena Blog

(実際)

PUNIOさんのコードをSwiftUIに移植しただけですが


import UIKit
import MapKit

class CustomTileOverlay : MKTileOverlay
{
    enum TileError:Error{
        case getCurrentContext
    }
    override func loadTile(at path:MKTileOverlayPath, result:@escaping (Data?, Error?) -> Void)
    {
        UIGraphicsBeginImageContext(CGSize(width: 256,height: 256))
        let a:CGFloat = 0.5;
        let r:CGFloat = ((path.x + path.y) % 3) == 0 ? 1 : 0
        let g:CGFloat = ((path.x + path.y + 1) % 3) == 0 ? 1 : 0
        let b:CGFloat = ((path.x + path.y + 2) % 3) == 0 ? 1 : 0
        let fill = CGColor(red: r, green: g, blue: b, alpha: a )
        //
        if let context = UIGraphicsGetCurrentContext(){
            context.setFillColor(fill)
            context.fill(CGRect(x: 0, y: 0, width: 256,height: 256))
        
            let tileImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            result(tileImage?.pngData(), nil);
        }else{
            result(nil,TileError.getCurrentContext)
        }
    }
}

コメント

このブログの人気の投稿

SwiftUIでカスタム地図を表示する(その1)