在iOS 4之前,我曾经为每个添加一个观察者MKAnnotationView添加到地图视图中,监听它的选择方法,所以我知道用户何时点击了一个引脚.
这适用于iOS 4.2.我注意到在发布时注意到注释视图实际上正在被重用,并且它在某种程度上与观察者混淆.
所以我想我可以-mapview:didSelectAnnotationView:根据MKMapViewDelegate我的需要使用该方法,但这只是添加到iOS 4.0 SDK中.
因此,为了保持兼容性,我想在我的委托上实现这个方法,并有条件地检查MKMapViewDelegate协议上是否存在此方法,这样如果它不存在,我会将我的观察者添加到注释视图中.
我怎样才能为协议方法执行此操作,类似于我们如何检查类是否为零?
更新:
正如Daniel Dickison指出的那样,我无法使用respondsToSelector:,因为我的代表已经-mapview:didSelectAnnotationView:实现了4.0+设备.我需要的是检查该设备上的协议是否具有可选-mapview:didSelectAnnotationView:方法或是否MKMapView将在其委托上查找该方法.
我最终对当前运行的iOS版本进行了测试.如果它高于4.0,MKMapView将查找该方法并调用它.
if ([[[UIDevice currentDevice] systemVersion] doubleValue] < 4.0)
[self setupObserver];
Run Code Online (Sandbox Code Playgroud)
这解决了原始问题,但以某种方式检查方法的实际协议仍然很有趣.
- 更新了新发现 - 在模拟器和设备上进行了测试.从冷启动运行应用程序时,无法正确加载地图.瓷砖没有显示.
mapViewDidFinishLoadingMap没有被召唤.因此,地图不能完成会出错,但我没有错误.
如果我只是简单地退出应用程序然后再次进入,地图就可以正常加载.这意味着如果从后台打开应用程序,则会加载地图.
有什么想法有什么变化吗?在iOS 10中工作得很好.
更新
在iOS 11 mapViewWillStartLocatingUser中被调用但不是mapViewWillStartRenderingMap.我想知道是否必须手动调用某些内容才能启动地图渲染.在iOS 9中(我测试的是什么,并且它运行得很好)mapViewWillStartRenderingMap之前被调用过mapViewWillStartLocatingUser
添加MapKit和CoreLocation框架后,我无法构建我的应用程序.它们都是4.3框架,用于与UIKit,CoreGraphics和Foundation一起工作的应用程序,只是给我这两个问题.不确定所需的架构是什么,代码中没有任何错误.任何帮助表示赞赏!
ld: warning: ignoring file /Users/F3d3r3r/Desktop/testNav4_3/MapKit.framework/MapKit, missing required architecture i386 in file
ld: warning: ignoring file /Users/F3d3r3r/Desktop/testNav4_3/CoreLocation.framework/CoreLocation, missing required architecture i386 in file
Undefined symbols for architecture i386:
"_CLLocationCoordinate2DMake", referenced from:
-[Layer2 tableView:cellForRowAtIndexPath:] in Layer2.o
"_OBJC_CLASS_$_MKMapView", referenced from:
objc-class-ref in Layer2.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud) 我不久前开发了一款游戏.游戏包含西班牙地图,你必须猜测一个城市在该地图上的位置(我也有EEUU和中国版本)我用iOS 5基础开发所有这些,并使用iOS 5 sdk.
然后,3周前我更新了西班牙语游戏,我不得不使用iOS 6 sdk,在模拟器和我的ipad 2(iOS 5.0.1)和iPod touch(iOS 5.1)上看起来都很好,并发布了更新.
但是当人们开始下载或更新新版本时,他们中的一些人联系了我,因为地图不适合屏幕.
这是我如何在我的设备和模拟器上看到游戏的屏幕截图.(视听和普通模式下的iPad 5.0.1和5.0,6.0和6.1的模拟器)

这是如何在其他人设备上显示的屏幕截图.(带有iOS 6.0的iPad 3和带有iOS 6.0.1的iPad 2)

这是我的iPad代码(据我所知,iPhone正在按预期工作)
CLLocationCoordinate2D centerLocation;
MKCoordinateRegion region;
centerLocation.latitude = 39.016740;
centerLocation.longitude = -5.93504;
region = MKCoordinateRegionMakeWithDistance(centerLocation, 0, 800000);
[map setRegion:region];
Run Code Online (Sandbox Code Playgroud)
起初我认为这是一个视网膜问题,因为第一个联系我的人使用的是iPad 3,我在星期一修复了iPad视网膜的地图,但昨天我收到了来自另一个用iPad 2的用户的相同信息.
那么,我做错了什么?是iOS版本之间的setRegion不一致吗?如果它在模拟器上工作正常,我该如何测试我的代码?
有人可以在真实设备上尝试我的代码并告诉我他们是否像第一个或第二个那样获得地图?
编辑1: 接受答案后的最终想法:这不是iOS版本之间的问题,它似乎是一个计时问题,如果您在视图出现之前或之后设置它,该区域是不同的.它发生在iOS 5和iOS 6中.
iOS 5和iOS 6之间的唯一区别发生在真实设备上,如果您在地图出现之前设置区域,它会保持原样,但在模拟器上的iOS 6上它将保持不变,但在真实设备上,它将显示为视图出现时设置的区域.
因此,解决方案是设置区域viewDidAppear,它将在iOS 5和iOS 6上以相同的方式显示在模拟器和真实设备上.
编辑2:
似乎区域上的0也与问题有关,如果我使用region = MKCoordinateRegionMakeWithDistance(centerLocation, 800000, 800000);区域在视图加载之前和之后是相同的,至少在模拟器上.如果我使用region = MKCoordinateRegionMakeWithDistance(centerLocation, 0, 800000);该区域是不同的,如果我在视图加载之前使用它,并在我稍后使用时显示"缩放".
我会等到我收到iOS6的iPad视网膜以继续测试这个问题.
在我今年早些时候提出的SO问题中,我得到了这段代码:
MKPolygonView *polygonView = (MKPolygonView *)[self.mapView viewForOverlay:polygon];
MKMapPoint mapPoint = MKMapPointForCoordinate(tapCoord);
CGPoint polygonViewPoint = [polygonView pointForMapPoint:mapPoint];
if (CGPathContainsPoint(polygonView.path, NULL, polygonViewPoint, FALSE)) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这在iOS7之前很有用.它现在总是返回false,并且不会检测带路径的点.
我正在尝试找到任何说明该方法更改的文档,但找不到任何文档.
任何想法为什么它破了?还是新的解决方案?
我想知道是否可以从地图套件中删除所有默认图标.我做了很多研究,尝试了几种不同的方法.无法找到任何方法来做到这一点.不知道是否有人可以帮助我们.

