觸發事件

觸發事件是SDK最重要的一環,透過觸發事件來完成應用層對應的工作。本章節將完整介紹SAILS iOS SDK的觸發事件。

定位引擎觸發事件Block


定位點改變事件

透過setOnLocationChangeEventListener,事實上,由於本定位引擎採用多種定位融合技術,每秒有10次以上的定位更新達到絕佳的定位體驗,故在定位點改變事件中,SDK會以每0.1秒呼叫此觸發事件,開發者可以透過isLocationFix來判斷用戶是否在該場域並且定位引擎已經計算出位置。

[sails setOnLocationChangeEventBlock:^{
  //本觸發事件每0.1秒執行一次
  if ([weakSailsMapView isCenterLock] && ![weakSailsMapView isInLocationFloor] && ![[weakSails getFloor] isEqualToString:@""] && [weakSails isLocationFix]) { 
  //當mapView為CenterLock且可以取得樓層資訊並且位置已被計算出來(透過isLocationFix判斷)時執行此Block
  }
}];

用戶樓層改變事件

當定位引擎判斷該用戶所在樓層的位置變化時,會呼叫此觸發事件,帶入之參數為切換的樓層名稱。

[sails setOnLocationFloorChangedBlock:^(NSString *floorName) {
//用戶所在樓層位置改變時會進行此工作
}];

向量地圖引擎觸發事件Block


對於地圖來說,不外乎就是當用戶點選地圖、樓層變換、模式變換時應用層會需要啟動對應的工作。以下我們列出地圖端的觸發事件以及它的使用方式:

點擊POI區域(LocationRegion)觸發事件 OnRegionClick Listener

當用戶點擊地圖時,該點擊位置是在地圖中LocationRegion(區塊tag有設為navi=true,皆為LocationRegion物件)的範圍內則會啟動本觸發,而觸發的反饋為LocationRegion的array。會為array的原因在於,地圖區塊可能會有重疊,點擊位置有可能有超過一個區塊的範圍內,而回傳會以該LocationRegion所設定的level值由大至小依序排列。通常開發者取第一個LocationRegion物件即可。

[sailsMapView setOnRegionClickBlock:^(NSArray *locationRegions) {
//點擊觸發工作
}];

長點擊POI區域(LocationRegion)觸發事件 OnRegionLongClickBlock

長點擊觸發設定與短點擊一致,請參考上面說明。

地圖點擊觸發事件 OnMapClickListener

當用戶點擊地圖時,若開發者想要取得點擊地圖的x與y座標,則可參考本觸發事件。

[sailsMapView setOnMapClickBlock:^(CGPoint tapPoint) {
   //地圖點擊事件工作,CGPoint為點擊座標
}];

本觸發物件通常用來判斷用戶點擊的區域是否為icon(marker)的區域,開發者可以使用MarkerManager中的getLocationRetionByMarkerXY(x,y)將點擊觸發之XY座標帶進,來判斷為何者LocationRegion中的Marker被點擊到:

NSArray* lrArray=[[sailsMapView getMarkerManager] getLocationRegionByMarkerXY:X andPointY:Y];

地圖點擊無物件觸發事件 OnClickNothingBlock

當用戶點擊地圖時無對應之LocationRegion被點擊到則會觸發此事件,通常此觸發事件用來判斷用戶是否意圖將上個動作所產生的圖示/指示清除。

變換樓層觸發事件 OnFloorChangedBlock

當樓層被切換時會觸發此事件。本觸發事件與SAILS類別中的onFloorChangedBlock不同的地方在於前者為地圖因被執行loadFloorMap而觸發,而後者是因定位引擎判別用戶所在樓層改變而產生的觸發程序。

SAILSMapView的OnFloorChangedBlock動作順序如下: SAILSMapView地圖樓層切換(loadFloorMap被呼叫)->執行onFloorChangedBefore->SAILSMapView執行切換的樓層地圖繪製->SAILSMapView繪製完成->執行onFloorChangedAfter

本觸發事件通常用來更新應用層的樓層顯示,例如下拉表單的更新。

