觸發事件
觸發事件是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的資訊開發者可以取得
- 每層欲往上樓層或往下樓層走的資訊
- 轉換樓層的形式:電梯、手扶梯、樓梯
- 該樓層切換點之經緯度