質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

693閲覧

Mapkitをカスタマイズしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2023/04/25 10:20

編集2023/04/26 04:41

実現したいこと

MapKitの地図にダークモードを適用させたいです。
MapKit を使って一定の縮尺に達するとMapTypeを切り替えたいです。

Google Mapでは似たようなことが出来るのでAppleのMapKitで実現出来ないか知りたいです。
https://note.com/runomimi/n/n3dc7cdcb6a62

前提

・AppleのMapKitを使用しています。
・ダークモード表示は成功しました。
・デフォルトは .hybridFlyover を使用しています。
・ある一定のレベル
(例:日本地図の拡大図→東京をタップ→東京の縮尺が表示)
されると地図を .standard にして ダークモード に切り替えたいです。
(UI/UXの都合上です。)

ダークモード表示に成功したので、今度はカスタマイズに挑戦したところ何故か ダークモード が解除されてしまいました。

発生している問題・エラーメッセージ

ダークモードに切り替わらない

該当のソースコード

Swift

1// ダークモード成功 2// 参考:https://stackoverflow.com/questions/58565004/how-can-i-turn-the-mkmapview-for-dark-mode 3 4override func viewDidLoad() { 5 super.viewDidLoad() 6 7mapView.mapType = .standard 8// ダークモード 9if #available(iOS 13.0, *) { 10 self.overrideUserInterfaceStyle = .dark 11} 12}

Swift

1// ダークモード失敗 2// カスタマイズ時 3 4import UIKit 5import MapKit 6import CoreLocation 7 8class TestMapKitViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate { 9 10 // 接続 11 @IBOutlet weak var mapView: MKMapView! 12 13 // 変数 14 // 地図に立てるピン 15 var locationManager: CLLocationManager! 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 20 // 非同期開始 21 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) { 22 self.focusOnPointAndShowGlobe() 23 } 24 25 // 縮尺を設定 26 var region:MKCoordinateRegion = mapView.region 27 region.span.latitudeDelta = 0.02 28 region.span.longitudeDelta = 0.02 29 // セット 30 mapView.setRegion(region,animated:true) 31 32 // デリゲート 33 mapView.delegate = self 34 35 // 表示タイプ 36 self.mapView.mapType = .hybridFlyover 37 38 // ダークモード 39 if #available(iOS 13.0, *) { 40 self.overrideUserInterfaceStyle = .dark 41 } 42 43 // 今回は現在地とする 44 let coordinate = mapView.userLocation.coordinate 45 // ピンを生成 46 let pin = MKPointAnnotation() 47 // ピンのタイトル・サブタイトルをセット 48 pin.title = "タイトル" // 緯度・経度を入れる 49 pin.subtitle = "サブタイトル" 50 // ピンに一番上で作った位置情報をセット 51 pin.coordinate = coordinate 52 // mapにピンを表示する 53 mapView.addAnnotation(pin) 54 55 // ロングタップを検知 56 let longPress = UILongPressGestureRecognizer(target: self, action: #selector(recognizeLongPress(sender:))) 57 //MapViewにリスナーを登録 58 self.mapView.addGestureRecognizer(longPress) 59 } 60 61 func focusOnPointAndShowGlobe() { 62 let mapHeight = mapView.bounds.height // the constraint of visible Map area will base on HEIGHT of mapview 63 64 let standardMapHeight: CGFloat = 450 65 let standardCameraDistance: CGFloat = 24 * 1000 * 1000 // 24,000 km 66 67 let targetDistance = (mapHeight / standardMapHeight) * standardCameraDistance 68 let center = CLLocationCoordinate2D(latitude: 緯度, longitude: 経度) 69 let camera = MKMapCamera(lookingAtCenter: center, fromDistance: targetDistance, pitch: 0, heading: 0) 70 self.mapView.setCamera(camera, animated: true) 71 } 72 73 func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { 74 // タップされたピンの位置情報 75 print(view.annotation?.coordinate as Any) 76 // タップされたピンのタイトルとサブタイトル 77 print(view.annotation?.title!! ?? "title") 78 print(view.annotation?.subtitle) 79 } 80 81 //ロングタップした時に呼ばれる関数 82 @objc func recognizeLongPress(sender: UILongPressGestureRecognizer) { 83 //長押し感知は最初の1回のみ 84 if sender.state != UIGestureRecognizer.State.began { 85 return 86 } 87 88 // 位置情報を取得 89 let location = sender.location(in: self.mapView) 90 let coordinate = self.mapView.convert(location, toCoordinateFrom: self.mapView) 91 92 // 緯度取得 93 self.longitude = String(coordinate.latitude) 94 // 出力 95 print(coordinate.latitude) 96 97 // 経度取得 98 self.latitude = String(coordinate.longitude) 99 // 出力 100 print(coordinate.longitude) 101 102 // タップした位置に照準を合わせる処理 103 let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01) 104 let region = MKCoordinateRegion(center: coordinate, span: span) 105 self.mapView.region = region 106 107 // ピンを生成 108 let pin = MKPointAnnotation() 109 110 pin.subtitle = "緯度:" + self.longitude + "経度:" + self.latitude 111 // タップした位置情報に位置にピンを追加 112 pin.coordinate = coordinate 113 self.mapView.addAnnotation(pin) 114 } 115 116 //アノテーションビューを返すメソッド 117 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 118 // MapViewのdelegateメソッド、viewFor annotationを定義している場合、 119 // 地図上に青点のannotationを表示する処理がオーバライドされてしまう。 120 // 青点のannotation(現在地表示しているピン)のみ、処理しないという記述を行うことで正しい動きになる。 121 if annotation.title == "My Location"{ 122 return nil 123 } 124 125 //アノテーションビューの作成 126 let pinView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: nil) 127 128 //吹き出しを表示可能にする 129 pinView.canShowCallout = true 130 131 // 例で削除ボタンの作成 132 let button = UIButton() 133 button.frame = CGRect(x:0,y:0,width:40,height:40) 134 button.setImage(UIImage(systemName: "trash"), for: .normal) 135 button.tintColor = UIColor.red 136 137 //右側に削除ボタンを追加 138 pinView.rightCalloutAccessoryView = button 139 140 return pinView 141 } 142 143 func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 144 guard let annotation = view.annotation else { 145 return 146 } 147 //右のボタンが押された場合はピンを消す。 148 self.mapView.removeAnnotation(annotation) 149 } 150} 151 152

