由 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 密钥
- 导航至 https://console.developers.google.com/
- 创建一个新的项目(或选择现有项目)
- 启用 Google Places API for iOS
- 复制密钥并将其粘贴到
AppDelegate.swift
如何使用 GooglePlacesRow
-
首先,导航至
AppDelegate.swift
,并在顶部添加import GooglePlaces
。// AppDelegate.swift import GooglePlaces
-
在
didFinishLaunchingWithOptions
方法中,在return
关键字之前添加以下代码。// AppDelegate.swift, application:didFinishLaunchingWithOptions let apiKey = "YOUR_API_KEY" GMSServices.provideAPIKey(apiKey)
-
将你的
ViewController
子类化成FormViewController
class YourViewController: FormViewController { override func viewDidLoad() { super.viewDidLoad() // Code for setting up Eureka goes here } }
-
在 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仓库
- 在克隆的文件夹中执行
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)
ld: framework not found GoogleMaps for architecture x86_64
。
Xcode报错这很可能是你忘记告诉XcodeGoogleMapsBase.framework
或GooglePlaces.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
文件中找到。