使用AVSpeechSynthesizer读取Map上的位置描述

时间:2014-03-16 18:47:05

标签: ios mkmapview 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:

enter image description here

1 个答案:

答案 0 :(得分:1)

didSelectAnnotationView委托方法中,anView参数为MKAnnotationView

也就是说,anView是注释的视图MKAnnotationViewMKPinAnnotationView类)对象。

它不是注释的模型(您的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];
    }
}