수색…


소개

Xamarin으로 작업을 시작한 이래로 이미 다른 사람이 문서화했으면하는 바램이 많이있었습니다. 여기에 Google 장소 자동 완성의 한 측면 인 UI 컨트롤러가 결과 컨트롤러를 사용하는 방법이 설명되어 있습니다. 이 코드는 Swog에서 C #으로 변환 된 Google의 자체 예제를 기반으로 작성되었지만 완전히 작동하는 예제인지 확인하기 위해 최선을 다했습니다. 이 문서가 다른 사람들에게 도움이되기를 바랍니다.

결과 컨트롤러가있는 자동 완성 UI 컨트롤을 추가하십시오.

자동 완성 UI 컨트롤은 자동 완성 기능이 내장 된 검색 대화 상자입니다. 사용자가 검색어를 입력하면 컨트롤에서 선택할 예상 장소 목록을 표시합니다. 사용자가 선택하면 GMSPlace (Xamarin에 배치) 인스턴스가 반환되어 앱에서 선택한 장소에 대한 세부 정보를 얻을 수 있습니다.

위에서 언급했듯이이 예제에서는 텍스트 입력 UI를보다 잘 제어 할 수있는 결과 컨트롤러를 사용합니다. 결과 컨트롤러는 입력 UI 포커스를 기반으로 결과 목록의 가시성을 동적으로 전환합니다.

이 코드의 목적은 아래와 같은 화면을 표시하는 것입니다.

여기에 이미지 설명을 입력하십시오.

그러면 아래 그림과 같이 타이핑을 시작할 때 주소가 자동 완성됩니다.

여기에 이미지 설명을 입력하십시오.

명령:

  1. 먼저 Google Maps API를 Visual Studio에 추가해야합니다. Nuget을 통해 사용할 수 있으며 Xamarin.Google.iOS.Maps를 검색하고 iOS 프로젝트에 추가하거나 Xamarin Xamarin Google Maps iOS SDK 에서 다운로드 할 수 있습니다.

  2. Google은 자동 완성보기 컨트롤러를 트리거하는 버튼과 같은 것을 필요로합니다. 이 예제에서는 스토리 보드로이 작업을 수행하고 GoogleButton이라는 버튼을 추가했습니다. 실제로 중요하지 않은 코드로 트리거 할 수 있습니다.

  3. 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);
                
};
  1. 이것은 선택 사항이지만 지역 경계를 계산하는 함수를 추가했습니다.이 숫자는 미터 단위로 전달되므로 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);
}
  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 자동 완성 UI 컨트롤이 작동해야하는 방식에 대한 기본 예제를 제공 할 때까지 기다려 주시기 바랍니다. 감사!



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow