我有一个带有调用的MKMapView的视图控制器
[self.mapView setRegion:region animated:YES];
Run Code Online (Sandbox Code Playgroud)
将地图从A重新定位到B.
保存MKMapView的视图控制器被设置为委托和in
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
Run Code Online (Sandbox Code Playgroud)
我有一些代码会触发另一个setRegion:animated:到MKMapView,以便地图自动放大新位置.
如果我popViewControllerAnimated,一切正常:视图控制器在MKMapView动画完成平移和缩放之后.
但是,当我尝试popViewControllerAnimated时:当前视图控制器在MKMapView运行它的动画时,应用程序崩溃,"消息发送到解除分配的实例".
从调试器的外观来看,我认为MKMapView正试图从弹出和释放的委托中调用一个方法.
所以我试过了
[self.mapView setDelegate:nil];
self.mapView = nil;
Run Code Online (Sandbox Code Playgroud)
在viewDidUnload中没有运气.该应用程序仍然一直崩溃.
我能想到的唯一的事情是创建一个单独的新的委托类和保留从父视图控制器类,以便将的MKMapView有一个代表包含它的视图控制器被释放后还要打电话.
为什么会这样?还有其他"干净"的选择吗?
我创建了一个测试应用程序,只有一个包含MKMapView的视图和一个充当MapView委托的控制器.
当我进行全新构建(在重新安装之前完全从设备中删除)并记录回调时,我可以看到mapView:didUpdateUserLocation在用户指示是否希望显示其当前位置之前调用两次.
传递给回调的MKUserLocation对象无效:
2012-03-13 08:20:17.518 MapTest[3325:707] Did update user location: 0.000000,0.000000
2012-03-13 08:20:17.581 MapTest[3325:707] Did update user location: 0.000000,0.000000
Run Code Online (Sandbox Code Playgroud)
这是MKMapKit或bug的预期行为吗?
我在我的iPhone 4上运行它,而不是模拟器.这是控制器代码:
#import "ViewController.h"
@implementation ViewController
@synthesize mapView;
- (void)viewDidLoad
{
[super viewDidLoad];
self.mapView.showsUserLocation = YES;
self.mapView.delegate = self;
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}
-(IBAction)trackButtonTapped:(id)sender
{
self.mapView.showsUserLocation = !self.mapView.showsUserLocation;
}
#pragma mark - MKMapKitDelegate
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
NSLog(@"Did update user location: %f,%f", userLocation.coordinate.latitude, userLocation.coordinate.longitude); …Run Code Online (Sandbox Code Playgroud) 我正在使用mapView,并且当您单击地图上显示的图钉时,我正在尝试弹出标注.
引脚设置在适当的位置,所以我认为注释有效但当我点击引脚时它不会显示标注.我有show callout = YES.
didSelectAnnotationView单击引脚时,根本不会调用该方法.
是否存在一些可能导致此方法无法调用的常见问题?
我的问题很简单:我正在等待获取MKMapView的截图,我只想在加载地图后才这样做.不幸的是,在实际加载地图之前,几乎总是调用此委托方法.如果我很幸运的话,我只会得到一个网格,或者几个加载的瓷砖.有没有办法做我需要做的事情?或者我在MKMapViewDelegate协议中遗漏了什么?
谢谢!
当我实现这个方法时,我有一个非常奇怪的MKMapViewDelegate问题给我一个我不明白的错误
当我删除整个函数时,错误才消失,
我试图让一个空函数返回nil,但给我同样的错误.
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
if annotation.isKindOfClass(MKUserLocation.classForCoder()) {
return nil
}
let AnnotationIdentifier:NSString = "AnnotationIdentifier"
var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(AnnotationIdentifier)
if annotationView != nil {
return annotationView
}else {
var annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: AnnotationIdentifier)
annotationView.canShowCallout = true
annotationView.image = UIImage(named: "btn_fav.png")
return annotationView
}
}
Run Code Online (Sandbox Code Playgroud)
错误:命令因信号失败:分段错误:11
CompileSwift normal arm64 /Users/Fortis/Proyectos/IOS Apps/Abilia/Abilia iOS/Abilia/Abilia/Vistas/Proyecto/MapaViewController.swift
cd /Users/Fortis/Proyectos/IOS Apps/Abilia/Abilia iOS/Abilia
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c "/Users/Fortis/Proyectos/IOS Apps/Abilia/Abilia iOS/Abilia/Abilia/Classes/NetClass/Downloader.swift" -primary-file "/Users/Fortis/Proyectos/IOS Apps/Abilia/Abilia iOS/Abilia/Abilia/Vistas/Proyecto/MapaViewController.swift" "/Users/Fortis/Proyectos/IOS Apps/Abilia/Abilia iOS/Abilia/Abilia/Vistas/Widget/ToggleView.swift" .
Run Code Online (Sandbox Code Playgroud)
...
0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Swift 2中的地图上绘制折线.这一切都运行良好,但我得到了此代码的编译器警告:
func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
if overlay is MKPolyline {
let polylineRenderer = MKPolylineRenderer(overlay: overlay)
polylineRenderer.strokeColor = UIColor.redColor()
polylineRenderer.lineWidth = 5
return polylineRenderer
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
这会给我一个警告说," 结果,并在图形页面(rendererForOverlay)参数有不同的可选性比协议MKMapViewDelegate预期 "
现在,这将编译正常,但它告诉我编译器警告显示.
如果我将第一行更改为
func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
Run Code Online (Sandbox Code Playgroud)
通过删除!,警告将消失,但我得到一个错误,返回不能为零,代码将不再编译.
这也是这个线程的后续,其中陈述了同样的问题,但没有令人满意的答案: Swift 2 MKMapViewDelegate rendererForOverlay optionality
任何人都可以在Swift 2中对正确使用此功能的方法有所了解吗?
谢谢.
我希望有一些annotationView图像显示在其他图像之上,因此它们更容易看到.有没有办法设定订单?
我以为我会尝试类似的东西
[theMap addAnnotations:arrayOfLessImportantItems];
[theMap addAnnotations:arrayOfMoreImportantItems];
Run Code Online (Sandbox Code Playgroud)
但是在尝试此操作后很明显,委托方法MKMapViewDelegate mapView:viewForAnnotation在放下它们时不会观察到任何特定的顺序.(由于注释视图来自池,因此当地图在屏幕上移动时,委托必须添加和删除注释视图图像.)
但我确实有一些我希望更容易看到的项目,并且它们被埋在不太重要的地图引脚后面.有办法克服这个问题吗?
我的MKPointAnnotation应该使用此代码进行自定义:
-(MKPointAnnotation*)setAnnotation: (NSString*) title atLocation:(CLLocationCoordinate2D)Location withImage:(UIImage*) LocationImage{
Pin = [[MKPointAnnotation alloc] init];
Pin.title = title;
[Pin setCoordinate:Location];
[self mapView:mapView viewForAnnotation:Pin].annotation = Pin;
return Pin;
}
-(MKAnnotationView *)mapView: (MKMapView *)mapView viewForAnnotation: (id<MKAnnotation>) annotation{
MKPinAnnotationView* pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];
if(!pinView){
pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];
pinView.animatesDrop = YES;
pinView.canShowCallout = YES;
pinView.enabled = YES;
UIButton *PicButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[PicButton addTarget:self action:@selector(showLocationPicture) forControlEvents:UIControlEventTouchUpInside];\
pinView.rightCalloutAccessoryView = PicButton;
}
else{
pinView.annotation = annotation;
}
return pinView;
}
Run Code Online (Sandbox Code Playgroud)
然而,出于某种原因,Pin仍然是默认的,任何人都可以帮助我吗?谢谢
关于MKMapView的最大缩放的stackoverflow有很多问题和答案,例如:
不幸的是,没有答案实际上对我有用(或者我没有正确实施).我无法模拟原生地图的行为,即限制缩放级别而不"反弹"或重新恢复.
这是我使用的代码:
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
if( mapView.region.span.latitudeDelta<0.001 || mapView.region.span.longitudeDelta<0.001){
MKCoordinateRegion region =mapView.region;
region.span = MKCoordinateSpanMake(0.001, 0.001);
mapView.region = region;
[mapView setRegion:mapView.region animated:NO];
}
}
Run Code Online (Sandbox Code Playgroud)
当用户捏合和缩放地图并且地图达到最大缩放(由我设置)时,地图不应放大然后反弹.可能吗?
我有一个swift带有MapView 的应用程序.这些是我在地图故事板上的设置:
另外,在我正在做的代码中:
let regionRadius: CLLocationDistance = 10000
let initialLocation = CLLocation(latitude: latitude, longitude: longitude)
centerMapOnLocation(initialLocation, map: cell.mapView, radius: regionRadius)
cell.mapView.scrollEnabled = false
cell.mapView.rotateEnabled = false
Run Code Online (Sandbox Code Playgroud)
我的方法centerMapOnLocation最初将地图集中在特定位置:
func centerMapOnLocation(location: CLLocation, map: MKMapView, radius: CLLocationDistance) {
let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate,
radius * 2.0, radius * 2.0)
map.setRegion(coordinateRegion, animated: true)
}
Run Code Online (Sandbox Code Playgroud)
我想只允许用户放大/缩小到精确的gps坐标.
目前用户无法滚动地图,但他可以旋转它,也可以 - 他可以在地图上的任何地方双击,它将在那里放大.
我想禁用这些选项并产生效果,当用户双击地图(或捏合)时 - 它只会缩放到初始位置.
我怎么能这样做,而且 - 为什么不起作用rotateEnabled = false?
ios ×8
mkmapview ×8
objective-c ×5
mapkit ×3
swift ×3
iphone ×1
mkoverlay ×1
screenshot ×1
swift2 ×1
xcode4 ×1