Как запустить видео, когда пользователь достигает определенного места? - PullRequest
3 голосов
/ 09 августа 2011

Это моя цель CoreLocationController.h c классом

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>

extern const CLLocationAccuracy kCLLocationAccuracyBest;
@protocol CoreLocationControllerDelegate 
@required
- (BOOL)startRegionMonitoring;
- (void)locationUpdate:(CLLocation *)location; // Our location updates are sent here
- (void)locationError:(NSError *)error; // Any errors are sent here
@end

@interface CoreLocationController : NSObject <CLLocationManagerDelegate, MKMapViewDelegate>      {
CLLocationManager *locMgr;
CLLocationCoordinate2D coordinate;
IBOutlet MKMapView *worldView;
IBOutlet UIActivityIndicatorView *activityIndicator;
id delegate;
} 

@property (nonatomic, retain) CLLocationManager *locMgr;
@property (nonatomic, assign) id delegate;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

@ конец

и это CorelocationController.m

#import "CoreLocationController.h"


@implementation CoreLocationController
@synthesize locMgr, delegate, coordinate;

- (id)init {
    self = [super init];

    if(self != nil) {
        self.locMgr = [[[CLLocationManager alloc] init] autorelease]; // Create new instance of locMgr
        self.locMgr.delegate = self; // Set the delegate as self.

        [locMgr setDistanceFilter:kCLDistanceFilterNone];
        [locMgr setDesiredAccuracy:kCLLocationAccuracyBest];

        [worldView setShowsUserLocation:YES];
    }

    return self;
}

- (BOOL)startRegionMonitoring {

    if (![CLLocationManager regionMonitoringAvailable] || ![CLLocationManager regionMonitoringEnabled] )
        return NO;
    CLLocationCoordinate2D home;
    home.latitude = +51.49410630;
    home.longitude = -0.10251360;

    CLRegion * region = [[CLRegion alloc] initCircularRegionWithCenter:home radius:10.0 identifier:@"home"];
    if (locMgr == nil)
        locMgr = ([[CLLocationManager alloc] init]);
    [locMgr startMonitoringForRegion:region desiredAccuracy:kCLLocationAccuracyBest];

    [region release];
    return YES;
}

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
    NSLog(@"Enteed location");
//  [self leavingHomeNotify];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Location entered" message:@"Region entered" delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:NULL];
    [alert show];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    if([self.delegate conformsToProtocol:@protocol(CoreLocationControllerDelegate)]) {  // Check if the class assigning itself as the delegate conforms to our protocol.  If not, the message will go nowhere.  Not good.
        [self.delegate locationUpdate:newLocation];

    }
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    if([self.delegate conformsToProtocol:@protocol(CoreLocationControllerDelegate)]) {     // Check if the class assigning itself as the delegate conforms to our protocol.  If not, the message will go nowhere.  Not good.
        [self.delegate locationError:error];
    }
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Location failed" message:@"Location failed" delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:NULL];
    [alert show];
}
     - (void)dealloc {
    [self.locMgr release];
    [super dealloc];
}


@end

Это CoreLocationDemoViewer.h

#import <UIKit/UIKit.h>
#import "CoreLocationController.h"
#import <MapKit/MapKit.h>

@interface CoreLocationDemoViewController : UIViewController <CoreLocationControllerDelegate, MKMapViewDelegate> {
    CoreLocationController *CLController;
    IBOutlet UILabel *locLabel;
    MKMapView *worldView;

}

@property (nonatomic, retain) CoreLocationController *CLController;
@property (nonatomic, retain) IBOutlet UILabel *locLabel;
@property (nonatomic, retain) MKMapView *worldView;

@end

Это CoreLocationDemoViewer.m

#import "CoreLocationDemoViewController.h"


@implementation CoreLocationDemoViewController
@synthesize CLController;
@synthesize locLabel;
@synthesize worldView;


- (void)viewDidLoad {
    [super viewDidLoad];
    self.worldView.mapType = MKMapTypeStandard;   // also MKMapTypeSatellite or MKMapTypeHybrid
    CLController = [[CoreLocationController alloc] init];
    CLController.delegate = self;
    [CLController.locMgr startUpdatingLocation];


    worldView.zoomEnabled = YES;
    worldView.scrollEnabled = YES;


}
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)u
{
    CLLocationCoordinate2D loc = [u coordinate];
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, 250, 250);
    [worldView setRegion:region animated:YES];
}



- (void)locationUpdate:(CLLocation *)location {
    locLabel.text = [location description];
//  [mapView setCenterCoordinate:location.coordinate];
//  [mapView setShowsUserLocation:YES];

    CLLocationCoordinate2D coord = [location coordinate];

    // Add it to the map view
//    [worldView addAnnotation:mp];

    // MKMapView retains its annotations, we can release
//  [mp release];

    // Zoom the region to this location
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(coord, 50, 50);
    [worldView setRegion:region animated:YES];

//   [locationManager stopUpdatingLocation];    
}

- (void)locationError:(NSError *)error {
    locLabel.text = [error description];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

// The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
/*
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization.
    }
    return self;
}
*/

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
}
*/

/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations.
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/



- (void)viewDidUnload {
    [super viewDidUnload];
     self.worldView = nil;

    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [CLController release];
    [worldView release];
    [super dealloc];
}

@end

Хорошо, вот что я хочу. До сих пор он показывает карту с местоположением пользователя и он находит точное местоположение, которое указано на этикетке ... правильно, если я делаю что-то не так ..

Что я хочу сделать, это запустить видео, когда пользователь достигает определенного места ...

ИАМ приближается, верно?

Ответы [ 3 ]

1 голос
/ 09 августа 2011

Возможно, что-то не так с настройкой делегата?Я обычно указываю делегата в файле .h следующим образом:

id <CoreLocationControllerDelegate> delegate;

и

@property (nonatomic, assign) id <CoreLocationControllerDelegate> delegate;

EDIT

Кроме того, вы провериличто -mapView:didUpdateUserLocation: называется?

1 голос
/ 09 августа 2011

Я думаю, что если у вас просто возникают проблемы с корректным масштабированием mapView, используйте материал MKCoordinate из этого поста, Как мне увеличить MKMapView .

Я работаю надmapview также увеличивает масштаб изображения до достойного уровня для просмотра, и я устанавливаю latitudeDelta и longitudeDelta для карты.Хорошо работает для меня.

0 голосов
/ 09 августа 2011

Я не вижу, чтобы вы назначали делегата для worldView (но вы делаете для других вещей). Попробуйте добавить worldView.delegate = self; в ваш viewDidLoad.

...