サーチ…


前書き

Xamarinでの作業を開始して以来、他の誰かが既に文書化しておきたいことがたくさんありました。ここでは、google place autocompletionの1つの側面(結果コントロールを使用するUIコントロール)を使用する方法を説明します。このコードは、Swiftから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 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. これはオプションですが、私はローカル境界を計算する関数を追加しました。私はこの数値をメートル単位で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