我正在使用MapKit来显示位置之间的方向,我正在寻找一种方法来添加一个与Apple Maps应用程序中的路径注释类似的注释,其中注释显示每条路线的旅行时间(如图所示)下面).我已经正确地绘制了方向,手头的问题是如何计算沿路线的一对坐标.也就是说,在哪里删除注释.
我想过以某种方式使用MKDirection(包含完整的方向,一步一步),但我不确定如何生成一对位于路线中间某处的坐标.
我在MapKit文档中找不到任何形式的支持.有任何想法吗?

这是我生成路线并显示它的方式.
- (void)generateRoute {
MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
request.source = [MKMapItem mapItemForCurrentLocation];
request.destination = self.destinationMapItem;
MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
[directions calculateDirectionsWithCompletionHandler:
^(MKDirectionsResponse *response, NSError *error) {
if (error) {
// Handle Error
} else {
[self showRoute:response];
}
}];
}
- (void)showRoute:(MKDirectionsResponse *)response {
[self.mapView removeOverlays:self.mapView.overlays];
for (MKRoute *route in response.routes)
{
[self.mapView addOverlay:route.polyline level:MKOverlayLevelAboveRoads];
}
[self fitRegionToRoute];
}
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id < MKOverlay >)overlay
{
MKPolylineRenderer *renderer …Run Code Online (Sandbox Code Playgroud) 我已经从采用大多数的概念从MKlocalSearch苹果的示例代码做了一个实现此
目前,对于自动完成,每次用户在搜索栏内输入时,我都会在我指定的位置发送新请求:
MkLocalSearchRequest.naturalLanguageQuery = searchBar.text
MkLocalSearchRequest.region = userlocation.region
Run Code Online (Sandbox Code Playgroud)
但是,与Apple的默认地图应用程序相比,我得到了与服务器完全不同的响应集,如下图所示

然后我捕获流量并发现我的请求转到https://gsp-ssl.ls.apple.com/search.arpc而Apple转到 https://gsp-ssl.ls.apple.com/auto_complete.arpc
有没有办法调整MkLocalSearchRequest以获得相同的响应对象集?
我是swift(一般的iOS编程)的新手,我正在试图弄清楚如何缩放地图以适应地图上的2个点.
目前我有
var zoomRect = MKMapRectNull;
var myLocationPointRect = MKMapRectMake(myLocation.longitude, myLocation.latitude, 0, 0)
var currentDestinationPointRect = MKMapRectMake(currentDestination.longitude, currentDestination.latitude, 0, 0)
zoomRect = myLocationPointRect;
zoomRect = MKMapRectUnion(zoomRect, currentDestinationPointRect);
Run Code Online (Sandbox Code Playgroud)
什么也没做.
我必须以zoomRect某种方式申请地图吗?
我一直在使用第三方库来处理标记聚类.由于iOS 11有自己的实现,我决定继续代表"本机"实现移除第三方库.
我已经从WWDC 2017下载了示例应用程序,并按照相同的步骤操作,因此:
MKMapView插座MKAnnotation为我的模型实现协议MKMarkerAnnotationViewfor marker的视图MKMarkerAnnotationViewfor cluster的视图_:forAnnotationViewWithReuseIdentifier:)函数在mapView引用上注册两个注释但是,在使用第三方库时,一切都很好,使用这种方法,当我平移我的mapView并更改区域时,我的性能非常差.CPU使用率提升高达90%,而内存似乎保持稳定,我感觉延迟移动,有时甚至是应用程序崩溃.我正在加载大约600个注释.
有什么建议吗?
这是代码:
class MapViewClusteringViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
private var databaseService: LocalDataService!
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
mapView.register(StopMarker.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)
mapView.register(StopCluster.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultClusterAnnotationViewReuseIdentifier)
databaseService.fetchMarkers { markers in
mapView.addAnnotation(markers)
}
}
}
class StopMarker: MKMarkerAnnotationView {
override var annotation: MKAnnotation? {
willSet {
clusteringIdentifier = "busStopCluster"
subtitleVisibility = .adaptive
markerTintColor = .red …Run Code Online (Sandbox Code Playgroud)