SwiftUIでカスタム地図を表示する(その2)
その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)
        }
    }
}

コメント
コメントを投稿