我正在尝试在mapview加载后立即显示注释标注。我确定我错过了一件简单的事情,却找不到它。
感谢您的帮助。
这是我的代码:
我的.h:
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface MapDetailViewController : UIViewController <MKMapViewDelegate> {
MKMapView *mapView;
}
// map
@property (strong, nonatomic) IBOutlet MKMapView *mapView;
@property (nonatomic) double latDouble;
@property (nonatomic) double lngDouble;
@property (nonatomic) NSString *vendorStr;
@property (nonatomic) NSNumber *costAmount;
@end
我的.m:
#import“MapDetailViewController.h”
@interface MapDetailViewController ()
@end
#define THESPAN 0.01f;
@implementation MapDetailViewController
@synthesize mapView;
@synthesize latDouble, lngDouble;
@synthesize vendorStr, costAmount;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
// mapView.showsUserLocation = YES;
mapView.delegate = self;
MKCoordinateRegion region;
MKCoordinateSpan span;
span.longitudeDelta = THESPAN;
span.latitudeDelta = THESPAN;
CLLocationCoordinate2D annotationCoord;
annotationCoord.latitude = latDouble;
annotationCoord.longitude = lngDouble;
MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc] init];
annotationPoint.coordinate = annotationCoord;
annotationPoint.title = vendorStr;
//convert cost amount/ price to string value for the subtitle
NSString *costAmountStr = [costAmount stringValue];
annotationPoint.subtitle = costAmountStr;
[mapView addAnnotation:annotationPoint];
region.center = annotationCoord;
region.span = span;
[mapView setRegion:region animated:YES];
}
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
MKPinAnnotationView *newAnnotation=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotation1"];
UIButton *disclosureButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[disclosureButton addTarget:self action:@selector(mapCallOutPressed:) forControlEvents:UIControlEventTouchUpInside];
newAnnotation.rightCalloutAccessoryView = disclosureButton;
newAnnotation.animatesDrop = YES;
newAnnotation.canShowCallout = YES;
newAnnotation.annotation = annotation;
newAnnotation.draggable = YES;
newAnnotation.enabled = YES;
newAnnotation.exclusiveTouch = YES;
newAnnotation.highlighted = YES;
newAnnotation.multipleTouchEnabled = YES;
newAnnotation.pinColor = MKPinAnnotationColorRed;
newAnnotation.userInteractionEnabled = YES;
//button on the right for popup for pins
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton setTitle:annotation.title forState:UIControlStateNormal];
[rightButton addTarget:self
action:@selector(mapCallOutPressed:)
forControlEvents:UIControlEventTouchUpInside];
newAnnotation.rightCalloutAccessoryView = rightButton;
//Create and add the right button to the callout
UIButton* rightCalloutButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
rightCalloutButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[newAnnotation setRightCalloutAccessoryView:rightButton];
//zoom button on the left of popup for pins
UIButton* leftButton = [UIButton buttonWithType:UIButtonTypeContactAdd];
[leftButton setTitle:annotation.title forState:UIControlStateNormal];
[leftButton addTarget:self
action:@selector(zoomToLocation:) forControlEvents:UIControlEventTouchUpInside];
newAnnotation.leftCalloutAccessoryView = leftButton;
UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tag.png"]];
newAnnotation.leftCalloutAccessoryView = profileIconView;
return newAnnotation;
}
- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{
for (id<MKAnnotation> currentAnnotation in mapView.annotations) {
[mapView selectAnnotation:currentAnnotation animated:YES];
}
}
// method for the annotation detail disclosure button
-(void)mapCallOutPressed:(id)sender {
NSLog(@"mapcallout pressed");
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
答案 0 :(得分:1)
尝试在添加注释后立即将此行代码添加到viewWillAppear
方法:
[mapView selectAnnotation:annotationPoint animated:YES];
答案 1 :(得分:1)
从[MKMapView selectAnnotation:animated:]
mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views
时,您应该稍微延迟- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{
int64_t delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
for (id<MKAnnotation> currentAnnotation in mapView.annotations) {
[mapView selectAnnotation:currentAnnotation animated:YES];
}
});
}
方法
annotationPoint.title = @"Hello world";
*编辑
尝试使用6.0.1设备,6.0和5.1模拟器。它确实有效,我怀疑你没有通过传递nil来正确设置你的注释标题。
尝试将标题更改为修订值,如下所示:
@property (nonatomic, copy) NSString *vendorStr;
@property (nonatomic, strong) NSNumber *costAmount;
* EDIT2:
您的财产声明可能看起来更像
{{1}}
答案 2 :(得分:1)
视图确实出现后我等了0.8秒。
[self performSelector:@selector(testMethod) withObject:nil afterDelay:.8];
-(void) testMethod
{
[self.mapView selectAnnotation:annotation animated:NO];
}
动画:否做了这个伎俩