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) } } }
コメント
コメントを投稿