标签: mapkit

转到/缩放到当前位置功能(MapKit)

我有一个mapView,使用viewDidLoad以下内容放大到当前位置:

#define METERS_PER_MILE 1609.344

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];

    mapView.showsUserLocation=TRUE;

    // zoom to  a specific area
    CLLocationCoordinate2D zoomLocation;
    zoomLocation.latitude = -28.994167;
    zoomLocation.longitude = 134.866944;

    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 1900*METERS_PER_MILE, 1900*METERS_PER_MILE);
    MKCoordinateRegion adjustedRegion = [mapView regionThatFits:viewRegion];    

    // make sure the Google water mark is always visible
    mapView.autoresizingMask =
    (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);

    [mapView setRegion:adjustedRegion animated:YES];        

    mapView.delegate=self;

    searchBar.delegate = self;
}
Run Code Online (Sandbox Code Playgroud)

这很好用.我添加了一个搜索栏和一个跳转到特定地址位置的函数.这也很好.我现在想要添加一个按钮来跳回当前位置.你能帮我一把吗?

干杯

iphone xcode mapkit currentlocation

8
推荐指数
1
解决办法
2万
查看次数

setNeedsDisplayInMapRect不会触发新的drawMapRect:call

我正在使用自定义功能MKOverlay/MKOverlayView用我自己的磁贴完全覆盖Google底图,这些磁贴是异步加载的.当我收到canDrawMapRect:zoomScale:对覆盖视图的调用(并在这种情况下返回FALSE)时,我遵循请求卸载的tile的模式,然后setNeedsDisplayInMapRect:zoomScale:在tile可用时调用.

这一切通常都有效,并且似乎在模拟器中完美运行.

然而,在设备上我有时会在覆盖层中出现一个"洞" - 缺少一块瓷砖.

我可以看到请求了磁贴,并且请求完成了.我可以看到我打电话setNeedsDisplayInMapRect:zoomScale:,而我传递原来MKMapRectMKZoomScale它是在提供canDrawMapRect:zoomScale:.但我也可以看到覆盖层永远不会被要求重绘那个图块(既canDrawMapRect:zoomScale:不会drawMapRect:zoomScale:inContext:也不会再次调用该图块).

我需要了解为什么会发生这种情况以及如何纠正它.

这是我的MKOverlayView子类的相关代码:

- (BOOL) canDrawMapRect: (MKMapRect) mapRect zoomScale: (MKZoomScale) zoomScale 
{
    NSUInteger zoomLevel = [self zoomLevelForZoomScale:zoomScale];
    CGPoint mercatorPoint = [self mercatorTileOriginForMapRect:mapRect];
    NSUInteger tilex = floor(mercatorPoint.x * [self worldTileWidthForZoomLevel:zoomLevel]);
    NSUInteger tiley = floor(mercatorPoint.y * [self worldTileWidthForZoomLevel:zoomLevel]);

    NSURL* tileUrl = [self tileURLForZoomLevel: zoomLevel tileX: tilex tileY: tiley];

    ASIHTTPRequest* tileRequest = [ASIHTTPRequest requestWithURL: tileUrl];
    tileRequest.downloadCache = [ASIDownloadCache sharedCache];
    [tileRequest …
Run Code Online (Sandbox Code Playgroud)

mapkit mkmapview ios mkoverlay

8
推荐指数
1
解决办法
2731
查看次数

滚动/缩放时是否可以连续跟踪MKMapView区域?

当用户在地图上放大或滚动时,我想连续更新我的UI,根据MKMapView.(不仅在滚动结束后,工作正常.)

我尝试了委托方法mapView:regionWillChangeAnimated:根据文档,"只要当前显示的地图区域发生变化就会调用.在滚动期间,可以多次调用此方法来报告地图位置的更新." http://developer.apple.com/library/ios/#DOCUMENTATION/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    [self updateUIAcordingToMapViewRegionChange];
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这不起作用,因为文档似乎没有说实话.该方法仅在区域变化的最开始时调用一次.在滚动期间,当手指向下并四处移动时,永远不会再次调用该方法.

我能找到的关于这个问题的唯一帖子是由macrumors成员namanhams:http://forums.macrumors.com/showthread.php?t = 1225172 但是没有人想出任何想法......

作为一种解决方法,我尝试在regionWillChange中设置一个计时器(并在regionDidChange中使其无效):

- (void)handleRegionChange:(NSTimer*)timer
{
   [self updateUIAcordingToMapViewRegionChange];
} 

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    self.mapRegionIsChangingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                    target:self
                                                  selector:@selector(handleRegionChange:)
                                                  userInfo:nil
                                                   repeats:YES];
}
Run Code Online (Sandbox Code Playgroud)

