Yer Adı Otomatik Tamamlama (Eski)

Yer Adı Otomatik Tamamlama (Eski), kullanıcıların arama sorgularına yanıt olarak yer tahminleri döndürür. Kullanıcı yazarken otomatik tamamlama hizmeti; işletmeler, adresler, Plus Kodlar ve önemli yerler gibi yerler için öneriler döndürür.

Uygulamanıza otomatik tamamlama özelliğini aşağıdaki yöntemlerle ekleyebilirsiniz:

Otomatik tamamlama kullanıcı arayüzü kontrolü ekleme

Otomatik tamamlama kullanıcı arayüzü kontrolü, yerleşik otomatik tamamlama işlevine sahip bir arama iletişim kutusudur. Kullanıcı arama terimlerini girerken kontrol, seçilebilecek tahmini yerlerin listesini gösterir. Kullanıcı bir seçim yaptığında GMSPlace örneği döndürülür. Uygulamanız daha sonra bu örneği kullanarak seçilen yerle ilgili ayrıntıları alabilir.

Otomatik tamamlama kullanıcı arayüzü kontrolünü uygulamanıza aşağıdaki yöntemlerle ekleyebilirsiniz:

Tam ekran kontrolü ekleme

Kullanıcı seçimini yapana kadar otomatik tamamlama kullanıcı arayüzünün uygulamanızın kullanıcı arayüzünü geçici olarak değiştirdiği modal bir bağlam istediğinizde tam ekran kontrolünü kullanın. Bu işlev, GMSAutocompleteViewController sınıfı tarafından sağlanır. Kullanıcı bir yer seçtiğinde uygulamanız geri çağırma alır.

Uygulamanıza tam ekran kontrolü eklemek için:

  1. Ana uygulamanızda otomatik tamamlama kullanıcı arayüzü kontrolünü başlatmak için bir kullanıcı arayüzü öğesi (ör. UIButton üzerinde bir dokunma işleyici) oluşturun.
  2. Üst görünüm denetleyicisinde GMSAutocompleteViewControllerDelegate protokolünü uygulayın.
  3. GMSAutocompleteViewController öğesinin bir örneğini oluşturun ve üst görünüm denetleyicisini temsilci özelliği olarak atayın.
  4. Döndürülecek yer veri türlerini tanımlamak için GMSPlaceField oluşturun.
  5. Sorguyu belirli bir yer türüyle sınırlamak için GMSAutocompleteFilter ekleyin.
  6. [self presentViewController...] kullanarak GMSAutocompleteViewController sunun.
  7. Kullanıcının seçimini didAutocompleteWithPlace delegate yönteminde işleyin.
  8. didAutocompleteWithPlace, didFailAutocompleteWithError ve wasCancelled temsilci yöntemlerinde denetleyiciyi kapatın.

Aşağıdaki örnekte, kullanıcının bir düğmeye dokunması üzerine GMSAutocompleteViewController'ı başlatmanın olası bir yolu gösterilmektedir.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  override func viewDidLoad() {
    makeButton()
  }

  // Present the Autocomplete view controller when the button is pressed.
  @objc func autocompleteClicked(_ sender: UIButton) {
    let autocompleteController = GMSAutocompleteViewController()
    autocompleteController.delegate = self

    // Specify the place data types to return.
    let fields: GMSPlaceField = GMSPlaceField(rawValue: UInt(GMSPlaceField.name.rawValue) |
      UInt(GMSPlaceField.placeID.rawValue))!
    autocompleteController.placeFields = fields

    // Specify a filter.
    let filter = GMSAutocompleteFilter()
    filter.types = [kGMSPlaceTypeCollectionAddress]
    autocompleteController.autocompleteFilter = filter

    // Display the autocomplete view controller.
    present(autocompleteController, animated: true, completion: nil)
  }

  // Add a button to the view.
  func makeButton() {
    let btnLaunchAc = UIButton(frame: CGRect(x: 5, y: 150, width: 300, height: 35))
    btnLaunchAc.backgroundColor = .blue
    btnLaunchAc.setTitle("Launch autocomplete", for: .normal)
    btnLaunchAc.addTarget(self, action: #selector(autocompleteClicked), for: .touchUpInside)
    self.view.addSubview(btnLaunchAc)
  }

}

extension ViewController: GMSAutocompleteViewControllerDelegate {

  // Handle the user's selection.
  func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
    print("Place name: \(place.name)")
    print("Place ID: \(place.placeID)")
    print("Place attributions: \(place.attributions)")
    dismiss(animated: true, completion: nil)
  }

  func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) {
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // User canceled the operation.
  func wasCancelled(_ viewController: GMSAutocompleteViewController) {
    dismiss(animated: true, completion: nil)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }

}

Objective-C

#import "ViewController.h"
@import GooglePlaces;

@interface ViewController () <GMSAutocompleteViewControllerDelegate>

@end

@implementation ViewController {
  GMSAutocompleteFilter *_filter;
}

-   (void)viewDidLoad {
  [super viewDidLoad];
  [self makeButton];
}

  // Present the autocomplete view controller when the button is pressed.
-   (void)autocompleteClicked {
  GMSAutocompleteViewController *acController = [[GMSAutocompleteViewController alloc] init];
  acController.delegate = self;

  // Specify the place data types to return.
  GMSPlaceField fields = (GMSPlaceFieldName | GMSPlaceFieldPlaceID);
  acController.placeFields = fields;

  // Specify a filter.
  _filter = [[GMSAutocompleteFilter alloc] init];
  _filter.types = @[ kGMSPlaceTypeBank ];
  acController.autocompleteFilter = _filter;

  // Display the autocomplete view controller.
  [self presentViewController:acController animated:YES completion:nil];
}

  // Add a button to the view.
-   (void)makeButton{
  UIButton *btnLaunchAc = [UIButton buttonWithType:UIButtonTypeCustom];
  [btnLaunchAc addTarget:self
             action:@selector(autocompleteClicked) forControlEvents:UIControlEventTouchUpInside];
  [btnLaunchAc setTitle:@"Launch autocomplete" forState:UIControlStateNormal];
  btnLaunchAc.frame = CGRectMake(5.0, 150.0, 300.0, 35.0);
  btnLaunchAc.backgroundColor = [UIColor blueColor];
  [self.view addSubview:btnLaunchAc];
}

  // Handle the user's selection.
-   (void)viewController:(GMSAutocompleteViewController *)viewController
didAutocompleteWithPlace:(GMSPlace *)place {
  [self dismissViewControllerAnimated:YES completion:nil];
  // Do something with the selected place.
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place ID %@", place.placeID);
  NSLog(@"Place attributions %@", place.attributions.string);
}

-   (void)viewController:(GMSAutocompleteViewController *)viewController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

  // User canceled the operation.
-   (void)wasCancelled:(GMSAutocompleteViewController *)viewController {
  [self dismissViewControllerAnimated:YES completion:nil];
}

  // Turn the network activity indicator on and off again.
-   (void)didRequestAutocompletePredictions:(GMSAutocompleteViewController *)viewController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

-   (void)didUpdateAutocompletePredictions:(GMSAutocompleteViewController *)viewController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

@end

Sonuç denetleyicisi ekleme

Metin girişi kullanıcı arayüzü üzerinde daha fazla kontrol sahibi olmak istediğinizde sonuç denetleyicisi kullanın. Sonuç denetleyicisi, giriş kullanıcı arayüzü odağına göre sonuç listesinin görünürlüğünü dinamik olarak açıp kapatır.

Uygulamanıza sonuç denetleyicisi eklemek için:

  1. GMSAutocompleteResultsViewController oluşturun.
    1. Üst görünüm denetleyicisinde GMSAutocompleteResultsViewControllerDelegate protokolünü uygulayın ve üst görünüm denetleyicisini temsilci özelliği olarak atayın.
  2. Sonuç denetleyici bağımsız değişkeni olarak GMSAutocompleteResultsViewController değerini ileterek bir UISearchController nesnesi oluşturun.
  3. GMSAutocompleteResultsViewController öğesini UISearchController öğesinin searchResultsUpdater özelliği olarak ayarlayın.
  4. UISearchController için searchBar öğesini uygulamanızın kullanıcı arayüzüne ekleyin.
  5. Kullanıcının seçimini didAutocompleteWithPlace delegate yönteminde işleyin.