調べていること

・表示領域の変化イベントを取得する方法
https://teratail.com/questions/138369

・地図上の縮小・拡大に関するコード
https://qiita.com/shinobee/items/4406c4fdf2fbdcc40533

試したこと

・表示領域の変化を取得→一定の縮尺に達するとMapTypeを切り替える流れで実装できるのか知りたいです。
(同じような処理をしている例があまり見当たらなかったです。

調べているのですが地図のカスタマイズに疎く初心者でよくわかりません。
お手柔らかにお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2023/04/25 10:54

mapType を .hybridFlyover にしてるからでは…。
退会済みユーザー

退会済みユーザー

2023/04/25 11:07

どちらも mapView.mapType = .hybridFlyover で実装しています。 前者はそれでもダークモードになり、後者は何故かダークモードが適用されないです
hoshi-takanori

2023/04/25 11:39

mapType が .hybridFlyover だと、地図自体は light でも dark でも同じように見えるんですけど…。 ダークモードが適用されないというのは、具体的にどんな感じなんでしょうか?
退会済みユーザー

退会済みユーザー

2023/04/25 14:13

すいません。 何か機能実装出来ていたのですがどこかコードが消えてしまったのか前者で再現できなくなっていました。。 ちょっと自分でも調べてみます。。
退会済みユーザー

退会済みユーザー

2023/04/25 14:20

mapView.mapType = .standard でした。 (これだとダークモードになります。)
退会済みユーザー

退会済みユーザー

2023/04/25 14:24

(質問内容変更します。)
hoshi-takanori

2023/04/25 15:26

試しにボタンを配置して、押したら overrideUserInterfaceStyle や mapType を切り替えるようにしてみましたが、ちゃんと切り替わりましたけど…。
退会済みユーザー

退会済みユーザー

2023/04/26 03:57

質問内容を修正しました。 縮尺が一定の値以下になるとダークモードに変更。一定の値以上になると.hybridFlyoverに戻す処理を目指しています。 アドバイスいただけると幸いです。 よろしくお願いします。
hoshi-takanori

2023/04/26 04:44

縮尺の変化を検知する方法を知りたいってこと? 質問が変わりすぎ…。
退会済みユーザー

退会済みユーザー

2023/04/26 04:52

自己解決しました。。
退会済みユーザー

退会済みユーザー

2023/04/26 05:08

色々と回答ありがとうございます。
guest

回答1

0

ベストアンサー

最初の質問:地図にダークモードを適用したい
変更後の質問:(ある条件下で)地図にダークモードを適用したい
(質問内容が一部変更になってしまい申し訳ありませんでした。)

1:regionDidChangeAnimatedで表示変化のイベントを取得
2:緯度と経度の値で縮尺に似たものを生成
3:1以下で MapType を切り替える

Swift

1func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 2 let span = mapView.region.span 3 if span.latitudeDelta <= 1 || span.longitudeDelta <= 1 { 4 print("============================") 5 print("span.latitudeDeltaは") 6 print(span.latitudeDelta) 7 print("============================") 8 print("span.longitudeDeltaは") 9 print(span.longitudeDelta) 10 print("============================") 11 print("MapTypeをダークモードに切り替えてください。") 12 print("============================") 13 DispatchQueue.main.async { 14 // MapTypeを切り替える予定 15 // ダークモードにする 16 // 不要な情報も非表示にする 17 } 18 19 }else{ 20 // 特に何もしない 21 print("特に何もしない") 22 } 23 }

投稿2023/04/26 05:08

編集2023/04/26 05:20
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問