横並びの制限?
経度1度ごとに横に並べるようにしたら、なぜか411個という中途半端な個数が最大だった。なぜか411個が限界 |
ランダム配置なら制限なし?
しかし世界中のランダムな位置に刺すようにしたところ、1000個でも表示できた。1000個でもいけた |
なお表示速度はどちらも一瞬で、目立った遅延もないようなので気にしなくて良さそう。
10,000個でも大丈夫
10,000個にもチャレンジしたら、表示できたが、さすがにspanを広くしてpinがいっぱい表示されるようにしたら重くなった。(iPad Air2)でもちょっと引っかかる程度で、実用上さほど問題あるとも思えなかった。spanを狭く取ればスイスイだし。
10,000個もpinを表示する機会は滅多にないよね。
10,000個でもいけたがちょっと重い |
override func viewDidLoad() {
super.viewDidLoad()
//pinを1000個追加
var annotationArr = Array<MKAnnotation>()
for i in 1...1000 {
let anno = MKPointAnnotation()
let longi = Double(arc4random() % UInt32(360)) - Double(180)
let lat = Double(arc4random() % UInt32(180)) - Double(90)
print(i)
anno.coordinate = CLLocationCoordinate2DMake(Double(lat), Double(longi))
anno.title = "経度:\(longi) 緯度:\(lat)"
anno.subtitle = "番号 \(i)"
annotationArr.append(anno)
}
self.myMapView.addAnnotations(annotationArr)
//1000番目のpinの位置をマップのデフォルト位置に
let lat = annotationArr.last?.coordinate.latitude
let lng = annotationArr.last?.coordinate.longitude
let coordinate = CLLocationCoordinate2DMake(lat!, lng!)
let span = MKCoordinateSpanMake(0.05, 0.05) //表示範囲(拡大)
let region = MKCoordinateRegionMake(coordinate, span)
self.myMapView.setRegion(region, animated: true)
}
ちなみに以前勉強した時はMKPointAnnotationを使わずにカスタムクラスを作ってannotationを管理するようにって読んだんだけど、単純に表示するだけならMKPointAnnotationで事足りるよね? よくわかんないけどいいか。
色を変えてみる
1000個表示でも少し重い |
ピンの色を変えるにはMapViewのdelegateメソッドを使う必要がある。
ピンの緯度経度、タイトル/サブタイトル、色やアイコンのデザインまで一括してプロパティに持つクラスがありゃいいのにと思うけど、Appleの技術者様の考えることはわからない。
しょうがないので、みんなカスタムクラスを作ってるみたい。
表示は少し重くなる。ピンを表示するごとにdelegateメソッドが呼ばれるせいだろう。
数が少なければ気にならないと思う。
//pinを1000個追加の後あたりに以下を追加
self.myMapView.delegate = self
//pinのデザインを変えるにはdelegateメソッドを使う
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let annoView = MKPinAnnotationView()
annoView.annotation = annotation
let r = Float(Double(arc4random() % 10) / 10)
let g = Float(Double(arc4random() % 10) / 10)
let b = Float(Double(arc4random() % 10) / 10)
annoView.pinTintColor = UIColor.init(colorLiteralRed: r, green: g, blue: b, alpha: 1.0)
annoView.canShowCallout = true
return annoView
}
画像を変えてみる
画像2種類+色を変えたピン 意外と軽い |
今度は画像を変更して見たところ、動きが軽い。
色を変えないピンよりは引っかかるが、色を様々に変えたものよりは軽いのだ。
delegateメソッドを繰り返し呼ぶのがボトルネックになっているのではなく、新たに色が違う画像を生成するか、キャッシュされた画像を再利用するかの点で違いが出てるのかも?
もっと画像の種類を増やすと違いが出てくるだろう。
なお、画像の中心(9*9の画像なら5,5の位置)が設定した緯度経度の位置になるようだ。
同じ緯度経度のデフォルトのピンと重ねてみるとよくわかる。
なお、画像の中心(9*9の画像なら5,5の位置)が設定した緯度経度の位置になるようだ。
同じ緯度経度のデフォルトのピンと重ねてみるとよくわかる。
0 件のコメント:
コメントを投稿