UISearchController arama çubuğunu uygulamanızın kullanıcı arayüzüne yerleştirmenin birkaç yolu vardır:

Gezinme çubuğuna arama çubuğu ekleme

Aşağıdaki kod örneğinde, sonuç denetleyicisi ekleme, gezinme çubuğuna searchBar ekleme ve kullanıcının seçimini işleme gösterilmektedir:

Swift

class ViewController: UIViewController {

  var resultsViewController: GMSAutocompleteResultsViewController?
  var searchController: UISearchController?
  var resultView: UITextView?

  override func viewDidLoad() {
    super.viewDidLoad()

    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self

    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    // Put the search bar in the navigation bar.
    searchController?.searchBar.sizeToFit()
    navigationItem.titleView = searchController?.searchBar

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    definesPresentationContext = true

    // Prevent the navigation bar from being hidden when searching.
    searchController?.hidesNavigationBarDuringPresentation = false
  }
}

// Handle the user's selection.
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didAutocompleteWith place: GMSPlace) {
    searchController?.isActive = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didFailAutocompleteWithError error: Error){
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(_ viewController: GMSAutocompleteViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }
}

Objective-C

-   (void)viewDidLoad {
  _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init];
  _resultsViewController.delegate = self;

  _searchController = [[UISearchController alloc]
                       initWithSearchResultsController:_resultsViewController];
  _searchController.searchResultsUpdater = _resultsViewController;

  // Put the search bar in the navigation bar.
  [_searchController.searchBar sizeToFit];
  self.navigationItem.titleView = _searchController.searchBar;

  // When UISearchController presents the results view, present it in
  // this view controller, not one further up the chain.
  self.definesPresentationContext = YES;

  // Prevent the navigation bar from being hidden when searching.
  _searchController.hidesNavigationBarDuringPresentation = NO;
}

// Handle the user's selection.
-   (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
  didAutocompleteWithPlace:(GMSPlace *)place {
    _searchController.active = NO;
    // Do something with the selected place.
    NSLog(@"Place name %@", place.name);
    NSLog(@"Place address %@", place.formattedAddress);
    NSLog(@"Place attributions %@", place.attributions.string);
}

-   (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// Turn the network activity indicator on and off again.
-   (void)didRequestAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

-   (void)didUpdateAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

Görünümün üst kısmına arama çubuğu ekleme

Aşağıdaki kod örneğinde, searchBar öğesinin bir görünümün üst kısmına nasıl ekleneceği gösterilmektedir.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  var resultsViewController: GMSAutocompleteResultsViewController?
  var searchController: UISearchController?
  var resultView: UITextView?

  override func viewDidLoad() {
    super.viewDidLoad()

    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self

    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    let subView = UIView(frame: CGRect(x: 0, y: 65.0, width: 350.0, height: 45.0))

    subView.addSubview((searchController?.searchBar)!)
    view.addSubview(subView)
    searchController?.searchBar.sizeToFit()
    searchController?.hidesNavigationBarDuringPresentation = false

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    definesPresentationContext = true
  }
}

// Handle the user's selection.
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didAutocompleteWith place: GMSPlace) {
    searchController?.isActive = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didFailAutocompleteWithError error: Error){
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }
}

Objective-C

-   (void)viewDidLoad {
    [super viewDidLoad];

    _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init];
    _resultsViewController.delegate = self;

    _searchController = [[UISearchController alloc]
                             initWithSearchResultsController:_resultsViewController];
    _searchController.searchResultsUpdater = _resultsViewController;

    UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 65.0, 250, 50)];

    [subView addSubview:_searchController.searchBar];
    [_searchController.searchBar sizeToFit];
    [self.view addSubview:subView];

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    self.definesPresentationContext = YES;
}

// Handle the user's selection.
-   (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didAutocompleteWithPlace:(GMSPlace *)place {
  [self dismissViewControllerAnimated:YES completion:nil];
  // Do something with the selected place.
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place address %@", place.formattedAddress);
  NSLog(@"Place attributions %@", place.attributions.string);
}

-   (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// Turn the network activity indicator on and off again.
-   (void)didRequestAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

-   (void)didUpdateAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

Varsayılan olarak, UISearchController sunum yaparken gezinme çubuğunu gizler (bu ayar devre dışı bırakılabilir). Gezinme çubuğunun görünür ve opak olduğu durumlarda UISearchController, yerleşimi doğru şekilde ayarlamaz.

Geçici çözüm olarak aşağıdaki kodu kullanın:

Swift

navigationController?.navigationBar.translucent = false
searchController?.hidesNavigationBarDuringPresentation = false

// This makes the view area include the nav bar even though it is opaque.
// Adjust the view placement down.
self.extendedLayoutIncludesOpaqueBars = true
self.edgesForExtendedLayout = .top

Objective-C

self.navigationController.navigationBar.translucent = NO;
_searchController.hidesNavigationBarDuringPresentation = NO;

// This makes the view area include the nav bar even though it is opaque.
// Adjust the view placement down.
self.extendedLayoutIncludesOpaqueBars = YES;
self.edgesForExtendedLayout = UIRectEdgeTop;

Pop-over sonuçlarını kullanarak arama çubuğu ekleme

Aşağıdaki kod örneğinde, gezinme çubuğunun sağ tarafına bir arama çubuğu yerleştirme ve sonuçları bir popover'da görüntüleme gösterilmektedir.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  var resultsViewController: GMSAutocompleteResultsViewController?
  var searchController: UISearchController?
  var resultView: UITextView?

  override func viewDidLoad() {
    super.viewDidLoad()

    resultsViewController = GMSAutocompleteResultsViewController()
    resultsViewController?.delegate = self

    searchController = UISearchController(searchResultsController: resultsViewController)
    searchController?.searchResultsUpdater = resultsViewController

    // Add the search bar to the right of the nav bar,
    // use a popover to display the results.
    // Set an explicit size as we don't want to use the entire nav bar.
    searchController?.searchBar.frame = (CGRect(x: 0, y: 0, width: 250.0, height: 44.0))
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: (searchController?.searchBar)!)

    // When UISearchController presents the results view, present it in
    // this view controller, not one further up the chain.
    definesPresentationContext = true

    // Keep the navigation bar visible.
    searchController?.hidesNavigationBarDuringPresentation = false
    searchController?.modalPresentationStyle = .popover
  }
}
// Handle the user's selection.
extension ViewController: GMSAutocompleteResultsViewControllerDelegate {
  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didAutocompleteWith place: GMSPlace) {
    searchController?.isActive = false
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func resultsController(_ resultsController: GMSAutocompleteResultsViewController,
                         didFailAutocompleteWithError error: Error){
    // TODO: handle the error.
    print("Error: ", error.localizedDescription)
  }

  // Turn the network activity indicator on and off again.
  func didRequestAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  func didUpdateAutocompletePredictions(forResultsController resultsController: GMSAutocompleteResultsViewController) {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }
}

Objective-C

-   (void)viewDidLoad {
  [super viewDidLoad];

  _resultsViewController = [[GMSAutocompleteResultsViewController alloc] init];
  _resultsViewController.delegate = self;

  _searchController = [[UISearchController alloc]
                           initWithSearchResultsController:_resultsViewController];
  _searchController.searchResultsUpdater = _resultsViewController;

  // Add the search bar to the right of the nav bar,
  // use a popover to display the results.
  // Set an explicit size as we don't want to use the entire nav bar.
  _searchController.searchBar.frame = CGRectMake(0, 0, 250.0f, 44.0f);
  self.navigationItem.rightBarButtonItem =
  [[UIBarButtonItem alloc] initWithCustomView:_searchController.searchBar];

  // When UISearchController presents the results view, present it in
  // this view controller, not one further up the chain.
  self.definesPresentationContext = YES;

  // Keep the navigation bar visible.
  _searchController.hidesNavigationBarDuringPresentation = NO;

  _searchController.modalPresentationStyle = UIModalPresentationPopover;
}

