如何在Firemonkey中访问
iphone指南针?
解决方法
这是一个howto视频:
http://blogs.embarcadero.com/ao/2011/10/13/39171
完整源代码: http://cc.embarcadero.com/item/28536
和(短)文章: @L_403_3@
完整源代码: http://cc.embarcadero.com/item/28536
和(短)文章: @L_403_3@
这是罗盘组件的源代码.
还没有尝试过,但它应该工作.
- unit Compass;
- {Based on Anders Ohlsson Firemonkey Compass example}
- {$IFDEF FPC}
- {$mode objfpc}{$H+}
- {$modeswitch objectivec1}
- {$ENDIF}
- interface
- uses
- SysUtils,Classes,FMX_Types
- {$IFDEF FPC},iPhoneAll
- {$ENDIF}
- ;
- type
- TUpdateEvent = TNotifyEvent;
- TiOSGPSCompass = class(TFmxObject)
- private
- FLatitude: Double;
- FLongitude: Double;
- FAltitude: Double;
- FHeading: Double;
- FOnUpdate: TUpdateEvent;
- UpdateNeeded: Boolean;
- protected
- procedure SetLatitude(value: Double);
- procedure SetLongitude(value: Double);
- procedure SetAltitude(value: Double);
- procedure SetHeading(value: Double);
- procedure Update;
- public
- constructor Create(AOwner: Classes.TComponent); override;
- destructor Destroy; override;
- published
- property Latitude: Double read FLatitude;
- property Longitude: Double read FLongitude;
- property Altitude: Double read FAltitude;
- property Heading: Double read FHeading;
- property OnUpdate: TUpdateEvent read FOnUpdate write FOnUpdate;
- end;
- var
- MyGPSCompass: TiOSGPSCompass = nil;
- procedure Register;
- implementation
- {$IFDEF FPC}
- uses
- CoreLocation;
- {$ENDIF}
- {$IFDEF FPC}
- type
- MyCLController = objcclass(NSObject)
- locationManager : CLLocationManager;
- procedure locationManager_didUpdateToLocation_fromLocation(manager: CLLocationManager; newLocation,oldLocation: CLLocation); message 'locationManager:didUpdateToLocation:fromLocation:';
- procedure locationManager_didUpdateHeading(manager: CLLocationManager; newHeading: CLHeading); message 'locationManager:didUpdateHeading:';
- end;
- var
- Controller : MyCLController;
- {$ENDIF}
- {$IFDEF FPC}
- procedure MyCLController.locationManager_didUpdateToLocation_fromLocation(manager: CLLocationManager; newLocation,oldLocation: CLLocation);
- begin
- if Assigned(MyGPSCompass) then begin
- MyGPSCompass.SetLatitude(newLocation.coordinate.latitude);
- MyGPSCompass.SetLongitude(newLocation.coordinate.longitude);
- MyGPSCompass.SetAltitude(newLocation.altitude);
- MyGPSCompass.Update;
- end;
- end;
- {$ENDIF}
- {$IFDEF FPC}
- procedure MyCLController.locationManager_didUpdateHeading(manager: CLLocationManager; newHeading: CLHeading);
- begin
- if Assigned(MyGPSCompass) then begin
- MyGPSCompass.FCompassHeading:= newHeading.magneticheading;
- MyGPSCompass.Update;
- end;
- end;
- {$ENDIF}
- constructor TiOSGPSCompass.Create(AOwner: TComponent);
- begin
- inherited;
- {$IFDEF FPC}
- Controller := MyCLController.alloc.init;
- Controller.locationManager := CLLocationManager.alloc.init;
- Controller.locationManager.setDelegate(Controller);
- Controller.locationManager.setDesiredAccuracy(kCLLocationAccuracyBestForNavigation);
- Controller.locationManager.startUpdatingLocation;
- Controller.locationManager.startUpdatingHeading;
- {$ENDIF}
- MyGPSCompass:= Self;
- end;
- destructor TiOSGPSCompass.Destroy;
- begin
- {$IFDEF FPC}
- Controller.locationManager.release;
- Controller.release;
- {$ENDIF}
- inherited;
- end;
- procedure TiOSGPSCompass.SetLatitude(value: Double);
- begin
- if (FLatitude <> value) then begin
- FLatitude:= value;
- UpdateNeeded:= True;
- end;
- end;
- procedure TiOSGPSCompass.SetLongitude(value: Double);
- begin
- if (FLongitude <> value) then begin
- FLongitude:= value;
- UpdateNeeded:= True;
- end;
- end;
- procedure TiOSGPSCompass.SetAltitude(value: Double);
- begin
- if (FAltitude <> value) then begin
- FAltitude:= value;
- UpdateNeeded:= True;
- end;
- end;
- procedure TiOSGPSCompass.SetHeading(value: Double);
- begin
- if (FHeading <> value) then begin
- FHeading:= value;
- UpdateNeeded:= True;
- end;
- end;
- procedure TiOSGPSCompass.Update;
- begin
- if (UpdateNeeded and Assigned(OnUpdate)) then OnUpdate(Self);
- UpdateNeeded:= False;
- end;
- procedure Register;
- begin
- RegisterComponents('iOS',[TiOSGPSCompass]);
- end;
- end.