使用結果控制器新增自動完成 UI 控制元件

自動完成 UI 控制元件是具有內建自動完成功能的搜尋對話方塊。當使用者輸入搜尋項時,控制元件顯示可供選擇的預測位置列表。當使用者進行選擇時,將返回 GMSPlace(放置在 Xamarin 中)例項,然後你的應用可以使用該例項獲取有關所選位置的詳細資訊。

如上所述,該示例使用結果控制器,其允許對文字輸入 UI 的更多控制。結果控制器將根據輸入的 UI 焦點動態切換結果列表的可見性。

此程式碼的目的是顯示如下所示的螢幕:

StackOverflow 文件

這將在你開始輸入時自動填寫你的地址,如下圖所示:

StackOverflow 文件

說明:

  1. 首先我們需要將谷歌地圖 API 新增到我們的 Visual Studio,它可以通過 Nuget 獲得,只需搜尋 Xamarin.Google.iOS.Maps,將其新增到你的 iOS 專案,或者你可以從 Xamarin Xamarin 谷歌地圖 iOS SDK 下載它

  2. 我們需要類似按鈕來觸發谷歌自動完成檢視控制器。在這個例子中,我用故事板做了這個,並新增了一個名為 GoogleButton 的按鈕,你可以使用它並不重要的程式碼來觸發它。

  3. 在檢視控制器類的 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);
                
};
  1. 這是可選的,但是我新增了一個計算本地邊界的函式,我在 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);
}
  1. 這個最終的程式碼段是自動完成的代理,我們需要這個代理來處理谷歌將返回給我們的所有內容:
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 控制元件將如何工作。謝謝!