// Handle the user's selection.
-   (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didAutocompleteWithPlace:(GMSPlace *)place {
  [self dismissViewControllerAnimated:YES completion:nil];
  NSLog(@"Place name %@", place.name);
  NSLog(@"Place address %@", place.formattedAddress);
  NSLog(@"Place attributions %@", place.attributions.string);
}

-   (void)resultsController:(GMSAutocompleteResultsViewController *)resultsController
didFailAutocompleteWithError:(NSError *)error {
  [self dismissViewControllerAnimated:YES completion:nil];
  // TODO: handle the error.
  NSLog(@"Error: %@", [error description]);
}

// Turn the network activity indicator on and off again.
-   (void)didRequestAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

-   (void)didUpdateAutocompletePredictionsForResultsController:
    (GMSAutocompleteResultsViewController *)resultsController {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

Tablo veri kaynağı kullanma

Uygulamanızda özel bir arama metni kullanıcı arayüzü varsa sonuçları görünüm denetleyicisinde görüntüleyen tablo görünümünü yönlendirmek için GMSAutocompleteTableDataSource sınıfını kullanabilirsiniz.

Bir görünüm denetleyicisinde GMSAutocompleteTableDataSource veri kaynağı ve UITableView temsilcisi olarak kullanmak için:

  1. Görünüm denetleyicisinde GMSAutocompleteTableDataSourceDelegate ve UISearchBarDelegate protokollerini uygulayın.
  2. GMSAutocompleteTableDataSource örneği oluşturun ve görünüm denetleyicisini temsilci özelliği olarak atayın.
  3. GMSAutocompleteTableDataSource öğesini veri kaynağı olarak ayarlayın ve görünüm denetleyicisindeki UITableView örneğinin özelliklerini temsilciye atayın.
  4. Arama metni girişi için işleyicide sourceTextHasChanged işlevini GMSAutocompleteTableDataSource üzerinde çağırın.
    1. Kullanıcının seçimini didAutocompleteWithPlace delegate yönteminde işleyin.
  5. didAutocompleteWithPlace, didFailAutocompleteWithError, wasCancelled yetki verilmiş kullanıcı yöntemlerinde denetleyiciyi kapatın.

Aşağıdaki kod örneğinde, UISearchBar ayrı olarak eklendiğinde UIViewController öğesinin tablo görünümünü oluşturmak için GMSAutocompleteTableDataSource sınıfının nasıl kullanılacağı gösterilmektedir.

Swift

// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import GooglePlaces
import UIKit

class PlaceAutocompleteViewController: UIViewController {

  private var tableView: UITableView!
  private var tableDataSource: GMSAutocompleteTableDataSource!

  override func viewDidLoad() {
    super.viewDidLoad()

    let searchBar = UISearchBar(frame: CGRect(x: 0, y: 20, width: self.view.frame.size.width, height: 44.0))
    searchBar.delegate = self
    view.addSubview(searchBar)

    tableDataSource = GMSAutocompleteTableDataSource()
    tableDataSource.delegate = self

    tableView = UITableView(frame: CGRect(x: 0, y: 64, width: self.view.frame.size.width, height: self.view.frame.size.height - 44))
    tableView.delegate = tableDataSource
    tableView.dataSource = tableDataSource

    view.addSubview(tableView)
  }
}

extension PlaceAutocompleteViewController: UISearchBarDelegate {
  func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    // Update the GMSAutocompleteTableDataSource with the search text.
    tableDataSource.sourceTextHasChanged(searchText)
  }
}

extension PlaceAutocompleteViewController: GMSAutocompleteTableDataSourceDelegate {
  func didUpdateAutocompletePredictions(for tableDataSource: GMSAutocompleteTableDataSource) {
    // Turn the network activity indicator off.
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
    // Reload table data.
    tableView.reloadData()
  }

  func didRequestAutocompletePredictions(for tableDataSource: GMSAutocompleteTableDataSource) {
    // Turn the network activity indicator on.
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
    // Reload table data.
    tableView.reloadData()
  }

  func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didAutocompleteWith place: GMSPlace) {
    // Do something with the selected place.
    print("Place name: \(place.name)")
    print("Place address: \(place.formattedAddress)")
    print("Place attributions: \(place.attributions)")
  }

  func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didFailAutocompleteWithError error: Error) {
    // Handle the error.
    print("Error: \(error.localizedDescription)")
  }

  func tableDataSource(_ tableDataSource: GMSAutocompleteTableDataSource, didSelect prediction: GMSAutocompletePrediction) -> Bool {
    return true
  }
}

      

Objective-C

// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#import "PlaceAutocompleteViewController.h"
@import GooglePlaces;
@import UIKit;

@interface PlaceAutocompleteViewController () <GMSAutocompleteTableDataSourceDelegate, UISearchBarDelegate>

@end

@implementation PlaceAutocompleteViewController {
  UITableView *tableView;
  GMSAutocompleteTableDataSource *tableDataSource;
}

- (void)viewDidLoad {
  [super viewDidLoad];

  UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, 44)];
  searchBar.delegate = self;

  [self.view addSubview:searchBar];

  tableDataSource = [[GMSAutocompleteTableDataSource alloc] init];
  tableDataSource.delegate = self;

  tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height - 44)];
  tableView.delegate = tableDataSource;
  tableView.dataSource = tableDataSource;

  [self.view addSubview:tableView];
}

#pragma mark - GMSAutocompleteTableDataSourceDelegate

- (void)didUpdateAutocompletePredictionsForTableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource {
  // Turn the network activity indicator off.
  UIApplication.sharedApplication.networkActivityIndicatorVisible = NO;

  // Reload table data.
  [tableView reloadData];
}

- (void)didRequestAutocompletePredictionsForTableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource {
  // Turn the network activity indicator on.
  UIApplication.sharedApplication.networkActivityIndicatorVisible = YES;

  // Reload table data.
  [tableView reloadData];
}

- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didAutocompleteWithPlace:(GMSPlace *)place {
  // Do something with the selected place.
  NSLog(@"Place name: %@", place.name);
  NSLog(@"Place address: %@", place.formattedAddress);
  NSLog(@"Place attributions: %@", place.attributions);
}

- (void)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didFailAutocompleteWithError:(NSError *)error {
  // Handle the error
  NSLog(@"Error %@", error.description);
}

- (BOOL)tableDataSource:(GMSAutocompleteTableDataSource *)tableDataSource didSelectPrediction:(GMSAutocompletePrediction *)prediction {
  return YES;
}

#pragma mark - UISearchBarDelegate

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
  // Update the GMSAutocompleteTableDataSource with the search text.
  [tableDataSource sourceTextHasChanged:searchText];
}

@end

      

Metin ve arka plan renklerini özelleştirme

Widget'ın uygulamanızın görsel görünümüyle daha iyi eşleşmesi için otomatik tamamlama kullanıcı arayüzündeki tüm metin ve arka planların renklerini ayarlayabilirsiniz. Kullanıcı arayüzü kontrol renklerini ayarlamanın iki yolu vardır:

  • Mümkün olduğunda kullanıcı arayüzü kontrollerini genel olarak biçimlendirmek için yerleşik iOS UIAppearance protokolünü kullanarak. Bu ayarlar, kullanıcı arayüzü kontrol öğelerinin tümü için değil, çoğu için geçerlidir.
  • UIAppearance protokolü tarafından desteklenmeyen özellikleri ayarlamak için widget sınıflarındaki SDK yöntemlerini kullanma.

Genellikle uygulamanızda UIAppearance protokolü ve SDK yöntemlerinin bir kombinasyonu kullanılır. Aşağıdaki diyagramda, hangi öğelerin stilinin değiştirilebileceği gösterilmektedir:

Otomatik tamamlama kullanıcı arayüzü kontrol renkleri

Aşağıdaki tabloda tüm kullanıcı arayüzü öğeleri listelenmekte ve her birinin nasıl stil verilmesi gerektiği (UIAppearance protokolü veya SDK yöntemi) belirtilmektedir.

