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