Xamarin.iOS
Автозаполнение Xalarin iOS Google Места
Поиск…
Вступление
Начиная с начала работы с Xamarin было много вещей, которые я хотел бы, чтобы кто-то еще задокументировал. Здесь я объясню, как использовать 1 аспект автозаполнения мест google, элемент управления пользовательского интерфейса, использующий контроллер результатов. Хотя этот код основан на примерах Google, преобразованных в C # из Swift, я старался изо всех сил убедиться, что это полностью рабочий пример. Надеюсь, что эта документация поможет другим.
Добавьте элемент управления пользовательского интерфейса автозаполнения с помощью контроллера результатов.
Элемент управления автозаполнения - это диалоговое окно поиска со встроенной функцией автозаполнения. Когда пользователь вводит поисковые запросы, элемент управления представляет список прогнозируемых мест на выбор. Когда пользователь делает выбор, возвращается экземпляр GMSPlace (место в Xamarin), который ваше приложение затем может использовать для получения сведений о выбранном месте.
Как уже упоминалось выше, в этом примере используется контроллер результатов, который позволяет больше контролировать интерфейс ввода текста. Контроллер результатов будет динамически переключать видимость списка результатов на основе фокуса входного интерфейса.
Цель этого кода - отобразить экран, как показано ниже:
Это приведет к автозаполнению вашего адреса при вводе текста, как показано на рисунке ниже:
Инструкции:
Сначала нам нужно добавить API-интерфейс google в нашу Visual Studio, он доступен через Nuget, просто найдите Xamarin.Google.iOS.Maps, добавьте его в свой проект iOS, в качестве альтернативы вы можете скачать его с Xamarin Xamarin Google Maps iOS SDK
Нам нужно что-то вроде кнопки, чтобы вызвать контроллер просмотра автозаполнения google. В этом примере я делаю это с доской истории и добавил кнопку с именем GoogleButton, вы можете запустить ее с кодом, это не имеет большого значения.
В представлении ViewDidLoad в классе контроллеров вашего вида добавьте следующий код. В моем примере ниже я не использую фактическое местоположение мобильных устройств, мое окончательное решение, конечно же, сделало бы это, но это был тест, и я не хотел реализовывать дополнительный код, пока не доказал, что это сработало или разбавит то, что я пытаюсь показать тебе:
// Код, чтобы открыть автозаполненный контроллер просмотра google.
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);
}
- Этот окончательный фрагмент кода является делегатом для автозаполнения, нам нужен этот делегат для обработки всего того, что google вернется к нам:
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);
}
}
Запустите свой проект, и он должен работать отлично, этот пример довольно сфокусирован, но, надеюсь, он покажет вам базовый пример того, как любой из элементов управления автозаполнением Google будет работать. Спасибо!