Kullanıcı arayüzü öğesi Yöntem Stil bilgileri
Gezinme çubuğu rengi (arka plan) UIAppearance protokolü UINavigationBar proxy'sinden setBarTintColor numaralı telefonu arayın.
Gezinme çubuğu ton rengi (arama çubuğu metin imleci ve İptal düğmesi) UIAppearance protokolü UINavigationBar proxy'sinden setTintColor numaralı telefonu arayın.
Arama çubuğu metin rengi UIAppearance protokolü searchBarTextAttributes içinde NSForegroundColorAttributeName olarak ayarlanır.
Arama çubuğu ton rengi Yok Arama çubuğu yarı saydamdır ve gezinme çubuğunun gölgeli bir versiyonu olarak gösterilir.
Arama çubuğu yer tutucu metin rengi (varsayılan arama metni) UIAppearance protokolü placeholderAttributes içinde NSForegroundColorAttributeName olarak ayarlanır.
Birincil metin (hata ve ileti metnine de uygulanır) SDK yöntemi primaryTextColor Hizmetleri İçin Arayın.
Birincil metin vurgulama SDK yöntemi primaryTextHighlightColor Hizmetleri İçin Arayın.
İkincil metin SDK yöntemi secondaryTextColor Hizmetleri İçin Arayın.
Hata ve mesaj metni SDK yöntemi primaryTextColor Hizmetleri İçin Arayın.
Tablo hücresi arka planı SDK yöntemi tableCellBackgroundColor Hizmetleri İçin Arayın.
Tablo hücresi ayırıcı rengi SDK yöntemi tableCellSeparatorColor Hizmetleri İçin Arayın.
"Yeniden Dene" düğmesi SDK yöntemi tintColor Hizmetleri İçin Arayın.
Etkinlik göstergesi (ilerleme çarkı) UIAppearance protokolü UIActivityIndicatorView proxy'sinden setColor numaralı telefonu arayın.
"Powered by Google" logosu, üzgün bulut resmi Yok Arka plan kontrastına göre beyaz veya gri sürüm otomatik olarak seçilir.
Arama çubuğu metin alanında büyüteç ve metni temizle simgeleri Yok Stil vermek için varsayılan resimleri istediğiniz renkteki resimlerle değiştirin.

UIAppearance protokolünü kullanma

Belirli bir kullanıcı arayüzü öğesinin görünüm proxy'sini almak için UIAppearance protocol'ü kullanabilirsiniz. Ardından, bu proxy'yi kullanarak kullanıcı arayüzü öğesinin rengini ayarlayabilirsiniz. Bir değişiklik yapıldığında, belirli bir kullanıcı arayüzü öğesinin tüm örnekleri etkilenir. Örneğin, aşağıdaki örnek, UITextField sınıflarının metin rengini UISearchBar içinde yer aldıklarında genel olarak yeşile değiştirir:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil]
    setDefaultTextAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]}];

Renk değerlerini tanımlama hakkında daha fazla bilgi için UIColor Class Reference başlıklı makaleyi inceleyin.

Aşağıdaki kod snippet'leri, tam ekran otomatik tamamlama kullanıcı arayüzü kontrolündeki her şeyi stillendirmek için kullanmanız gereken tüm proxy komutlarını gösterir. Bu kodu Appdelegate.m dosyasındaki didFinishLaunchingWithOptions yöntemine ekleyin:

// Define some colors.
UIColor *darkGray = [UIColor darkGrayColor];
UIColor *lightGray = [UIColor lightGrayColor];

// Navigation bar background.
[[UINavigationBar appearance] setBarTintColor:darkGray];
[[UINavigationBar appearance] setTintColor:lightGray];

// Color of typed text in the search bar.
NSDictionary *searchBarTextAttributes = @{
                                          NSForegroundColorAttributeName: lightGray,
                                          NSFontAttributeName : [UIFont systemFontOfSize:[UIFont systemFontSize]]
                                          };
[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
    .defaultTextAttributes = searchBarTextAttributes;

// Color of the placeholder text in the search bar prior to text entry.
NSDictionary *placeholderAttributes = @{
                                        NSForegroundColorAttributeName: lightGray,
                                        NSFontAttributeName : [UIFont systemFontOfSize:[UIFont systemFontSize]]
                                        };

// Color of the default search text.
// NOTE: In a production scenario, "Search" would be a localized string.
NSAttributedString *attributedPlaceholder =
[[NSAttributedString alloc] initWithString:@"Search"
                                attributes:placeholderAttributes];
[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
    .attributedPlaceholder = attributedPlaceholder;

// Color of the in-progress spinner.
[[UIActivityIndicatorView appearance] setColor:lightGray];

// To style the two image icons in the search bar (the magnifying glass
// icon and the 'clear text' icon), replace them with different images.
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_clear_x_high"]
                  forSearchBarIcon:UISearchBarIconClear
                            state:UIControlStateHighlighted];
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_clear_x"]
                  forSearchBarIcon:UISearchBarIconClear
                            state:UIControlStateNormal];
[[UISearchBar appearance] setImage:[UIImage imageNamed:@"custom_search"]
                    forSearchBarIcon:UISearchBarIconSearch
                            state:UIControlStateNormal];

// Color of selected table cells.
UIView *selectedBackgroundView = [[UIView alloc] init];
selectedBackgroundView.backgroundColor = [UIColor lightGrayColor];
[UITableViewCell appearanceWhenContainedIn:[GMSAutocompleteViewController class], nil]
    .selectedBackgroundView = selectedBackgroundView;

Kullanıcı arayüzü kontrol stili özelliklerini ayarlama

Kullanıcı arayüzü kontrol öğelerinin bir alt kümesi, UIAppearance protokolünden etkilenmeyen özelliklere sahiptir ve bu nedenle doğrudan ayarlanmalıdır. Aşağıdaki kod örneğinde, ön plan ve arka plan renklerinin tanımlanması ve acController adlı bir kullanıcı arayüzü kontrol örneğine uygulanması gösterilmektedir. Bu kodu ViewController.m dosyasındaki onLaunchClicked yöntemine ekleyin:

UIColor *darkGray = [UIColor darkGrayColor];
UIColor *lightGray = [UIColor lightGrayColor];

acController.secondaryTextColor = [UIColor colorWithWhite:1.0f alpha:0.5f];
acController.primaryTextColor = lightGray;
acController.primaryTextHighlightColor = [UIColor grayColor];
acController.tableCellBackgroundColor = darkGray;
acController.tableCellSeparatorColor = lightGray;
acController.tintColor = lightGray;

Yer tahminlerini programlı bir şekilde alma

Otomatik tamamlama widget'ı tarafından sağlanan kullanıcı arayüzüne alternatif olarak özel bir arama kullanıcı arayüzü oluşturabilirsiniz. Bunun için uygulamanızın yer tahminlerini programatik olarak alması gerekir. Uygulamanız, tahmin edilen yer adlarının ve/veya adreslerin listesini aşağıdaki yöntemlerden biriyle alabilir:

GMSPlacesClient findAutocompletePredictionsFromQuery: aranıyor

Tahmin edilen yer adlarının ve/veya adreslerin listesini almak için önce GMSPlacesClient'ı örnekleyin, ardından GMSPlacesClient findAutocompletePredictionsFromQuery: yöntemini aşağıdaki parametrelerle çağırın:

  • Kullanıcının yazdığı metni içeren bir autocompleteQuery dizesi.
  • Her bir oturumu tanımlamak için kullanılan A GMSAutocompleteSessionToken. Uygulamanız, her otomatik tamamlama isteği çağrısı için aynı jetonu iletmeli, ardından kullanıcının seçtiği yerle ilgili yer ayrıntılarını almak üzere fetchPlacefromPlaceID: için yapılan sonraki çağrıda bu jetonu bir yer kimliğiyle birlikte iletmelidir.
  • A GMSAutocompleteFilter to:
    • Sonuçları belirli bir bölgeye göre yönlendirin veya kısıtlayın.
    • Sonuçları belirli bir yer türüyle kısıtlayın.
    • Sonuçları enlem ve boylam sınırlarıyla belirtilen belirli bir alana yönlendiren GMSPlaceLocationBias/Restriction nesnesi.
  • Döndürülen tahminleri işlemek için kullanılan bir geri çağırma yöntemi.

Aşağıdaki kod örneklerinde findAutocompletePredictionsFromQuery: çağrısı gösterilmektedir.

