GooglePlacesRow 3.2.0

GooglePlacesRow 3.2.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最新发布2019年4月
SPM支持 SPM

Mathias ClaassenMauricio CousillasDiego Ernst 维护。



Platform iOS Swift 5 compatible CocoaPods compatible License: MIT

Xmartlabs SRL 完成。

当前使用的 Google Places 版本为 3.3

从版本 3.2 开始支持 Swift 5

内容

简介

GooglePlacesRow 是 Eureka 的行扩展。它实现了一个行,用户可以通过 Google Places 自动完成功能来选择 API 推荐的地方。

GooglePlacesRow 包含两个具有类似功能但不显示选项的行

  • GooglePlacesAccessoryRow:显示集合视图作为单元格的 inputAccessoryView。用户可以通过水平滚动来选择所需的地方
  • GooglePlacesTableRow:在单元格下方直接显示 UITableView,供用户选择所需选项。

该项目是实验性的,虽然已经相当可定制,但仍可进行更改。

安装

CocoaPods

CocoaPods 适用于 Cocoa 项目的依赖管理器。

要安装 GooglePlacesRow,只需在 Podfile 中添加以下行

pod 'GooglePlacesRow'

这还将安装 Eureka 和 GooglePlaces。

注意:不要在 podfile 中添加 pod 'GooglePlaces',因为这个库将其作为供应商框架包含在内

使用方法

如何获取 API 密钥

  1. 导航至 https://console.developers.google.com/
  2. 创建一个新的项目(或选择现有项目)
  3. 启用 Google Places API for iOS
  4. 复制密钥并将其粘贴到 AppDelegate.swift

如何使用 GooglePlacesRow

  1. 首先,导航至 AppDelegate.swift,并在顶部添加 import GooglePlaces

    // AppDelegate.swift
    import GooglePlaces
  2. didFinishLaunchingWithOptions 方法中,在 return 关键字之前添加以下代码。

    // AppDelegate.swift, application:didFinishLaunchingWithOptions
    let apiKey = "YOUR_API_KEY"
    GMSServices.provideAPIKey(apiKey)
  3. 将你的 ViewController 子类化成 FormViewController

    class YourViewController: FormViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    		// Code for setting up Eureka goes here
        }
    }
  4. 在 Eureka 表单中使用它,就像使用任何其他 Eureka 表行一样。

    // in your controller, in viewDidLoad()
    form +++ Section("Choose from table view")
        <<< GooglePlacesTableRow() { row in
    	        row.title = "Location" // Adds a title to a row
    	        row.tag = "location" // Upon parsing a form you get a nice key if you use a tag
    	        row.add(ruleSet: RuleSet<GooglePlace>()) // We can use GooglePlace() as a rule
    	        row.validationOptions = .validatesOnChangeAfterBlurred
    	        row.cell.textLabel?.textColor = UIColor.black
    		}
    		.cellUpdate { cell, row in // Optional
    	        // Do something when cell updates
    		}
    
        +++ Section("Customized cell, customized layout")
            <<< GooglePlacesAccessoryRow().cellSetup { cell, row in
                (cell.collectionViewLayout  as? UICollectionViewFlowLayout)?.sectionInset = UIEdgeInsets.zero
                (cell.collectionViewLayout  as? UICollectionViewFlowLayout)?.minimumInteritemSpacing = 40
                cell.customizeCollectionViewCell = { customCell in
                    customCell.label.textColor = UIColor.red
                    customCell.layer.borderColor = UIColor.green.cgColor
                    customCell.layer.borderWidth = 1
                    customCell.layer.cornerRadius = 4
                }
            }

要查看您可以自定义的内容,请参阅 自定义 部分,或 常见问题解答

依赖项

  • Eureka
  • GooglePlaces(以及它所依赖的所有框架)
  • GoogleMapsBase

注意:您只需在 podfile 中添加 pod 'GooglePlacesRow',其他 pod 将会自动安装

需求

  • iOS 9.3+
  • Xcode 10.2+

参与方式

  • 如果您想贡献代码,请随时提交pull requests。
  • 如果您有功能请求,请打开一个问题。
  • 如果您发现了bug或需要帮助,请在提交问题前请先查看之前的问题或FAQ。

在贡献之前,请查看CONTRIBUTING文件以获取更多信息。

如果您在您的应用中使用了GooglePlacesRow,我们很乐意听听您的体验!在twitter上给我们留言。

