微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在iOS中访问指南针?

如何在Firemonkey中访问 iphone指南针?

解决方法

这是一个howto视频: http://blogs.embarcadero.com/ao/2011/10/13/39171
完整源代码http://cc.embarcadero.com/item/28536
和(短)文章http://edn.embarcadero.com/article/41715

这是罗盘组件的源代码.
还没有尝试过,但它应该工作.

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.

原文地址:https://www.jb51.cc/iOS/334371.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