Xamarin.iOS
Completamento automatico di Xamarin iOS Google Places
Ricerca…
introduzione
Da quando ho iniziato a lavorare con Xamarin ci sono state molte cose che vorrei che qualcun altro avesse già documentato. Qui spiego come utilizzare 1 aspetto del completamento automatico di Google Places, il controllo dell'interfaccia utente che utilizza un controller dei risultati. Mentre questo codice si basa su esempi propri di googles convertiti in C # da Swift, ho fatto del mio meglio per assicurarmi che fosse un esempio pienamente funzionante. Spero davvero che questa documentazione aiuti gli altri.
Aggiungi un controllo dell'interfaccia utente con completamento automatico con controller dei risultati.
Il controllo dell'interfaccia utente di completamento automatico è una finestra di dialogo di ricerca con funzionalità di completamento automatico integrata. Quando un utente inserisce i termini di ricerca, il controllo presenta un elenco di luoghi previsti tra cui scegliere. Quando l'utente effettua una selezione, viene restituita un'istanza GMSPlace (Place in Xamarin), che l'app può quindi utilizzare per ottenere dettagli sul luogo selezionato.
Come accennato in precedenza, questo esempio utilizza un controller dei risultati che consente un maggiore controllo sull'interfaccia utente di input del testo. Il controller dei risultati attiva dinamicamente la visibilità dell'elenco dei risultati in base alla messa a fuoco dell'interfaccia utente di input.
Lo scopo di questo codice è quello di visualizzare uno schermo come il seguente:
Questo completerà automaticamente il tuo indirizzo quando inizi a digitare, come l'immagine qui sotto:
Istruzioni:
Per prima cosa dobbiamo aggiungere l'API di google maps al nostro Visual Studio, è disponibile tramite Nuget, basta cercare Xamarin.Google.iOS.Maps, aggiungerlo al tuo progetto iOS, in alternativa puoi scaricarlo da Xamarin Xamarin Google Maps iOS SDK
Abbiamo bisogno di qualcosa come un pulsante per attivare il controller di visualizzazione di completamento automatico di google. In questo esempio lo faccio con una story board e ho aggiunto un pulsante chiamato GoogleButton, potresti attivarlo con un codice che non ha molta importanza.
Sotto ViewDidLoad nella tua classe di controller di visualizzazione aggiungi il seguente codice. Nel mio esempio qui sotto non sto utilizzando la posizione effettiva dei dispositivi mobili, la mia soluzione finale ovviamente lo farebbe, ma questo era un test e non volevo implementare codice extra fino a quando non avessi dimostrato che funzionava o diluivo quello che sto provando mostrarti:
// Codice per visualizzare il controller di visualizzazione completo di 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);
};
- Questo è facoltativo, ma ho aggiunto una funzione per calcolare i limiti locali, sto passando 3000 in questo numero è in metri, quindi se vuoi che i limiti iniziali più grandi si sentano liberi di regolare, tieni presente che la ricerca di google troverà comunque qualsiasi indirizzo nel mondo, si limitano a pesare prima i risultati iniziali su queste aree locali. Questa funzione è stata presa in prestito da un post di overflow dello stack, l'ho convertita da Swift in C # per i nostri scopi:
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);
}
- Questo snippet di codice finale è il delegato per il completamento automatico, abbiamo bisogno di questo delegato per gestire tutto ciò che Google ci restituirà:
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);
}
}
Esegui il tuo progetto e dovrebbe funzionare perfettamente, questo esempio è abbastanza focalizzato, ma spero che questo ti fornisca un esempio di base su come uno qualsiasi dei controlli dell'interfaccia utente di google autocomplete dovrebbe funzionare. Grazie!