使用AVSpeechSynthesizer读取地图上的位置描述
我的地图有4或5个彼此接近的点,现在使用AVSpeechSynthesizer我已经知道它的位置名称(也显示在一个小泡泡)。
我希望它仍然显示泡沫,但点击时,我希望它说我将指定的地方的描述。 这是我目前的代码:
MapViewAnnotation.h
@interface MapViewAnnotation : NSObject <MKAnnotation> { NSString *title; CLLocationCoordinate2D coordinate; NSString *desc; } @property (nonatomic, copy) NSString *title; @property (nonatomic, readonly) CLLocationCoordinate2D coordinate; @property (nonatomic, readonly) NSString *desc; - (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d initWithDesc:(NSString *)dsc;
MapViewAnnotation.m
@implementation MapViewAnnotation @synthesize title, coordinate, desc; - (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d initWithDesc:(NSString *)dsc { [super init]; title = ttl; coordinate = c2d; desc = dsc; return self;
MapViewController.h
@interface MapViewController : UIViewController { MKMapView *mapView; } @property (nonatomic, retain) IBOutlet MKMapView *mapView; @property (strong, nonatomic) AVSpeechSynthesizer *synthesizer;
MapViewController.m
- (void)viewDidLoad { // Set some coordinates for our position : Cutty Sark CLLocationCoordinate2D location; location.latitude = (double) 51.482997; location.longitude = (double) -0.010072; // Royal Observatory CLLocationCoordinate2D twoLocation; twoLocation.latitude = (double) 51.477805; twoLocation.longitude = (double) -0.001430; //Royal Naval College CLLocationCoordinate2D threeLocation; threeLocation.latitude = (double) 51.483344; threeLocation.longitude = (double) -0.006799; //Queen's House CLLocationCoordinate2D fourLocation; fourLocation.latitude = (double) 51.481383; fourLocation.longitude = (double) -0.003722; //National Maritime Museum CLLocationCoordinate2D fiveLocation; fiveLocation.latitude = (double) 51.481050; fiveLocation.longitude = (double) -0.005578; // Add Cutty Sark annotation to MapView MapViewAnnotation *newAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"Cutty Sark" andCoordinate:location initWithDesc:@"Description about Cutty Sark"]; [self.mapView addAnnotation:newAnnotation]; self.mapView.delegate = self; [newAnnotation release]; // Add Royal Observatory annotation to MapView newAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"Royal Observatory" andCoordinate:twoLocation initWithDesc:@"Description about Cutty Sark"]; [self.mapView addAnnotation:newAnnotation]; [newAnnotation release]; // Add Royal Naval College annotation to MapView newAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"Royal Naval College" andCoordinate:threeLocation initWithDesc:@"Description about Cutty Sark"]; [self.mapView addAnnotation:newAnnotation]; [newAnnotation release]; // Add Queen's House annotation to MapView newAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"Queen's House" andCoordinate:fourLocation initWithDesc:@"Description about Cutty Sark"]; [self.mapView addAnnotation:newAnnotation]; [newAnnotation release]; // Add National Maritime Museum annotation to MapView newAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"National Maritime Museum" andCoordinate:fiveLocation initWithDesc:@"Description about Cutty Sark"]; [self.mapView addAnnotation:newAnnotation]; [newAnnotation release]; } - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)anView { AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc]init]; AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:((MapViewAnnotation *)anView).desc]; [utterance setRate:0.5]; [synthesizer speakUtterance:utterance]; } // When a map annotation point is added, zoom to it (1500 range) - (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views { MKAnnotationView *annotationView = [views objectAtIndex:0]; id <MKAnnotation> mp = [annotationView annotation]; MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 1500, 1500); [mv setRegion:region animated:YES]; //[mv selectAnnotation:mp animated:YES]; }
任何帮助,将不胜感激!
编辑这里是NSLog:
在didSelectAnnotationView
委托方法中, anView
参数是MKAnnotationView
。
也就是说, anView
是注释的视图 ( MKAnnotationView
或MKPinAnnotationView
类)的对象。
它不是注解的模型 (您的MapViewAnnotation
类)对象。
要引用视图的注释模型实例,请使用视图的annotation
属性并将其转换为类:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)anView { //Get a reference to the annotation this view is for... id<MKAnnotation> annSelected = anView.annotation; //Before casting, make sure this annotation is our custom type //(and not some other type like MKUserLocation)... if ([annSelected isKindOfClass:[MapViewAnnotation class]]) { MapViewAnnotation *mva = (MapViewAnnotation *)annSelected; AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc]init]; AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:mva.desc]; [utterance setRate:0.5]; [synthesizer speakUtterance:utterance]; } }