Buscar..


Introducción

Desde que empecé a trabajar con Xamarin, ha habido muchas cosas que desearía que alguien más ya hubiera documentado. Aquí explico cómo usar 1 aspecto del autocompletado de Google Places, el control de la interfaz de usuario que utiliza un controlador de resultados. Si bien este código se basa en los propios ejemplos de google convertidos a C # desde Swift, he intentado todo lo posible para asegurarme de que sea un ejemplo completamente funcional. Espero mucho que esta documentación ayude a otros.

Agregue un control de interfaz de usuario autocompletado con el controlador de resultados.

El control de IU de autocompletado es un cuadro de diálogo de búsqueda con una funcionalidad de autocompletar incorporada. Cuando un usuario ingresa los términos de búsqueda, el control presenta una lista de lugares pronosticados para elegir. Cuando el usuario realiza una selección, se devuelve una instancia de GMSPlace (Lugar en Xamarin), que su aplicación puede usar para obtener detalles sobre el lugar seleccionado.

Como se mencionó anteriormente, este ejemplo utiliza un controlador de resultados que permite un mayor control sobre la IU de entrada de texto. El controlador de resultados alternará dinámicamente la visibilidad de la lista de resultados según el enfoque de la IU de entrada.

El objetivo de este código es mostrar una pantalla como la siguiente:

introduzca la descripción de la imagen aquí

Esto autocompletará su dirección cuando comience a escribir, como en la siguiente imagen:

introduzca la descripción de la imagen aquí

Instrucciones:

  1. Primero necesitamos agregar la API de Google Maps a nuestro Visual Studio, está disponible a través de Nuget, solo busca Xamarin.Google.iOS.Maps, agrégalo a tu proyecto de iOS, o puedes descargarlo de Xamarin Xamarin Google Maps iOS SDK

  2. Necesitamos algo como un botón para activar el controlador de vista de autocompletar de Google. En este ejemplo, hago esto con un panel de historia y he agregado un botón llamado GoogleButton, podría activarlo con un código que en realidad no importa.

  3. Bajo ViewDidLoad en su clase de controladores de vista agregue el siguiente código. En mi ejemplo a continuación, no estoy usando la ubicación real de los dispositivos móviles, por supuesto, mi solución final haría esto, pero esto fue una prueba y no quise implementar código adicional hasta que probé que esto funcionó o diluyo lo que estoy intentando para mostrarte:

// Código para que aparezca el controlador de vista automática de Google Places.

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. Esto es opcional, pero he agregado una función para calcular los límites locales, estoy pasando en 3000, este número está en metros, por lo que si desea un límite inicial mayor, no dude en ajustar, tenga en cuenta que la búsqueda de Google seguirá encontrando cualquier dirección en el mundo, solo carga primero los resultados iniciales a los límites de estas áreas locales. Esta función fue tomada de una publicación de desbordamiento de pila, la he convertido de Swift a C # para nuestros propósitos:
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. Este fragmento de código final es el delegado del autocompletado, necesitamos que este delegado se encargue de todo lo que Google nos devolverá:
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);
    }

}

Ejecute su proyecto y debería funcionar a la perfección; este ejemplo está bastante centrado, pero esperamos que le brinde un ejemplo básico de cómo debería funcionar cualquiera de los controles de la interfaz de usuario de Google Autocompletar. ¡Gracias!



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow