Поиск…


Вступление

Начиная с начала работы с Xamarin было много вещей, которые я хотел бы, чтобы кто-то еще задокументировал. Здесь я объясню, как использовать 1 аспект автозаполнения мест google, элемент управления пользовательского интерфейса, использующий контроллер результатов. Хотя этот код основан на примерах Google, преобразованных в C # из Swift, я старался изо всех сил убедиться, что это полностью рабочий пример. Надеюсь, что эта документация поможет другим.

Добавьте элемент управления пользовательского интерфейса автозаполнения с помощью контроллера результатов.

Элемент управления автозаполнения - это диалоговое окно поиска со встроенной функцией автозаполнения. Когда пользователь вводит поисковые запросы, элемент управления представляет список прогнозируемых мест на выбор. Когда пользователь делает выбор, возвращается экземпляр GMSPlace (место в Xamarin), который ваше приложение затем может использовать для получения сведений о выбранном месте.

Как уже упоминалось выше, в этом примере используется контроллер результатов, который позволяет больше контролировать интерфейс ввода текста. Контроллер результатов будет динамически переключать видимость списка результатов на основе фокуса входного интерфейса.

Цель этого кода - отобразить экран, как показано ниже:

введите описание изображения здесь

Это приведет к автозаполнению вашего адреса при вводе текста, как показано на рисунке ниже:

введите описание изображения здесь

Инструкции:

  1. Сначала нам нужно добавить API-интерфейс google в нашу Visual Studio, он доступен через Nuget, просто найдите Xamarin.Google.iOS.Maps, добавьте его в свой проект iOS, в качестве альтернативы вы можете скачать его с Xamarin Xamarin Google Maps iOS SDK

  2. Нам нужно что-то вроде кнопки, чтобы вызвать контроллер просмотра автозаполнения google. В этом примере я делаю это с доской истории и добавил кнопку с именем GoogleButton, вы можете запустить ее с кодом, это не имеет большого значения.

  3. В представлении 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);
                
};
  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. Этот окончательный фрагмент кода является делегатом для автозаполнения, нам нужен этот делегат для обработки всего того, что 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 будет работать. Спасибо!



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow