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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

1回答

587閲覧

swift3 マップ上に画面から動かない円と線を描画したい

harima

総合スコア17

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2017/08/08 03:59

MKMapView上に画面の中心から動かない円と線を描きたい。
現在、MKPolylineで描くとスクロールをして場面から見えなくなってしまう。
その他のarcCircleは、扇型の領域を描き、中心部を透明にできない。地図はスクロールして、円、線はスクロールしない方法はありませんか?宜しくお願い致します。

swift

1// ViewController.swift 2import UIKit 3import MapKit 4 5class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate { 6 var myMapView : MKMapView! 7 var myLocationManager : CLLocationManager! 8 var imHearBtn : UIButton! 9 // 縮尺. 10 var myLatDist : CLLocationDistance = 10 11 var myLonDist : CLLocationDistance = 10 12 let DEFAULT_DISTANCE : CLLocationDistance = 10 13 14 private var addedLayers = [CAShapeLayer]() 15 var center: CLLocationCoordinate2D! 16 var rendere = 0 17 let LINE_1 = 1 18 let CIRCLE = 3 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 23 let maxWidth : CGFloat = self.view.bounds.width 24 let maxHeight: CGFloat = self.view.bounds.height 25 26 myMapView = MKMapView() 27 myMapView.frame = self.view.frame(forAlignmentRect: CGRect(x: 0.0, y: 20.0 + 50.0, width: maxWidth, height: maxHeight - 20.0 - 50.0 - 50.0)) 28 myMapView.delegate = self 29 myMapView.setCenter(self.myMapView.userLocation.coordinate, animated: true) 30 myMapView.setUserTrackingMode(.none, animated: true) 31 myMapView.showsUserLocation = true 32 view.addSubview(self.myMapView) 33 34 imHearBtn = UIButton() 35 imHearBtn.frame = CGRect(x: maxWidth / 5.0 * 1.0, y: maxHeight - 50.0, width: maxWidth / 5.0, height: 50.0) 36 imHearBtn.backgroundColor = UIColor.green 37 imHearBtn.layer.cornerRadius = 10.0 38 imHearBtn.setTitle("現在地", for: .normal) 39 imHearBtn.tag = 3 40 imHearBtn.addTarget(self, action: #selector(ViewController.onClickMyButton(sender:)), for: .touchUpInside) 41 self.view.addSubview(imHearBtn) 42 43 myLocationManager = CLLocationManager() 44 myLocationManager.delegate = self 45 myLocationManager.distanceFilter = 100.0 46 myLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters 47 48 myLocationManager.startUpdatingLocation() 49 50 let status = CLLocationManager.authorizationStatus() 51 52 if(status != CLAuthorizationStatus.authorizedWhenInUse){ 53 print("not determined") 54 myLocationManager.requestWhenInUseAuthorization() 55 56 } 57 58 arcCircle(startRagian: 0.0, endRagian: 90.0, radius: 50, red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0, lineWidth: 20.0) 59 arcCircle(startRagian: 0.0, endRagian: 90.0, radius: 40, red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0, lineWidth: 18.0) 60 61 } 62 63 func arcCircle(startRagian:CGFloat, endRagian:CGFloat, radius:CGFloat, red:CGFloat, green:CGFloat, blue:CGFloat, alpha:CGFloat, lineWidth:CGFloat){ 64 65 let pi = CGFloat(Double.pi) 66 let start:CGFloat = pi / 180.0 * startRagian // 開始の角度 67 let end : CGFloat = pi / 180.0 * endRagian// 終了の角度 68 69 let center = CGPoint(x: self.view.frame.width / 2.0, y: self.view.frame.height / 2.0 + 10) 70 let path: UIBezierPath = UIBezierPath(); 71 path.move(to: center) 72 path.addArc(withCenter: CGPoint(x: self.view.frame.width/2, y:self.view.frame.height/2 + 10.0), radius: radius, startAngle: start, endAngle: end, clockwise: true) // 円弧 73 74 let layer = CAShapeLayer() 75 layer.fillColor = UIColor(red: red, green: green, blue: blue, alpha: alpha).cgColor 76 layer.path = path.cgPath 77 layer.lineWidth = lineWidth 78 self.view.layer.addSublayer(layer) 79 80 self.addedLayers.append(layer) 81 } 82 83 // GPSから値を取得した際に呼び出されるメソッド. 84 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 85 86 // 配列から現在座標を取得. 87 let myLocations: NSArray = locations as NSArray 88 let myLastLocation: CLLocation = myLocations.lastObject as! CLLocation 89 let myLocation:CLLocationCoordinate2D = myLastLocation.coordinate 90 91 // Regionを作成. 92 let myRegion: MKCoordinateRegion = MKCoordinateRegionMakeWithDistance(myLocation, myLatDist, myLonDist); 93 94 // MapViewに反映. 95 myMapView.setRegion(myRegion, animated: true) 96 97 // 直線を引く座標を作成 98 let coordinate1 = CLLocationCoordinate2D(latitude: myLocation.latitude, longitude: myLocation.longitude) 99 let coordinate2 = CLLocationCoordinate2D(latitude: myLocation.latitude, longitude: 0.0) 100 let coordinate3 = CLLocationCoordinate2D(latitude: myLocation.latitude, longitude: -180.0) 101 let coordinate4 = CLLocationCoordinate2D(latitude: 0.0, longitude: myLocation.longitude) 102 let coordinate5 = CLLocationCoordinate2D(latitude: 90.0, longitude: myLocation.longitude) 103 104 // 座標を配列に格納 105 var coordinates_1 = [coordinate1, coordinate2] 106 var coordinates_2 = [coordinate1, coordinate3] 107 var coordinates_3 = [coordinate1, coordinate4] 108 var coordinates_4 = [coordinate1, coordinate5] 109 110 //polyline作成 111 let myPolyLine_1:MKPolyline = MKPolyline(coordinates: &coordinates_1, count: coordinates_1.count) 112 let myPolyLine_2:MKPolyline = MKPolyline(coordinates: &coordinates_2, count: coordinates_2.count) 113 let myPolyLine_3:MKPolyline = MKPolyline(coordinates: &coordinates_3, count: coordinates_3.count) 114 let myPolyLine_4:MKPolyline = MKPolyline(coordinates: &coordinates_4, count: coordinates_4.count) 115 116 // 円を描く 117 // 地図の中心の座標. 118 center = CLLocationCoordinate2DMake(myLocation.latitude, myLocation.longitude) 119// var center2 : CLLocationCoordinate2D! 120// center2 = CLLocationCoordinate2D(latitude: myLocation.latitude , longitude: myLocation.longitude) 121 122 // 縮尺を設定. 123 let mySpan: MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: 0.02, longitudeDelta: 0.02) 124 let myRegions: MKCoordinateRegion = MKCoordinateRegion(center: center, span: mySpan) 125 126 // regionをmapViewに追加. 127 myMapView.region = myRegions 128 129 // 円を描画する(半径1000m). 130 let myCircle_1: MKCircle = MKCircle(center: center, radius: CLLocationDistance(1000)) 131 132 // mapViewにlineを追加. 133 134 rendere = LINE_1 135 myMapView.add(myPolyLine_1) 136 myMapView.add(myPolyLine_2) 137 myMapView.add(myPolyLine_3) 138 myMapView.add(myPolyLine_4) 139 140 // myMapViewにcircleを追加 141 rendere = CIRCLE 142 myMapView.add(myCircle_1) 143 myMapView.setRegion(myRegions, animated: true) 144 } 145 146 // Regionが変更された時に呼び出されるメソッド. 147 func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 148 } 149 150 151 // addした際に呼ばれるデリゲートメソッド 152 func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { 153 if (rendere == LINE_1) { 154 // rendererを生成. 155 let myPolyLineRendere: MKPolylineRenderer = MKPolylineRenderer(overlay: overlay) 156 157 // 線の太さを指定. 158 myPolyLineRendere.lineWidth = 2.0 159 160 // 線の色を指定. 161 myPolyLineRendere.strokeColor = UIColor.red 162 163 return myPolyLineRendere 164 165 } else { //if (rendere == CIRCLE) { 166 167 // rendererを生成. 168 let myCircleView: MKCircleRenderer = MKCircleRenderer(overlay: overlay) 169 170 // 円の内部を赤色で塗りつぶす. 171// myCircleView.fillColor = UIColor(red: 0.0, green:1.0, blue: 1.0, alpha: 0.3) 172 173 // 円周の線の色を黒色に設定. 174 myCircleView.strokeColor = UIColor.darkGray 175 176 // 円を透過させる. 177 myCircleView.alpha = 1.0 178 179 // 円周の線の太さ. 180 myCircleView.lineWidth = 2.0 181 182 return myCircleView 183 } 184 } 185 186 func removeAllSubviews(parentView: UIView){ 187 let subviews = parentView.subviews 188 for subview in subviews { 189 subview.removeFromSuperview() 190 } 191 } 192 193 func onClickMyButton(sender: UIButton) { 194 195 if (sender.tag == 3){ 196 197 myLatDist = CLLocationDistance(DEFAULT_DISTANCE) 198 myLonDist = CLLocationDistance(DEFAULT_DISTANCE) 199 var cr:MKCoordinateRegion = myMapView.region 200 cr.span.latitudeDelta = cr.center.latitude 201 cr.span.longitudeDelta = cr.center.longitude 202 let myCoordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(cr.span.latitudeDelta, cr.span.longitudeDelta) 203 let myRegion: MKCoordinateRegion = MKCoordinateRegionMakeWithDistance(myCoordinate, CLLocationDistance(myLatDist), CLLocationDistance(myLonDist)) 204 myMapView.setRegion(myRegion, animated: true) 205 206 myMapView.userTrackingMode = MKUserTrackingMode.follow 207 myMapView.userTrackingMode = MKUserTrackingMode.none 208 myMapView.setCenter(myMapView.userLocation.coordinate, animated: true) 209 210 removeAllSubviews(parentView: myMapView) 211 212 self.addedLayers.forEach { 213 $0.removeFromSuperlayer() 214 } 215 viewDidLoad() 216 } 217 } 218 219 override func didReceiveMemoryWarning() { 220 super.didReceiveMemoryWarning() 221 // Dispose of any resources that can be recreated. 222 } 223}

長いリストになりますが、お願い致します。

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

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

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

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

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

guest

回答1

0

単に上にUIViewを重ねて、そこに描画するのはどうでしょうか。userIntaractionEnabledをfalseにしておけばタッチイベントが吸収されてしまうこともないはずです。

投稿2017/08/17 10:01

YokemuraTakeshi

総合スコア297

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問