但这也行不通.来自计时器的所有方法调用都在滚动结束后立即执行.似乎滚动mapView阻止主线程或其他东西......

我也在stackoverflow上阅读了这篇文章,但遗憾的是并没有完全理解它: 监视MKMapView重绘事件 所以如果我的问题的解决方案确实存在于那个SO线程中,请告诉我,我试着深入研究它的细节.

我仍然希望我只是太愚蠢或太盲目无法找到正确的委托方法,并且非常感谢处理MKMapView区域跟踪的任何提示,变通方法和最佳实践.

谢谢!

mapkit mkmapview ios

8
推荐指数
1
解决办法
2897
查看次数

对MKOverlayPathView进行子类化以创建MKPolylineView

有没有人试图进行子类化MKOverlayPathView,以便基本上MKPolylineView通过更多控制路径绘图来重新创建?如果是这样,你愿意分享一些示例代码吗?

我想MKPolyline在地图视图上绘制一个但是MKPolylineView没有提供足够的灵活性来绘制路径.例如,我想在线上添加笔划和高亮显示,就像在地图应用中看到的路线一样.

在此输入图像描述

mapkit ios

8
推荐指数
1
解决办法
1137
查看次数

定位自定义MKAnnotationView

我创建一个自定义MKAnnoationView如下:

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
    MKAnnotationView* customPinView = [[MKAnnotationView alloc]
                                           initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];

    UIImage *pinImage = [PowerPlantAnnotation getAnnotationImageForEnergySource:((PowerPlantAnnotation*)annotation).energySource];
    customPinView.image = pinImage;
    return customPinView;
}
Run Code Online (Sandbox Code Playgroud)

我得到的图像或多或少位于正确的位置,但并不完全.我的图片看起来像这样:

在此输入图像描述

我希望泪滴的底点指向我的注释贴图坐标,就像标准的针脚视图指向地图坐标一样.我怎么能做到这一点?目前看起来更像是我的图像以地图坐标为中心.

mapkit mkannotation mkannotationview ios

8
推荐指数
1
解决办法
1526
查看次数

obj-c将c-struct添加到字典中

我很难将C-struct添加到NSDictionary中.
C-struct是MapKit.h上的MKCoordinateRegion.

那个宣言是

typedef struct {
    CLLocationCoordinate2D center;
    MKCoordinateSpan span;
} MKCoordinateRegion;
Run Code Online (Sandbox Code Playgroud)

和CLLocationCoordinate2D的声明是

typedef struct {
    CLLocationDegrees latitude;
    CLLocationDegrees longitude;
} CLLocationCoordinate2D;
Run Code Online (Sandbox Code Playgroud)

MKCoordinateSpan是一样的.

现在,我想将MKCoordinateRegion添加到NSDictionary.

    CLLocationCoordinate2D center = CLLocationCoordinate2DMake(40.723128, -74.000694);
    MKCoordinateSpan span = MKCoordinateSpanMake(1.0, 1.0);
    MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
    NSMutableDictionary *param = [[NSMutableDictionary alloc] init];
    [param setObject:region forKey:@"region"];
Run Code Online (Sandbox Code Playgroud)