[sailsMapView setOnFloorChangedBeforeBlock:^(NSString *floorName) {
//執行欲切換樓層前的工作
}];

[sailsMapView setOnFloorChangedAfterBlock:^(NSString *floorName) {
//執行切換樓層並顯示後的工作
}];

變換地圖模式時觸發事件 OnModeChangedBlock

當地圖模式有變動時會呼叫此事件。通常本觸發事件用來控制地圖中心/方向鎖定之按鈕顯示狀態,以下為範例:

[sailsMapView setOnModeChangedBlock:^(void){
  dispatch_async(dispatch_get_main_queue(), ^(void){
    if ((([weakSailsMapView getMapControlMode] & LocationCenterLockMode) == LocationCenterLockMode) && (([weakSailsMapView getMapControlMode] & FollowPhoneHeagingMode) == FollowPhoneHeagingMode)) {
      [weakLockCenterButton setImage:[UIImage imageNamed:@"lockCenter3"] forState:UIControlStateNormal];
    } else if (([weakSailsMapView getMapControlMode] & LocationCenterLockMode) == LocationCenterLockMode) {
      [weakLockCenterButton setImage:[UIImage imageNamed:@"lockCenter2"] forState:UIControlStateNormal];
    } else {
      [weakLockCenterButton setImage:[UIImage imageNamed:@"lockCenter1"] forState:UIControlStateNormal];
    }
  });
}];

路徑規劃觸發事件Block


路徑規劃完整觸發事件如下:

[sailsPathRoutingManager setOnRoutingUpdateArrivedBlock:^(LocationRegion *targetRegion) {
//已到達目的地之工作
}];
[sailsPathRoutingManager setOnRoutingUpdateRouteSuccessBlock:^{
//路徑規劃成功之工作
}];
[sailsPathRoutingManager setOnRoutingUpdateRouteFailBlock:^{
//路徑規劃失敗之工作
}];
[sailsPathRoutingManager setOnRoutingUpdatePathDrawFinishBlock:^{
//路徑繪製完成之工作
}];
[sailsPathRoutingManager setOnRoutingUpdateTotalDistanceRefreshBlock:^(int distance) {
//起訖點距離改變時之工作
}];
[sailsPathRoutingManager setOnRoutingUpdateReachNearestTransferDistanceRefreshBlock:^(int distance, PathRoutingNodeType nodeType) {
//用戶離最近的樓層切換轉換節點的工作
}];

以下針對各個事件說明:

onArrived

當用戶抵達目的地時會觸發此事件並帶入目的地之LocationRegion

onRouteSuccess

當執行路徑規劃時可以成功進行路徑規劃會觸發此事件,亦即起訖點的路徑可以被規劃出來。

onRouteFail

當執行路徑規劃時無法成功進行路徑規劃會觸發此事件,通常路徑無法被規劃的以下原因:

  • 未繪製或位上傳Path.xml
  • Path內的末節點並未被起迄LocationRegion所包覆
  • 切換樓層的節點id並未設定正確
  • 在指定的路徑規劃模式下無法規劃路徑

onPathDrawFinish

當路徑繪製完成時會觸發此事件。

onTotalDistanceRefresh

起訖點距離改變時會觸發此事件,並帶入所剩距離(單位為公尺)

onReachNearestTransferDistanceRefresh

用戶至最近轉換樓層節點時的觸發事件,帶入的第一個參數為目前至目的地之距離,第二參數為該切換樓層的節點形式,該節點會有以下幾種可能的形式:

  • SwitchFloorInfo.STAIR
  • SwitchFloorInfo.ESCALATOR
  • SwitchFloorInfo.ELEVATOR
  • SwitchFloorInfo.DESTINATION

onSwitchFloorInfoRefresh

透過SwitchFloorInfo的資訊開發者可以取得

  • 每層欲往上樓層或往下樓層走的資訊
  • 轉換樓層的形式:電梯、手扶梯、樓梯
  • 該樓層切換點之經緯度

results matching ""

    No results matching ""