Swift

/**
 *   Create a new session token. Be sure to use the same token for calling
 *   findAutocompletePredictions, as well as the subsequent place details request.
 *   This ensures that the user's query and selection are billed as a single session.
 */
let token = GMSAutocompleteSessionToken.init()

// Create a type filter.
let filter = GMSAutocompleteFilter()
filter.types = [kGMSPlaceTypeBank]
filter.locationBias = GMSPlaceRectangularLocationOption( northEastBounds,
                                   southWestBounds);

placesClient?.findAutocompletePredictions(fromQuery: "cheesebu",

                                          filter: filter,
                                          sessionToken: token,
                                          callback: { (results, error) in
    if let error = error {
      print("Autocomplete error: \(error)")
      return
    }
    if let results = results {
      for result in results {
        print("Result \(result.attributedFullText) with placeID \(result.placeID)")
      }
    }
})

Objective-C

/**
 *   Create a new session token. Be sure to use the same token for calling
 *   findAutocompletePredictionsFromQuery:, as well as the subsequent place details request.
 *   This ensures that the user's query and selection are billed as a single session.
 */
GMSAutocompleteSessionToken *token = [[GMSAutocompleteSessionToken alloc] init];

// Create a type filter.
GMSAutocompleteFilter *_filter = [[GMSAutocompleteFilter alloc] init];
_filter.types = @[ kGMSPlaceTypeBank ];

[_placesClient findAutocompletePredictionsFromQuery:@"cheesebu"
filter:_filter sessionToken:token callback:^(NSArray<GMSAutocompletePrediction *> * _Nullable results, NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"An error occurred %@", [error localizedDescription]);
    return;
  }
  if (results != nil) {
    for (GMSAutocompletePrediction *result in results) {
      NSLog(@"Result %@ with PlaceID %@", result.attributedFullText, result.placeID);
    }
  }
}];

API, belirtilen geri çağırma yöntemini çağırarak GMSAutocompletePrediction nesnelerinden oluşan bir dizi iletir.

Her GMSAutocompletePrediction nesnesi aşağıdaki bilgileri içerir:

  • attributedFullText: Tahminin tam metni, NSAttributedString biçiminde. Örneğin, "Sidney Opera Binası, Sidney, Yeni Güney Galler, Avustralya". Kullanıcı girişine uyan her metin aralığında kGMSAutocompleteMatchAttribute özelliği bulunur. Bu özelliği, kullanıcının sorgusundaki eşleşen metni vurgulamak için kullanabilirsiniz. Örneğin, aşağıda gösterildiği gibi.
  • placeID – Tahmin edilen yerin yer kimliği. Yer kimliği, bir yeri benzersiz şekilde tanımlayan metin tabanlı bir tanımlayıcıdır. Yer kimlikleri hakkında daha fazla bilgi için Yer kimliği genel bakışı başlıklı makaleyi inceleyin.
  • distanceMeters: Belirtilen origin konumundan hedefe olan kuş uçuşu mesafe. origin özelliği ayarlanmazsa mesafe değeri döndürülmez.

Aşağıdaki kod örneğinde, enumerateAttribute kullanarak sonucun kullanıcının sorgusundaki metinle eşleşen kısımlarının kalın metinle nasıl vurgulanacağı gösterilmektedir:

Swift

let regularFont = UIFont.systemFont(ofSize: UIFont.labelFontSize)
let boldFont = UIFont.boldSystemFont(ofSize: UIFont.labelFontSize)

let bolded = prediction.attributedFullText.mutableCopy() as! NSMutableAttributedString
bolded.enumerateAttribute(kGMSAutocompleteMatchAttribute, in: NSMakeRange(0, bolded.length), options: []) {
  (value, range: NSRange, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
    let font = (value == nil) ? regularFont : boldFont
    bolded.addAttribute(NSFontAttributeName, value: font, range: range)
}

label.attributedText = bolded
    

Objective-C

UIFont *regularFont = [UIFont systemFontOfSize:[UIFont labelFontSize]];
UIFont *boldFont = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];

NSMutableAttributedString *bolded = [prediction.attributedFullText mutableCopy];
[bolded enumerateAttribute:kGMSAutocompleteMatchAttribute
                   inRange:NSMakeRange(0, bolded.length)
                   options:0
                usingBlock:^(id value, NSRange range, BOOL *stop) {
                  UIFont *font = (value == nil) ? regularFont : boldFont;
                  [bolded addAttribute:NSFontAttributeName value:font range:range];
                }];

label.attributedText = bolded;
    

Getiriciyi kullanma

Kendi otomatik tamamlama kontrolünüzü sıfırdan oluşturmak istiyorsanız GMSPlacesClient üzerindeki autocompleteQuery yöntemini sarmalayan GMSAutocompleteFetcher yöntemini kullanabilirsiniz. Getirici, istekleri kısıtlar ve yalnızca en son girilen arama metninin sonuçlarını döndürür. Kullanıcı arayüzü öğesi sağlamaz.

GMSAutocompleteFetcher'ı uygulamak için aşağıdaki adımları uygulayın:

  1. GMSAutocompleteFetcherDelegate protokolünü uygulayın.
  2. GMSAutocompleteFetcher nesnesi oluşturun.
  3. Kullanıcı yazarken getiricide sourceTextHasChanged yöntemini çağırın.
  4. didAutcompleteWithPredictions ve didFailAutocompleteWithError protokol yöntemlerini kullanarak tahminleri ve hataları işleyin.

Aşağıdaki kod örneğinde, kullanıcı girişini almak ve yer eşleşmelerini bir metin görünümünde göstermek için getiricinin nasıl kullanılacağı gösterilmektedir. Yer seçme işlevi kaldırıldı. FetcherSampleViewController, FetcherSampleViewController.h dosyasındaki UIViewController öğesinden türetilmiştir.

Swift

import UIKit
import GooglePlaces

class ViewController: UIViewController {

  var textField: UITextField?
  var resultText: UITextView?
  var fetcher: GMSAutocompleteFetcher?

  override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = .white
    edgesForExtendedLayout = []

    // Set bounds to inner-west Sydney Australia.
    let neBoundsCorner = CLLocationCoordinate2D(latitude: -33.843366,
                                                longitude: 151.134002)
    let swBoundsCorner = CLLocationCoordinate2D(latitude: -33.875725,
                                                longitude: 151.200349)

    // Set up the autocomplete filter.
    let filter = GMSAutocompleteFilter()
    filter.locationRestriction = GMSPlaceRectangularLocationOption(neBoundsCorner, swBoundsCorner)

    // Create a new session token.
    let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init()

    // Create the fetcher.
    fetcher = GMSAutocompleteFetcher(bounds: nil, filter: filter)
    fetcher?.delegate = self
    fetcher?.provide(token)

    textField = UITextField(frame: CGRect(x: 5.0, y: 10.0,
                                          width: view.bounds.size.width - 5.0,
                                          height: 64.0))
    textField?.autoresizingMask = .flexibleWidth
    textField?.addTarget(self, action: #selector(textFieldDidChange(textField:)),
                         for: .editingChanged)
    let placeholder = NSAttributedString(string: "Type a query...")

    textField?.attributedPlaceholder = placeholder

    resultText = UITextView(frame: CGRect(x: 0, y: 65.0,
                                          width: view.bounds.size.width,
                                          height: view.bounds.size.height - 65.0))
    resultText?.backgroundColor = UIColor(white: 0.95, alpha: 1.0)
    resultText?.text = "No Results"
    resultText?.isEditable = false

    self.view.addSubview(textField!)
    self.view.addSubview(resultText!)
  }

  @objc func textFieldDidChange(textField: UITextField) {
    fetcher?.sourceTextHasChanged(textField.text!)
  }

}

extension ViewController: GMSAutocompleteFetcherDelegate {
  func didAutocomplete(with predictions: [GMSAutocompletePrediction]) {
    let resultsStr = NSMutableString()
    for prediction in predictions {
      resultsStr.appendFormat("\n Primary text: %@\n", prediction.attributedPrimaryText)
      resultsStr.appendFormat("Place ID: %@\n", prediction.placeID)
    }

    resultText?.text = resultsStr as String
  }