5行有错误.
错误消息是"将'MKCoordinateRegion'发送到不兼容类型'id'的参数"

谢谢.

iphone struct dictionary objective-c mapkit

8
推荐指数
1
解决办法
3054
查看次数

显示MKMap View附近的餐馆

在我的iPhone应用程序中,我必须在地图视图中显示附近的餐馆,目前我在网络视图中使用谷歌地图网址.

但是,我怎样才能在5000米的当前位置显示附近的餐馆,并使用原生的MKMap视图(我发现了我当前的位置-lat&long)

我想学习如何在下面的屏幕截图中实现(通过单击注释到其详细信息)

有帮助?? 提前致谢

在此输入图像描述

iphone mapkit mkmapview ios

8
推荐指数
1
解决办法
1万
查看次数

应用自动调整大小时,iOS8 MKMapView Framebuffer在旋转期间出错

#import "AppDelegate.h"
#import <MapKit/MapKit.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:   (NSDictionary *)launchOptions
{
    [self setWindow:[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]];
    [self.window makeKeyAndVisible];

    UIViewController *vc = [[UIViewController alloc] init];
    self.window.rootViewController = vc;
    vc.view.autoresizingMask = UIViewAutoresizingFlexibleWidth |    UIViewAutoresizingFlexibleHeight;

    MKMapView *map = [[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    map.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    [vc.view addSubview:map];

    return YES;
}

@end
Run Code Online (Sandbox Code Playgroud)

要查看问题,请运行上面的代码并旋转设备.您将体验旋转动画的显着延迟.

如果您连接iOS8 iPad并运行模拟器,您将收到以下警告:

崩溃!0x15dd7980
错误/SourceCache/VectorKit/VectorKit-992.16/GeoGL/GeoGL/GLCoreContext.cpp 1237:帧缓冲不完整,附件不完整

有谁知道如何解决这个问题?

framebuffer autoresize mapkit ios8

8
推荐指数
1
解决办法
762
查看次数

iOS - 问题创建自定义MKAnnotation标注

我有一些问题造型我的MKAnnotation标注泡沫.最初我有一个标准标注,包括标题,副标题和leftCalloutAccessoryView.这创建了以下标注:

在此输入图像描述

这个工作正常,直到确定字幕还应包含一系列五个图像,显示业务在用户评论中的平均评分.这是通过创建一个单独的视图并将其作为传递来完成的detailCalloutAccessoryView.这产生了以下标注泡泡:

在此输入图像描述

出于某种原因,当视图传递给detailCalloutAccessoryViewcallout视图时,所有UI组件周围都会出现一个奇怪的边框,这会leftCalloutAccessoryView在标题和副标题之间创建不需要的空格.如何删除此空格?我希望业务在字幕内的平均值和标题与之间的适当间距detailCalloutAccessoryView.怎么能实现这一目标?是否可以在不创建callout从头开始的情况下这样做?

mapkit mkmapview mkannotation ios ios9

8
推荐指数
1
解决办法
540
查看次数

在地图上显示用户位置 SwiftUI

我正在尝试加载地图并在用户位置上显示初始位置,并使用 SwiftUI 在地图上显示用户的位置。我不知道如何在 SwiftUI 中做到这一点。

我试图将 'view.showsUserLocation = true' 放在 updateUIView 函数中,但它不起作用。

import SwiftUI
import MapKit
struct MapView : UIViewRepresentable {
    func makeUIView(context: Context) -> MKMapView {
        MKMapView(frame: .zero)
    }

    func updateUIView(_ view: MKMapView, context: Context) {
        view.showsUserLocation = true
        let coordinate = CLLocationCoordinate2D(
            latitude: 34.011286, longitude: -116.166868)
        let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)

        let region = MKCoordinateRegion(center: view.userLocation.location?.coordinate ?? coordinate, span: span)
        view.setRegion(region, animated: true)
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试打印它时,该位置为零。

mapkit swift swiftui

8
推荐指数
1
解决办法
8370
查看次数