CLLocation header is always -1

936 views Asked by At

Hey guys, I am trying to build an app that will use a compass to point in the direction of a predetermined location, but for now I am trying to understand just how to make a basic compass. I followed a guide, however I am always get "-1" as the header, and have only gotten it to work once, and I haven't changed code since. Any ideas would be helpful.

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@interface TrackerViewController : UIViewController <CLLocationManagerDelegate> {

}

@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, retain) IBOutlet UISwitch *toggle;
@property (nonatomic, retain) IBOutlet UIImageView *compass;
@property (nonatomic, retain) IBOutlet UILabel *headingLabel;

-(IBAction)toggleSwitch;

@end

and the implementation file...

#import "TrackerViewController.h"


@implementation TrackerViewController

@synthesize locationManager; 
@synthesize toggle; 
@synthesize compass; 
@synthesize headingLabel;

- (IBAction)toggleSwitch {
if(self.toggle.isOn) {
    [self.locationManager startUpdatingHeading];
} else {
    [self.locationManager stopUpdatingHeading];
}
}

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

if ([CLLocationManager headingAvailable]) {
    self.locationManager = [[[CLLocationManager alloc] init] autorelease]; 
    self.locationManager.delegate = self;
} else {
    [[[[UIAlertView alloc] initWithTitle:@"Aw snap!" 
                                 message:@"Device doesn't support heading updates" 
                                delegate:nil 
                       cancelButtonTitle:@"OK" 
                       otherButtonTitles:nil] autorelease] show];   
}
}

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading 
*)newHeading {
float heading = [newHeading trueHeading] * M_PI / 180.0;
self.compass.transform = CGAffineTransformMakeRotation(-heading);
self.headingLabel.text = [NSString stringWithFormat:@"%d°", (int)[newHeading trueHeading]];
NSLog(@"%d", (int)[newHeading trueHeading]);
}


- (void)locationManager:(CLLocationManager *)manager 
   didFailWithError:(NSError *)error {

//  NSLog(@"Error!");

if (error.code == kCLErrorDenied) {
    [[[[UIAlertView alloc] initWithTitle:@"Aw snap!" 
                                 message:@"User didn't allow heading updates" 
                                delegate:nil 
                       cancelButtonTitle:@"OK" 
                       otherButtonTitles:nil] autorelease] show];
    self.toggle.on = NO;
    [self.locationManager stopUpdatingHeading];
}
}


- (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)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}


- (void)dealloc {
self.locationManager = nil;
self.compass = nil;
self.toggle = nil;
self.headingLabel = nil;
[super dealloc];
}

@end
1

There are 1 answers

0
Ghosthk On BEST ANSWER

magneticHeading The value in this property represents the heading relative to the magnetic North Pole, which is different from the geographic North Pole. The value 0 means the device is pointed toward magnetic north, 90 means it is pointed east, 180 means it is pointed south, and so on. The value in this property should always be valid.