  func didFailAutocompleteWithError(_ error: Error) {
    resultText?.text = error.localizedDescription
  }
}

Objective-C

#import "FetcherSampleViewController.h"
#import <GooglePlaces/GooglePlaces.h>

@interface FetcherSampleViewController () <GMSAutocompleteFetcherDelegate>

@end

@implementation FetcherSampleViewController {
  UITextField *_textField;
  UITextView *_resultText;
  GMSAutocompleteFetcher* _fetcher;
}

-   (void)viewDidLoad {
  [super viewDidLoad];

  self.view.backgroundColor = [UIColor whiteColor];
  self.edgesForExtendedLayout = UIRectEdgeNone;

  // Set bounds to inner-west Sydney Australia.
  CLLocationCoordinate2D neBoundsCorner = CLLocationCoordinate2DMake(-33.843366, 151.134002);
  CLLocationCoordinate2D swBoundsCorner = CLLocationCoordinate2DMake(-33.875725, 151.200349);

  GMSAutocompleteFilter *autocompleteFilter = [[GMSAutocompleteFilter alloc] init];
  autocompleteFilter.locationRestriction =
        GMSPlaceRectangularLocationOption(neBoundsCorner, swBoundsCorner);

  // Create the fetcher.
  _fetcher = [[GMSAutocompleteFetcher alloc] initWithBounds:nil
                                                     filter:filter];
  _fetcher.delegate = self;

  // Set up the UITextField and UITextView.
  _textField = [[UITextField alloc] initWithFrame:CGRectMake(5.0f,
                                                             0,
                                                             self.view.bounds.size.width - 5.0f,
                                                             44.0f)];
  _textField.autoresizingMask = UIViewAutoresizingFlexibleWidth;
  [_textField addTarget:self
                 action:@selector(textFieldDidChange:)
       forControlEvents:UIControlEventEditingChanged];
  _resultText =[[UITextView alloc] initWithFrame:CGRectMake(0,
                                                            45.0f,
                                                            self.view.bounds.size.width,
                                                            self.view.bounds.size.height - 45.0f)];
  _resultText.backgroundColor = [UIColor colorWithWhite:0.95f alpha:1.0f];
  _resultText.text = @"No Results";
  _resultText.editable = NO;
  [self.view addSubview:_textField];
  [self.view addSubview:_resultText];
}

-   (void)textFieldDidChange:(UITextField *)textField {
  NSLog(@"%@", textField.text);
  [_fetcher sourceTextHasChanged:textField.text];
}

#pragma mark - GMSAutocompleteFetcherDelegate
-   (void)didAutocompleteWithPredictions:(NSArray *)predictions {
  NSMutableString *resultsStr = [NSMutableString string];
  for (GMSAutocompletePrediction *prediction in predictions) {
      [resultsStr appendFormat:@"%@\n", [prediction.attributedPrimaryText string]];
  }
  _resultText.text = resultsStr;
}

-   (void)didFailAutocompleteWithError:(NSError *)error {
  _resultText.text = [NSString stringWithFormat:@"%@", error.localizedDescription];
}

@end

Oturum jetonları

Oturum jetonları, faturalandırma amacıyla bir kullanıcının otomatik tamamlama aramasının sorgu ve seçim aşamalarını ayrı bir oturumda gruplandırır. Oturum, kullanıcının bir sorgu yazmaya başlamasıyla başlar ve bir yer seçmesiyle sona erer. Her oturumda birden fazla sorgu ve ardından bir yer seçimi olabilir. Bir oturum sona erdiğinde jeton geçerliliğini kaybeder. Uygulamanız her oturum için yeni bir jeton oluşturmalıdır. Tüm programatik otomatik tamamlama oturumları için oturum jetonlarını kullanmanızı öneririz (tam ekran denetleyiciyi veya sonuç denetleyiciyi kullandığınızda API bunu otomatik olarak yapar).

iOS için Yerler SDK'sı, her oturumu tanımlamak için GMSAutocompleteSessionToken kullanır. Uygulamanız her yeni oturumun başında yeni bir oturum jetonu iletmeli, ardından kullanıcının seçtiği yerin Yer Ayrıntıları'nı almak için fetchPlacefromPlaceID: yöntemine yapılan sonraki çağrıda aynı jetonu bir yer kimliğiyle birlikte iletmelidir.

Oturum jetonları hakkında daha fazla bilgi edinin.

Yeni bir oturum jetonu oluşturmak için aşağıdaki kodu kullanın:

let token: GMSAutocompleteSessionToken = GMSAutocompleteSessionToken.init()

Kullanım sınırları

Uygulamanızda katkıların gösterilmesi

  • Uygulamanız otomatik tamamlama hizmetini programatik olarak kullanıyorsa kullanıcı arayüzünüzde "Google tarafından desteklenmektedir" atfı gösterilmeli veya Google markalı bir harita içinde görünmelidir.
  • Uygulamanızda otomatik tamamlama kullanıcı arayüzü kontrolü kullanılıyorsa ek bir işlem yapılmasına gerek yoktur (gerekli ilişkilendirme varsayılan olarak gösterilir).
  • Kimliğe göre yer alma işleminden sonra ek yer bilgileri alıp görüntülerseniz üçüncü taraf ilişkilendirmelerini de göstermeniz gerekir.

Daha fazla bilgi için ilişkilendirmeler ile ilgili dokümanlara bakın.

Ağ etkinliği göstergesini kontrol etme

Uygulamaların durum çubuğundaki ağ etkinliği göstergesini kontrol etmek için kullandığınız otomatik tamamlama sınıfı için uygun isteğe bağlı temsilci yöntemlerini uygulamanız ve ağ göstergesini kendiniz açıp kapatmanız gerekir.

  • GMSAutocompleteViewController için didRequestAutocompletePredictions: ve didUpdateAutocompletePredictions: temsilci yöntemlerini uygulamanız gerekir.
  • GMSAutocompleteResultsViewController için didRequestAutocompletePredictionsForResultsController: ve didUpdateAutocompletePredictionsForResultsController: temsilci yöntemlerini uygulamanız gerekir.
  • GMSAutocompleteTableDataSource için didRequestAutocompletePredictionsForTableDataSource: ve didUpdateAutocompletePredictionsForTableDataSource: temsilci yöntemlerini uygulamanız gerekir.

Bu yöntemleri uygulayıp [UIApplication sharedApplication].networkActivityIndicatorVisible ve NO değerlerini sırasıyla YES olarak ayarladığınızda durum çubuğu, otomatik tamamlama kullanıcı arayüzüyle doğru şekilde eşleşir.

Otomatik tamamlama sonuçlarını kısıtlama

