MapBox iOS SDK 2.0.0 試した
MapBoxっていうOpenStreetMapのデザインをカスタムできるみたいなサービスがあるのでiOS SDKを触ってみた。 触ってて、なんか転がっている情報となんか違うなと思っていたら、ちょうど6日程前に2.0.0がリリースされたっぽい。
使い方
ドキュメントそこそこまとまっているのでちゃんと読めば、サンプル作る程度なら迷わなそう。
- https://www.mapbox.com/ios-sdk/examples/
- 地図表示とピン立てるとこまでならこれ読めばできる
- https://www.mapbox.com/mapbox-studio/#darwin
- このツール使うとデザイン超カスタマイズできる
- https://www.mapbox.com/blog/ios-native/
- 簡単なやつならストーリーボードでちょちょいって表示することもできるっぽい
- https://www.mapbox.com/ios-sdk/api/hierarchy.html
- リファレンス
感想
- Web上でデザインの設定ができるんだけどすごい簡単だし、いろいろな表示が出来て良い
- ただ、アプリ側でどうやって表示するのかようわからんかった
- JSON書いてね!みたいな記述もあれば(しかも書き方/何を変更すればいいのか分からん)
- styleURLにMap ID(mapbox://<user.style>)指定してねみたいな記述もある
こういう感じ
mapView.styleURL = NSURL(string: "asset://styles/light-v7.json") // これはOK mapView.styleURL = NSURL(string: "mapbox://silvers.xxxxxx") // 真っ黒の地図になった
- 地図の移動を検知するほうほうがなさそう?
google mapでいうところのこれ
func mapView(mapView: GMSMapView, didChangeCameraPosition position:GMSCameraPosition) { println("didChangeCameraPosition(): latitude:\(position.target.latitude), longitude:\(position.target.longitude)") } func mapView(mapView: GMSMapView, idleAtCameraPosition position:GMSCameraPosition) { println("idleAtCameraPosition(): latitude:\(position.target.latitude), longitude:\(position.target.longitude)") }
- Mapのピンを独自の画像にすることが可能
- ただしその場合はviewDidAppear後じゃないとクラッシュする…
- [MGLAnnotationImage] does not work · Issue #1872 · mapbox/mapbox-gl-native · GitHub
- ピンの移動は出来ないので、removeAnnotationしてから位置変えてaddAnnotationする必要アリ
まとめ
簡単にカスタマイズされたデザインの地図表示するなら楽そうだなって感じだった。
一方で、地図上で複雑な処理させるならGoogleMapのほうがやりやすい。
Mapbox.js使えばWebでも使えるのでこっちは今すぐ使っても良いなあ!と思った(イベント会場の位置とか、お店の位置とかそういうの示すのに)。
swiftでArrayの範囲外をよんだときにエラーにならずnilを返すextension
swiftのArrayでインデックスの範囲外を指定すると実行時にエラーになってしまう。
let data = [ 1, 2, 3, 4 ] return index < data.count ? data[index] : nil
毎度毎度こんな感じで書くのだるいので、
let data = [ 1, 2, 3, 4 ] return data[safe: index]
でアクセスできるようにする
githubではdiffを見たくないけど手元では見たい
pull-reqとか見てるとstoryboardがすごい行数のdiff出してきて他のファイルのdiffが見づらい。
そんなときは .gitattributes
に *.storyboard -diff
って追加してあげるとdiffがでなくてステキだ。
しかし、自分が作業しているときはうっかり変な変更入れていないかとか確認したいこともある。
そんなときは .git/info/attributes
に *.storyboard diff=word
って追加してあげると自分の環境だけdiffがみれてステキだ。
UICollectionViewでCellを長押ししたい
UILongPressGestureRecognizer を都度生成するの効率悪いのでViewDidLoadで一度だけ生成して、タップ後にどのCellを押したか判定する感じにする
override func viewDidLoad() { super.viewDidLoad() let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "onLongPressAction:") longPressRecognizer.allowableMovement = 10 longPressRecognizer.minimumPressDuration = 0.5 self.collectionView.addGestureRecognizer(longPressRecognizer) }
func onLongPressAction(sender: UILongPressGestureRecognizer) { let point: CGPoint = sender.locationInView(self.collectionView) let indexPath = self.collectionView.indexPathForItemAtPoint(point) if let indexPath = indexPath { switch sender.state { case .Began: // 例えばTimerをstartさせる case .Ended: // 例えばTimerをstopさせる default: break } }
AutoLayout で UIButton の image が拡大しない
UIButtonをautolayoutで配置して、画面サイズにあわせて拡縮するようにすると、UIButton自体は拡大するんだけど、そこに設定しているimage画像(UIButtonと同じサイズ、同じアスペクト比)が拡大してくれなくて困ったマン。
Alignmentをこうやればちゃんと拡大してくれるぽい。
iOS でカスタムフォントを使いたいけどなぜか表示されないとき
の通りにやったつもりだけど、なんか実機にインストールすると表示されなかった。
- フォント追加してる? -> OK
- info.plist > Fonts provided by application に追加されてる? -> NG
- Copy Budle Resourcesに追加されてる? -> NG
な感じだったので、良くわからないけど、Target > Build Phases > Copy Bundle Resources に手動で追加したフォントを入れてあげたら大丈夫になった。