大佬教程收集整理的这篇文章主要介绍了iphone – 为MKMapView优化代码 – 大量注释,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
问题是当所有引脚加载时,用户被迫等待一分钟左右.一旦所有800个引脚都在地图上,应用程序也会变得迟钝.
谢谢.
#import "MapView.h" #import "MapPlaceObject.h" @implementation MapView @synthesize mapViewLink,mapLOCATIOns,detail,FailedLoad; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundLeorNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundLeorNil]; if (self) { // Custom initialization } return self; } -(void)addPins { for (MapPlaceObject * info in mapLOCATIOns) { double latitude = info.longitude; double longitude = info.latitude; NSString * name = info.name; NSString * addressline = info.addressOne; NSString * postcode = info.postCode; NSString * addresscomma = [addressline StringByAppendingString:@","]; NSString * address = [addresscomma StringByAppendingString:postcode]; CLLOCATIOnCoordinate2D coordinate; coordinate.latitude = latitude; coordinate.longitude = longitude; MyLOCATIOn *Annotation = [[[MyLOCATIOn alloc] initWithName:name address:address coordinate:coordinate] autorelease]; [mapViewLink addAnnotation:Annotation]; } } - (void)showLinks : (id)sender { if (UI_user_iNTERFACE_I@L_714_7@m() == UIUserInterfaceI@L_714_7@mPad) { detail = [[DetailViewController alloc] initWithNibName:@"DetailViewController-iPad" bundle:nil]; } else if (!detail) { NSLog(@"Detail is None"); detail = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; } int uniquEID = ((UIButton *)sender).tag; //PlaceObject *info = [mapLOCATIOns objectATindex:uniquEID]; detail.UniquEID = uniquEID; detail.hidesBottomBarWhenPushed = YES; [self.navigationController pushViewController:detail animated:YES]; self.detail = nil; [detail release]; } - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) Annotation{ if (Annotation == mapView.userLOCATIOn){ return nil; //default to blue dot } MKPinAnnotationView *AnnView=[[MKPinAnnotationView alloc] initWithAnnotation:Annotation reusEIDentifier:@"currentloc"]; AnnView.pinColor = MKPinAnnotationColorRed; nameSaved = Annotation.title; for (PlaceObject * info in mapLOCATIOns) { if (info.name == nameSaved) { savEID = info.UniquEID; } } UIButton *advertButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; advertButton.frame = CGRectMake(0,23,23); advertButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; advertButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; [advertButton addTarget:self action:@SELEctor(showLinks:) forControlEvents:UIControlEventTouchUpInside]; advertButton.tag = savEID; AnnView.rightCalloutAccessoryView = advertButton; AnnView.animatesDrop=TRUE; AnnView.canShowCallout = YES; AnnView.calloutOffset = CGPointMake(-5,5); return AnnView; } - (void)dealloc { [mapViewLink release]; [mapLOCATIOns release]; [detail release]; self.FailedLoad = nil; [FailedLoad release]; [super dealloc]; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data,images,etc that aren't in use. } - (void)viewWillAppear:(BOOL)animated { if (firstTimE) { CLLOCATIOnCoordinate2D zoomLOCATIOn; zoomLOCATIOn.latitude = 51.50801; zoomLOCATIOn.longitude = -0.12789; MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLOCATIOn,15*METERS_PER_MILE,15*METERS_PER_MILE); MKCoordinateRegion adjustedRegion = [mapViewLink regionThatFits:viewRegion]; [mapViewLink setRegion:adjustedRegion animated:YES]; firstTime = NO; } } - (void)viewDidLoad { [super viewDidLoad]; firstTime = YES; FailedLoad = [[NSMutableArray alloc]init]; self.mapLOCATIOns = [BluePlaqueDatabase database].mapInfo; [self addPins]; } - (void)viewDidUnload { [mapViewLink release]; mapViewLink = nil; [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; }
>实现注释视图重用(现在它每次需要显示注释时都会创建一个新视图,即使再次进入视图也是如此).
>更改UniquEID的设置方式.为了设置它,代码当前在每次创建注释视图时循环遍历所有注释(这可能在地图视图被缩放或滚动时发生 – 而不仅仅是初始时间).
首先,不是在viewForAnnotation方法中搜索UniquEID并使用按钮标记来传递注释标识符,而是将uniquEID作为属性添加到自定义注记类MyLOCATIOn,并在addPins中添加注释本身时设置属性:
Annotation.uniquEID = info.UniquEID; // <-- give id to Annotation itself [mapViewLink addAnnotation:Annotation];
您还可以将uniquEID作为参数添加到initWithName方法,而不是单独分配属性.
接下来,要实现注释视图重用,viewForAnnotation方法应如下所示:
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) Annotation{ if (Annotation == mapView.userLOCATIOn){ return nil; //default to blue dot } NSString *reusEID = @"StandardPin"; MKPinAnnotationView *AnnView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reusEID]; if (AnnView == nil) { AnnView = [[[MKPinAnnotationView alloc] initWithAnnotation:Annotation reusEIDentifier:reusEID] autorelease]; AnnView.pinColor = MKPinAnnotationColorRed; AnnView.animatesDrop = YES; AnnView.canShowCallout = YES; AnnView.calloutOffset = CGPointMake(-5,5); UIButton *advertButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; advertButton.frame = CGRectMake(0,23); advertButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; advertButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; AnnView.rightCalloutAccessoryView = advertButton; } else { //update the Annotation property if view is being re-used... AnnView.Annotation = Annotation; } return AnnView; }
最后,要响应按钮按下并找出显示详细信息的UniquEID,请实现calloutAccessoryControlTapped委托方法:
- (void)mapView:(MKMapView *)mapView AnnotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { MyLOCATIOn *myLoc = (MyLOCATIOn *)view.Annotation; int uniquEID = myLoc.uniquEID; NSLog(@"calloutAccessoryControlTapped,uid = %d",uniquEID); //create,init,and show the detail view controller here... }
在所有这些更改之后,只有注释的初始加载将占用大部分时间.如果这仍然是一个问题,一种解决方案是仅添加在当前显示的区域中可见的注释,并在用户更改可见区域时添加/删除注释.
以上是大佬教程为你收集整理的iphone – 为MKMapView优化代码 – 大量注释全部内容,希望文章能够帮你解决iphone – 为MKMapView优化代码 – 大量注释所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。