Xamarin.iOS
Xamarin iOS Google 지역 정보 자동 완성
수색…
소개
Xamarin으로 작업을 시작한 이래로 이미 다른 사람이 문서화했으면하는 바램이 많이있었습니다. 여기에 Google 장소 자동 완성의 한 측면 인 UI 컨트롤러가 결과 컨트롤러를 사용하는 방법이 설명되어 있습니다. 이 코드는 Swog에서 C #으로 변환 된 Google의 자체 예제를 기반으로 작성되었지만 완전히 작동하는 예제인지 확인하기 위해 최선을 다했습니다. 이 문서가 다른 사람들에게 도움이되기를 바랍니다.
결과 컨트롤러가있는 자동 완성 UI 컨트롤을 추가하십시오.
자동 완성 UI 컨트롤은 자동 완성 기능이 내장 된 검색 대화 상자입니다. 사용자가 검색어를 입력하면 컨트롤에서 선택할 예상 장소 목록을 표시합니다. 사용자가 선택하면 GMSPlace (Xamarin에 배치) 인스턴스가 반환되어 앱에서 선택한 장소에 대한 세부 정보를 얻을 수 있습니다.
위에서 언급했듯이이 예제에서는 텍스트 입력 UI를보다 잘 제어 할 수있는 결과 컨트롤러를 사용합니다. 결과 컨트롤러는 입력 UI 포커스를 기반으로 결과 목록의 가시성을 동적으로 전환합니다.
이 코드의 목적은 아래와 같은 화면을 표시하는 것입니다.
그러면 아래 그림과 같이 타이핑을 시작할 때 주소가 자동 완성됩니다.
명령:
먼저 Google Maps API를 Visual Studio에 추가해야합니다. Nuget을 통해 사용할 수 있으며 Xamarin.Google.iOS.Maps를 검색하고 iOS 프로젝트에 추가하거나 Xamarin Xamarin Google Maps iOS SDK 에서 다운로드 할 수 있습니다.
Google은 자동 완성보기 컨트롤러를 트리거하는 버튼과 같은 것을 필요로합니다. 이 예제에서는 스토리 보드로이 작업을 수행하고 GoogleButton이라는 버튼을 추가했습니다. 실제로 중요하지 않은 코드로 트리거 할 수 있습니다.
View Controller 클래스의 ViewDidLoad 아래에 다음 코드를 추가하십시오. 위의 예에서 모바일 장치의 실제 위치를 사용하지는 않지만 최종 솔루션은 물론 이렇게 할 것입니다. 그러나 이것은 테스트 였고 내가 시도한 것을 실제로 작동 시키거나 희석 시켰음을 증명할 때까지 여분의 코드를 구현하고 싶지 않았습니다. 보여주기 위해 :
// google place auto complete view 컨트롤러를 불러오는 코드.
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보다 큰 초기 경계를 자유롭게 조정하려면 Google 검색에서 여전히 주소를 찾을 수 있습니다. 세계에서 처음에는이 지역 경계선까지 초기 결과에 무게를 둡니다. 이 함수는 스택 오버플로 포스트에서 빌려 왔으며 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 자동 완성 UI 컨트롤이 작동해야하는 방식에 대한 기본 예제를 제공 할 때까지 기다려 주시기 바랍니다. 감사!