2011-11-07 23 views
8

¿Cómo accedo a la brújula del iPhone en Firemonkey?¿Cómo accedo a la brújula en iOS?

+0

No entiendo, esto es algo así como: pregunto, doy la respuesta? – RBA

+0

@RBA, solo compartiendo mi marcador. Espero que sea útil. SO lo permite, consulte las preguntas frecuentes. – Johan

+0

De hecho :) tienes razón, esta fue la razón para darte un +1. En mi humilde opinión, esto también debería ser puesto en wiki porque es una buena pregunta sobre el desarrollo de iOS. – RBA

Respuesta

8

He aquí un video howto: http://blogs.embarcadero.com/ao/2011/10/13/39171
código fuente completo: http://cc.embarcadero.com/item/28536
Y una (corta) Artículo: http://edn.embarcadero.com/article/41715

Y aquí está el código fuente de un componente de la brújula.
No lo he probado todavía, pero debería funcionar.

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. 
+0

+1 Sería bueno, sin embargo, tener las partes relevantes incluidas en tu respuesta si esto es posible. – jpfollenius

+0

@Smasher, veré lo que puedo hacer. – Johan

+0

@Smasher, código fuente agregado para un componente brújula – Johan

Cuestiones relacionadas