使用结果控制器添加自动完成 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 控件将如何工作。谢谢!