(iOS 5およびXcode 4.2を使用)
MKMapViewがあり、ユーザーの場所を中心に半径1000mの円を描きたい。
表面的には、 mapView:viewForAnnotation: マップビューデリゲートメソッドを実装し、ユーザーの場所にカスタムMKAnnotationViewを追加することが完璧なソリューションのようです。次のようになります。
- (MKAnnotationView *)mapView:(MKMapView *)mapView
viewForAnnotation:(id <MKAnnotation>)annotation
{
// If it's the user location, return my custom MKAnnotationView.
if ([annotation isKindOfClass:[MKUserLocation class]]) {
return myCustomAnnotationView;
} else {
return nil;
}
}
ただし、マップの注釈は、マップをズームインおよびズームアウトしても拡大縮小されません。
そこで、 MKCircle クラスを使用して、オーバーレイを追加してみました(オーバーレイは地図に合わせて拡大するため)、その座標をlocationManger/mapビューデリゲートからの最新の座標に設定しましたただし、MKCircleの coordinate property は読み取り専用なので、オーバーレイを削除してから、ユーザーが移動するたびに新しいオーバーレイを追加する必要があります。目立つフリッカーが発生する原因。
マップビューの拡大縮小に合わせて、アノテーションをシームレスに拡大縮小する方法はありますか?または、ユーザーの場所の変更に合わせてオーバーレイをシームレスに移動する良い方法はありますか?
私はあなたの助けにとても感謝します:)
カスタムオーバーレイを試してください。これをviewDidLoadに追加します。
MKCircle *circle = [MKCircle circleWithCenterCoordinate:userLocation.coordinate radius:1000];
[map addOverlay:circle];
userLocationは、MKUserLocationAnnotationをプロパティとして保存することで取得できます。次に、実際に円を描くには、これをマップビューのデリゲートに配置します。
- (MKOverlayRenderer *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay
{
MKCircleRenderer *circleView = [[MKCircleRenderer alloc] initWithOverlay:overlay];
circleView.strokeColor = [UIColor redColor];
circleView.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.4];
return circleView;
}
Swiftを使用したiOS 8.0の更新バージョン。
import Foundation
import MapKit
class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate{
var locationManager: CLLocationManager = CLLocationManager()
@IBOutlet var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
// We use a predefined location
var location = CLLocation(latitude: 46.7667 as CLLocationDegrees, longitude: 23.58 as CLLocationDegrees)
addRadiusCircle(location)
}
func addRadiusCircle(location: CLLocation){
self.mapView.delegate = self
var circle = MKCircle(centerCoordinate: location.coordinate, radius: 10000 as CLLocationDistance)
self.mapView.addOverlay(circle)
}
func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
if overlay is MKCircle {
var circle = MKCircleRenderer(overlay: overlay)
circle.strokeColor = UIColor.redColor()
circle.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1)
circle.lineWidth = 1
return circle
} else {
return nil
}
}
}
Swift 3/Xcode 8はこちら:
func addRadiusCircle(location: CLLocation){
if let poll = self.selectedPoll {
self.mapView.delegate = self
let circle = MKCircle(center: location.coordinate, radius: 10)
self.mapView.add(circle)
}
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if overlay is MKCircle {
let circle = MKCircleRenderer(overlay: overlay)
circle.strokeColor = UIColor.red
circle.fillColor = UIColor(red: 255, green: 0, blue: 0, alpha: 0.1)
circle.lineWidth = 1
return circle
} else {
return MKPolylineRenderer()
}
}
その後、次のように呼び出します:
self.addRadiusCircle(location: CLLocation(latitude: YOUR_LAT_HERE, longitude: YOUR_LNG_HERE))
Apple Breadcrumbの例 のコードを使用してみてください
ベンワッドの答えが分からなかった。 つまり、ここではより明確な答えです :
円を追加するのはとても簡単です。 MKMapViewDelegateに準拠
@interface MyViewController : UIViewController <MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@end
ViewDidLoadで、円注釈を作成してマップに追加します。
CLLocationCoordinate2D center = {39.0, -74.00};
// Add an overlay
MKCircle *circle = [MKCircle circleWithCenterCoordinate:center radius:150000];
[self.mapView addOverlay:circle];
次に、mapView:viewForOverlay:を実装して、ビューを返します。
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay];
[circleView setFillColor:[UIColor redColor]];
[circleView setStrokeColor:[UIColor blackColor]];
[circleView setAlpha:0.5f];
return circleView;
}
ただし、ズームレベルに関係なく、円を常に同じサイズにしたい場合は、別の操作を行う必要があります。あなたが言うように、regionDidChange:animated:で緯度デルタを取得してから、新しい円を作成し(半径が幅に収まる)、古い円を削除して新しい円を追加します。
私からの注意:mapviewをView Controllerデリゲートに接続することを忘れないでください。そうでない場合、viewForOverlayは呼び出されません。
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
iOS 4.0以降では非推奨です
サークルを追加するのは簡単です。 MKMapViewDelegateに準拠します。以下の手順に従ってください、
ステップ1 :
CLLocationCoordinate2D center= {self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude};
// Add an overlay
MKCircle *circle= [MKCircle circleWithCenterCoordinate:center radius: 20000];//your distance like 20000(like meters)
[myMapView addOverlay:circle];
ステップ2 :
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
MKCircleView *C_View = [[MKCircleView alloc] initWithOverlay:overlay];
[C_View setFillColor:[UIColor lightGrayColor]];
[C_View setStrokeColor:[UIColor blackColor]];
[C_View setAlpha:0.5f];
return C_View;
}