使用結果控制器新增自動完成 UI 控制元件
自動完成 UI 控制元件是具有內建自動完成功能的搜尋對話方塊。當使用者輸入搜尋項時,控制元件顯示可供選擇的預測位置列表。當使用者進行選擇時,將返回 GMSPlace(放置在 Xamarin 中)例項,然後你的應用可以使用該例項獲取有關所選位置的詳細資訊。
如上所述,該示例使用結果控制器,其允許對文字輸入 UI 的更多控制。結果控制器將根據輸入的 UI 焦點動態切換結果列表的可見性。
此程式碼的目的是顯示如下所示的螢幕:
這將在你開始輸入時自動填寫你的地址,如下圖所示:
說明:
-
首先我們需要將谷歌地圖 API 新增到我們的 Visual Studio,它可以通過 Nuget 獲得,只需搜尋 Xamarin.Google.iOS.Maps,將其新增到你的 iOS 專案,或者你可以從 Xamarin Xamarin 谷歌地圖 iOS SDK 下載它
-
我們需要類似按鈕來觸發谷歌自動完成檢視控制器。在這個例子中,我用故事板做了這個,並新增了一個名為 GoogleButton 的按鈕,你可以使用它並不重要的程式碼來觸發它。
-
在檢視控制器類的 ViewDidLoad 下新增以下程式碼。在我下面的例子中,我沒有使用移動裝置的實際位置,我的最終解決方案當然會這樣做,但這是一個測試,我不想實現額外的程式碼,直到我證明這工作或淡化我正在嘗試給你看:
//程式碼調出谷歌地方自動完成檢視控制器。
GoogleButton.TouchUpInside += (sender, ea) =>
{
var FakeCoordinates = new CLLocationCoordinate2D()
{
Latitude = 54.135364,
Longitude = -0.797888
};
var north = LocationWithBearing(45, 3000, FakeCoordinates);
var east = LocationWithBearing(225, 3000, FakeCoordinates);
var autocompleteController = new AutocompleteViewController();
autocompleteController.Delegate = new AutoCompleteDelegate();
autocompleteController.AutocompleteBounds = new CoordinateBounds(north, east);
PresentViewController(autocompleteController, true, null);
};
- 這是可選的,但是我新增了一個計算本地邊界的函式,我在 3000 中傳遞這個數字是以米為單位,所以如果你想要一個更大的初始邊界隨意調整,請注意谷歌搜尋仍然會找到任何地址在世界上,它只是首先將初始結果加權到這個區域性區域。這個函式是從堆疊溢位的帖子中借來的,我已經將它從 Swift 轉換為 C#用於我們的目的:
public CLLocationCoordinate2D LocationWithBearing(Double bearing, Double distanceMeters, CLLocationCoordinate2D origin)
{
var distRadians = distanceMeters/(6372797.6);
var rbearing = bearing*Math.PI/180.0;
var lat1 = origin.Latitude*Math.PI/180;
var lon1 = origin.Longitude*Math.PI/180;
var lat2 = Math.Asin(Math.Sin(lat1)*Math.Cos(distRadians) + Math.Cos(lat1)*Math.Sin(distRadians)*Math.Cos(rbearing));
var lon2 = lon1 + Math.Atan2(Math.Sin(rbearing)*Math.Sin(distRadians)*Math.Cos(lat1),
Math.Cos(distRadians) - Math.Sin(lat1)*Math.Sin(lat2));
return new CLLocationCoordinate2D(latitude: lat2*180/ Math.PI, longitude: lon2*180/Math.PI);
}
- 這個最終的程式碼段是自動完成的代理,我們需要這個代理來處理谷歌將返回給我們的所有內容:
public class AutoCompleteDelegate : AutocompleteViewControllerDelegate
{
public override void DidFailAutocomplete(AutocompleteViewController viewController, NSError error)
{
// TODO: handle the error.
Debug.Print("Error: " + error.Description);
}
public override void DidAutocomplete(AutocompleteViewController viewController, Place place)
{
Debug.Print(place.Name);
Debug.Print(place.FormattedAddress);
viewController.DismissViewController(true, null);
}
public override void DidRequestAutocompletePredictions(AutocompleteViewController viewController)
{
UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;
}
public override void DidUpdateAutocompletePredictions(AutocompleteViewController viewController)
{
UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;
}
public override void WasCancelled(AutocompleteViewController viewController)
{
viewController.DismissViewController(true, null);
}
}
執行你的專案,它應該工作得很好,這個例子非常集中,但希望它直到給你一個基本的例子,說明任何谷歌自動完成 UI 控制元件將如何工作。謝謝!