示例

按照以下步骤运行示例项目

  • 克隆GooglePlacesRow仓库
  • 在克隆的文件夹中执行git submodule add https://github.com/xmartlabs/Eureka.git
  • 打开GooglePlacesRow工作空间
  • AppDelegate.swift中设置您的 Google 地点 API KEY
  • 并运行示例项目。

自定义

常规自定义

您可以使用以下五个变量来修改这些行的默认行为

  • 在行中
    • placeFilter:这是在请求Google地时使用的GMSAutocompleteFilter,用于定义将返回什么类型的建议(例如:城市、地址、国家)。有关详细信息,请参阅Google的官方文档。
    • placeBounds:限定搜索地点的范围。有关详细信息,请参阅Google的官方文档。
    • onNetworkingError:当请求Google Places返回错误时调用的Block。
  • 在单元格中
    • useTimer:如果应该使用计时器对Google Places请求进行节流。如果为true,则将在发送请求前等待timerInterval秒。如果用户继续在行中输入文本,则不会触发上一个请求。
    • timerInterval:上述计时器的秒间隔。

GooglePlacesAccessoryRow

GooglePlacesAccessoryRow使用了一个通用的GooglePlacesCollectionCell单元格,其泛型参数为在输入accessoryView中使用的UICollectionViewCell类。

  • 如果您只是想更改单元格的细微之处(您很可能想这么做),那么customizeCollectionViewCell回调就是为您准备的。此Block在委托的collectionView:cellForItemAtIndexPath:方法中被调用。

  • 如果您想更改collectionView的布局(例如其高度、背景颜色),也可以在声明行时的cellSetup方法中修改/覆盖collectionViewLayout属性。请参阅示例。

  • 如果您想更改有关collectionView(例如其高度、背景色)的内容,也可以在cellSetup方法中实现。请参阅示例。

  • 如果您想大幅更改输入accessoryView的collectionView单元格,那么创建自己的行(MyGooglePlacesAccessoryRow)并使用自己的MyCollectionViewCell是最简单的方法。

public final class MyGooglePlacesAccessoryRow: _GooglePlacesRow<GooglePlacesCollectionCell<MyCollectionViewCell>>, RowType {
    required public init(tag: String?) {
        super.init(tag: tag)
    }
}

在这种情况下,只需确保您的单元格符合EurekaGooglePlacesCollectionViewCell即可。

GooglePlacesTableRow

GooglePlacesTableRow使用了一个泛型的GooglePlacesTableCell单元格,其泛型参数用于创建显示Google Places建议选项的UITableView单元格。

  • 如果您只想更改显示选项的单元格的细微之处(您很可能想这么做),那么customizeTableViewCell回调就是为您准备的。此Block在委托的tableView:cellForRowAtIndexPath:方法中被调用。

  • 您可以自定义用于显示选项的tableView的属性。您应在cellSetup中这样做,并请注意,每次显示tableView时,其框架都会重置。

  • 如果您想大幅更改这些单元格,创建自己的行(MyGooglePlacesAccessoryRow)并使用自己的MyCollectionViewCell是更简单的方法。

public final class MyGooglePlacesAccessoryRow: _GooglePlacesRow<GooglePlacesCollectionCell<MyCollectionViewCell>>, RowType {
    required public init(tag: String?) {
        super.init(tag: tag)
    }
}

在这种情况下,只需确保您的单元格符合EurekaGooglePlacesTableViewCell即可。

常见问题(FAQ)

Xcode报错ld: framework not found GoogleMaps for architecture x86_64

这很可能是你忘记告诉XcodeGoogleMapsBase.frameworkGooglePlaces.framework的位置,或者根本没有下载它。请按照示例说明安装说明进行操作。

如何使用GooglePlacesRow的值?

GooglePlacesRow的值是一个枚举类型GooglePlace

public enum GooglePlace {
    case userInput(value: String)
    case prediction(prediction: GMSAutocompletePrediction)
}

你可以使用switch语句来访问这个值。

switch row.value {
    case .userInput(let value):  
        print(value)  
    case .prediction(let prediction):  
        print(prediction.attributedPrimaryText)  
        print(prediction.attributedSecondaryText)  
        print(prediction.placeID)  
}

未来工作

  • Carthage兼容性
  • 研究自动化安装过程的可行性

作者

变更日志

可在CHANGELOG.md文件中找到。