Otomatik tamamlama kullanıcı arayüzü kontrolünü, sonuçları belirli bir coğrafi bölgeyle sınırlayacak ve/veya sonuçları bir veya daha fazla yer türüne ya da belirli bir ülkeye veya ülkelere göre filtreleyecek şekilde ayarlayabilirsiniz. Sonuçları kısıtlamak için aşağıdakileri yapabilirsiniz:

  • Tanımlanan bölgedeki sonuçları tercih etmek (yanlılık) için locationBias seçeneğini GMSAutocompleteFilter olarak ayarlayın (tanımlanan bölgenin dışındaki bazı sonuçlar yine de döndürülebilir). locationRestriction da ayarlanmışsa locationBias yoksayılır.
  • Sonuçları yalnızca tanımlanan bölge içinde göstermek (kısıtlamak) için GMSAutocompleteFilter üzerinde locationRestriction değerini ayarlayın (yalnızca tanımlanan bölge içindeki sonuçlar döndürülür).

    • Not: Bu kısıtlama yalnızca rotaların tamamı için geçerlidir. Dikdörtgen sınırlar dışında bulunan sentetik sonuçlar, konum kısıtlamasıyla çakışan bir rota temel alınarak döndürülebilir.
  • Yalnızca belirli bir yer türüne uyan sonuçları döndürmek için GMSAutocompleteFilter üzerinde types değerini ayarlayın (örneğin, kGMSPlaceTypeCollectionAddress değerini belirtmek, widget'ın yalnızca tam adrese sahip sonuçları döndürmesine neden olur).

  • Yalnızca belirtilen en fazla beş ülke içindeki sonuçları döndürmek için GMSAutocompleteFilter üzerinde countries değerini ayarlayın.

Sonuçları belirli bir bölgeye göre önyargılı hale getirme

Tanımlanan bölgedeki sonuçları tercih etmek (öncelik vermek) için GMSAutocompleteFilter üzerinde locationBias değerini burada gösterildiği gibi ayarlayın:

northEast = CLLocationCoordinate2DMake(39.0, -95.0);  southWest =
CLLocationCoordinate2DMake(37.5, -100.0);  GMSAutocompleteFilter *filter =
[[GMSAutocompleteFilter alloc] init];  filter.locationBias =
GMSPlaceRectangularLocationOption(northEast, southWest);

Sonuçları belirli bir bölgeyle sınırlama

Sonuçları yalnızca tanımlanan bölge içinde gösterecek (kısıtlayacak) şekilde ayarlamak için GMSAutocompleteFilter üzerinde locationRestriction seçeneğini aşağıdaki gibi ayarlayın:

northEast = CLLocationCoordinate2DMake(39.0, -95.0);  southWest =
CLLocationCoordinate2DMake(37.5, -100.0);  GMSAutocompleteFilter *filter =
[[GMSAutocompleteFilter alloc] init];  filter.locationRestriction =
GMSPlaceRectangularLocationOption(northEast, southWest);

Sonuçları ülkeye göre filtreleme

Sonuçları en fazla beş ülkede filtrelemek için GMSAutocompleteFilter üzerinde countries değerini ayarlayın. Örnek:

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.countries = @[ @"au", @"nz" ];

Sonuçları yer türüne veya koleksiyon türüne göre filtreleme

GMSAutoCompleteFilter öğesinin types özelliğini ayarlayarak sonuçları belirli bir tür veya tür koleksiyonuyla sınırlayın. Yer Türleri bölümündeki Tablo 1, 2 ve 3'te listelenen filtreleri belirtmek için bu özelliği kullanın. Hiçbir şey belirtilmezse tüm türler döndürülür.

Bir tür veya tür koleksiyonu filtresi belirtmek için:

  • types mülkünü kullanarak Yer Türleri sayfasında gösterilen Tablo 1 ve Tablo 2'deki tür değerlerinden en fazla beşini belirtin. Tür değerleri, GMSPlaceType içindeki sabitlerle tanımlanır.

  • Yer Türleri sayfasındaki Tablo 3'te gösterilen tür koleksiyonunu belirtmek için types mülkünü kullanın. Tür koleksiyonu değerleri, GMSPlaceType içindeki sabitler tarafından tanımlanır.

    İsteklerde yalnızca Tablo 3'teki tek bir türe izin verilir. Tablo 3'ten bir değer belirtirseniz Tablo 1 veya Tablo 2'den bir değer belirtemezsiniz. Aksi takdirde hata oluşur.

Örneğin, yalnızca belirli bir yer türüne uygun sonuçlar döndürmek için types değerini GMSAutocompleteFilter olarak ayarlayın. Aşağıdaki örnekte, filtrenin yalnızca tam adres içeren sonuçları döndürecek şekilde ayarlanması gösterilmektedir:

GMSAutocompleteFilter *filter = [[GMSAutocompleteFilter alloc] init];
filter.types = @[ kGMSPlaceTypeAirport, kGMSPlaceTypeAmusementPark ];

Yer Adı Otomatik Tamamlama (Eski) optimizasyonu

Bu bölümde, Yer Adı Otomatik Tamamlama (Eski) hizmetinden en iyi şekilde yararlanmanıza yardımcı olacak en iyi uygulamalar açıklanmaktadır.

Genel kurallardan bazıları şunlardır:

Maliyet optimizasyonu ile ilgili en iyi uygulamalar

Temel maliyet optimizasyonu

Yer Adı Otomatik Tamamlama (Eski) hizmetini kullanmanın maliyetini optimize etmek için Yer Ayrıntıları (Eski) ve Yer Adı Otomatik Tamamlama (Eski) widget'larında yalnızca ihtiyacınız olan Yer Adı Otomatik Tamamlama (Eski) veri alanlarını döndürmek üzere alan maskeleri kullanın.

Gelişmiş maliyet optimizasyonu

Yer Adı Otomatik Tamamlama (Eski) hizmetine programatik olarak erişmek için SKU: Autocomplete - Per Request pricing hizmetini kullanın ve Yer Ayrıntıları (Eski) yerine seçilen yerle ilgili Geocoding API sonuçları isteyin. Aşağıdaki koşulların her ikisi de karşılanıyorsa Geocoding API'si ile birlikte kullanılan istek başına fiyatlandırma, oturum başına (oturum tabanlı) fiyatlandırmaya kıyasla daha uygun maliyetlidir:

  • Kullanıcının seçtiği yerin yalnızca enlemi, boylamı veya adresi gerekiyorsa Geocoding API bu bilgileri Place Details (Legacy) çağrısından daha düşük bir maliyetle sağlar.
  • Kullanıcılar, ortalama dört veya daha az Yer Adı Otomatik Tamamlama (Eski) tahmin isteği içinde bir otomatik tamamlama tahmini seçerse istek başına fiyatlandırma, oturum başına fiyatlandırmaya göre daha uygun maliyetli olabilir.
İhtiyaçlarınıza uygun Yer Adı Otomatik Tamamlama (Eski) uygulamasını seçme konusunda yardım almak için aşağıdaki soruya verdiğiniz cevaba karşılık gelen sekmeyi seçin.

Uygulamanız, seçilen tahminin adresi ve enlem/boylamı dışında başka bilgi gerektiriyor mu?

Evet, daha fazla ayrıntı gerekiyor

Yer Ayrıntıları (Eski) ile oturuma dayalı Yer Adı Otomatik Tamamlama (Eski) özelliğini kullanın.
Uygulamanızda yer adı, işletme durumu veya çalışma saatleri gibi Yer Ayrıntıları (Eski) gerekli olduğundan Yer Otomatik Tamamlama (Eski) özelliğinin uygulanmasında oturum jetonu (programatik olarak veya JavaScript, Android ya da iOS widget'larına yerleştirilmiş) oturum başına ve talep ettiğiniz yer verileri alanlarına bağlı olarak geçerli Yer Verileri SKU'ları kullanılmalıdır.1

Widget uygulama
Oturum yönetimi, otomatik olarak JavaScript, Android, veya iOS widget'larına yerleştirilmiştir. Buna, seçilen tahminde hem Yer Adı Otomatik Tamamlama (Eski) istekleri hem de Yer Ayrıntıları (Eski) isteği dahildir. Yalnızca ihtiyacınız olan Yer Adı Otomatik Tamamlama (Eski) veri alanlarını istediğinizden emin olmak için fields parametresini belirttiğinizden emin olun.

Programatik uygulama
Yer Adı Otomatik Tamamlama (Eski) isteklerinizde oturum jetonu kullanın. Seçilen tahminle ilgili Yer Ayrıntıları (Eski) isteğinde bulunurken aşağıdaki parametreleri ekleyin:

  1. Yer Adı Otomatik Tamamlama (Eski) yanıtındaki yer kimliği
  2. Yer Adı Otomatik Tamamlama (Eski) isteğinde kullanılan oturum jetonu
  3. İhtiyacınız olan Yer Adı Otomatik Tamamlama (Eski) veri alanlarını belirten fields parametresi

Hayır, yalnızca adres ve konum gerekiyor

Yer Adı Otomatik Tamamlama (Eski) kullanımınızın performansına bağlı olarak, Geocoding API, uygulamanız için Yer Ayrıntıları (Eski) API'sinden daha uygun maliyetli bir seçenek olabilir. Her uygulamanın Yer Adı Otomatik Tamamlama (Legacy) verimliliği, kullanıcıların ne girdiğine, uygulamanın nerede kullanıldığına ve performans optimizasyonuyla ilgili en iyi uygulamaların uygulanıp uygulanmadığına bağlı olarak değişir.

Aşağıdaki soruyu yanıtlamak için bir kullanıcının uygulamanızda Yer Adı Otomatik Tamamlama (Eski) tahminini seçmeden önce ortalama kaç karakter yazdığını analiz edin.

Kullanıcılarınız, ortalama olarak dört veya daha az istekte bir Yer Adı Otomatik Tamamlama (Eski) tahmini seçiyor mu?

Evet

Oturum jetonları olmadan Yer Adı Otomatik Tamamlama (Eski) programatik olarak uygulayın ve seçilen yer tahmini için Geocoding API'yi çağırın.
Geocoding API, adresleri ve enlem/boylam koordinatlarını sağlar. Seçilen yer tahminiyle ilgili dört Autocomplete - Per Request (İstek Başına Otomatik Tamamlama) isteği ve bir Geocoding API (Coğrafi Kodlama API'si) çağrısı yapmak, oturum başına oturum başına Yer Otomatik Tamamlama (Eski) maliyetinden daha düşüktür.1

Kullanıcılarınızın aradıkları tahmini daha az karakterle almalarına yardımcı olmak için performansla ilgili en iyi uygulamalardan yararlanabilirsiniz.

Hayır

Yer Ayrıntıları (Eski) ile oturuma dayalı Yer Adı Otomatik Tamamlama (Eski) özelliğini kullanın.
Bir kullanıcı, Yer Adı Otomatik Tamamlama (Eski) tahmini seçmeden önce yapmayı beklediğiniz ortalama istek sayısı, oturum başına fiyatlandırmanın maliyetini aştığından Yer Adı Otomatik Tamamlama (Eski) uygulamanız hem Yer Adı Otomatik Tamamlama (Eski) istekleri hem de ilişkili Yer Ayrıntıları (Eski) isteği için oturum başına bir oturum jetonu kullanmalıdır. 1

Widget uygulama
Oturum yönetimi, JavaScript, Android, veya iOS widget'larına otomatik olarak yerleştirilmiştir. Buna, seçilen tahmindeki hem Yer Adı Otomatik Tamamlama (Eski) istekleri hem de Yer Ayrıntıları (Eski) isteği dahildir. Yalnızca ihtiyacınız olan alanları istediğinizden emin olmak için fields parametresini belirttiğinizden emin olun.

Programatik uygulama
Yer Adı Otomatik Tamamlama (Eski) isteklerinizde oturum jetonu kullanın. Seçilen tahminle ilgili Yer Ayrıntıları (Eski) isteğinde bulunurken aşağıdaki parametreleri ekleyin:

  1. Yer Adı Otomatik Tamamlama (Eski) yanıtındaki yer kimliği
  2. Yer Adı Otomatik Tamamlama (Eski) isteğinde kullanılan oturum jetonu
  3. Adres ve geometri gibi fields parametresini belirten Temel Veri alanları

Yer Adı Otomatik Tamamlama (Eski) isteklerini geciktirmeyi düşünün
Uygulamanızın daha az istekte bulunması için Yer Adı Otomatik Tamamlama (Eski) isteğini kullanıcı ilk üç veya dört karakteri yazana kadar geciktirmek gibi stratejiler kullanabilirsiniz. Örneğin, kullanıcı üçüncü karakteri yazdıktan sonra her karakter için Yer Adı Otomatik Tamamlama (Eski) isteğinde bulunmak, kullanıcının yedi karakter yazıp bir Geocoding API isteğinde bulunduğunuz bir tahmini seçmesi durumunda toplam maliyetin 4 Yer Adı Otomatik Tamamlama (Eski) İsteği + Coğrafi Kodlama olacağı anlamına gelir.1

İstekleri geciktirerek ortalama programatik istek sayınızı dörtten aşağıya düşürebilirseniz Coğrafi Kodlama API'si ile yüksek performanslı Yer Adı Otomatik Tamamlama (Eski) uygulamasıyla ilgili yönergeleri uygulayabilirsiniz. İsteklerin geciktirilmesinin, her yeni tuş vuruşunda tahmin görmeyi bekleyen kullanıcı tarafından gecikme olarak algılanabileceğini unutmayın.

Kullanıcılarınızın aradıkları tahmini daha az karakterle bulmalarına yardımcı olmak için performansla ilgili en iyi uygulamalardan yararlanabilirsiniz.


  1. Maliyetler için Google Haritalar Platformu fiyatlandırma listeleri başlıklı makaleyi inceleyin.

Performansla ilgili en iyi uygulamalar

Aşağıdaki yönergelerde, Yer Adı Otomatik Tamamlama (Eski) performansını optimize etme yöntemleri açıklanmaktadır:

  • Place Autocomplete (Legacy) uygulamanıza ülkeye özgü kısıtlamalar, konum ağırlığı ve (programatik uygulamalar için) dil tercihi ekleyin. Widget'lar, dil tercihlerini kullanıcının tarayıcısından veya mobil cihazından aldığı için widget'larda dil tercihine gerek yoktur.
  • Yer Adı Otomatik Tamamlama (Eski) özelliğine bir harita eşlik ediyorsa konumu harita görüntü alanına göre yönlendirebilirsiniz.
  • Kullanıcının, genellikle bu tahminlerden hiçbiri istenen sonuç adresi olmadığı için Yer Adı Otomatik Tamamlama (Eski) tahminlerinden birini seçmediği durumlarda, daha alakalı sonuçlar elde etmek için orijinal kullanıcı girişini yeniden kullanabilirsiniz:
    • Kullanıcının yalnızca adres bilgisi girmesini bekliyorsanız Geocoding API'ye yapılan bir çağrıda orijinal kullanıcı girişini yeniden kullanın.
    • Kullanıcının belirli bir yerle ilgili sorguları ad veya adresle girmesini bekliyorsanız Yer Ayrıntıları (Eski) isteği kullanın. Sonuçların yalnızca belirli bir bölgede gösterilmesi bekleniyorsa konum ağırlıklandırmayı kullanın.
    Geocoding API'ye başvurmanın en iyi seçenek olduğu diğer senaryolar şunlardır:
    • Kullanıcılar, bir bina içindeki belirli birimlerin veya dairelerin adresleri gibi alt tesis adreslerini girerken. Örneğin, "Stroupežnického 3191/17, Praha" Çekçe adresi, Yer Adı Otomatik Tamamlama (Eski) özelliğinde kısmi bir tahmin oluşturur.
    • New York City'de "23-30 29th St, Queens" veya Hawaii'deki Kauai adasında "47-380 Kamehameha Hwy, Kaneohe" gibi yol segmenti önekleri içeren adresleri giren kullanıcılar.

Konum önyargısı

location parametresi ve radius parametresi ileterek sonuçları belirli bir alana göre yönlendirin. Bu, Yer Adı Otomatik Tamamlama (Eski) özelliğine, tanımlanan alan içindeki sonuçları göstermeyi tercih etmesi talimatını verir. Tanımlanan alanın dışındaki sonuçlar yine de gösterilebilir. Sonuçları filtreleyerek yalnızca belirli bir ülke içindeki yerleri göstermek için includedRegionCodes parametresini kullanabilirsiniz.

Konum kısıtlama

locationRestriction parametresini ileterek sonuçları belirli bir alanla kısıtlayın.

Ayrıca, location ve radius parametreleriyle tanımlanan bölgeyle sonuçları kısıtlamak için strictbounds parametresini ekleyebilirsiniz. Bu, Yer Adı Otomatik Tamamlama (Eski) özelliğine yalnızca bu bölgedeki sonuçları döndürmesi talimatını verir.

Sorun giderme

Çok çeşitli hatalar oluşabilse de uygulamanızın karşılaşacağı hataların çoğu genellikle yapılandırma hatalarından (ör. yanlış API anahtarı kullanıldı veya API anahtarı yanlış yapılandırıldı) ya da kota hatalarından (uygulamanız kotasını aştı) kaynaklanır. Kotalar hakkında daha fazla bilgi için Kullanım Sınırları bölümüne bakın.

Otomatik tamamlama kontrollerinin kullanımında ortaya çıkan hatalar, çeşitli temsilci protokollerinin didFailAutocompleteWithError() yönteminde döndürülür. Sağlanan NSError nesnesinin code özelliği, GMSPlacesErrorCode numaralandırmasının değerlerinden birine ayarlanır.