LUExpandableTableView
UITableView
的子类,具有可展开和可收缩的节
预览
安装
CocoaPods
CocoaPods是Cocoa项目的依赖管理器。您可以使用以下命令安装它
$ sudo gem install cocoapods
需要CocoaPods 1.7.0+版本。
要使用CocoaPods将LUExpandableTableView
集成到您的Xcode项目中,请指定Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!
target '<Your Target Name>' do
pod 'LUExpandableTableView'
end
然后,运行以下命令
$ pod install
Carthage
您可以使用 Carthage 通过将其添加到您的 Cartfile
来安装 LUExpandableTableView
github "LaurentiuUngur/LUExpandableTableView" ~> 5.0
然后运行 carthage update
。
如果这是您第一次在项目中使用Carthage,您需要通过在Carthage中操作说明来完成一些额外的步骤。
Swift Package Manager
要使用Apple的Swift Package Manager进行集成,请将以下内容添加到您的Package.swift
中,作为依赖项
.Package(url: "https://githubLaurentiuUngur/LUExpandableTableView", majorVersion: 5)
以下是一个PackageDescription
的示例
import PackageDescription
let package = Package(name: "MyApp",
dependencies: [
.Package(url: "https://github.com/LaurentiuUngur/LUExpandableTableView", majorVersion: 5)
])
手动
如果您不想使用上述任一依赖项管理器,您可以直接手动将LUExpandableTableView
集成到您的项目中。
用法
- 将
LUExpandableTableView
导入您的项目。
import LUExpandableTableView
- 为
LUExpandableTableView
实例注册一个单元格。注册的类必须是UITableViewCell
的子类。如果您使用的是Storyboard,此步骤不是必需的。
expandableTableView.register(MyTableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
- 为
LUExpandableTableView
实例注册一个头部。注册的类必须是LUExpandableTableViewSectionHeader
的子类。请注意,在此步骤中无法使用Storyboard。
expandableTableView.register(UINib(nibName: "MyExpandableTableViewSectionHeader", bundle: Bundle.main), forHeaderFooterViewReuseIdentifier: sectionHeaderReuseIdentifier)
- 设置为数据源和代理。
expandableTableView.expandableTableViewDataSource = self
expandableTableView.expandableTableViewDelegate = self
- 实现
LUExpandableTableViewDataSource
和LUExpandableTableViewDelegate
协议。
// MARK: - LUExpandableTableViewDataSource
extension ViewController: LUExpandableTableViewDataSource {
func numberOfSections(in expandableTableView: LUExpandableTableView) -> Int {
return 42
}
func expandableTableView(_ expandableTableView: LUExpandableTableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
func expandableTableView(_ expandableTableView: LUExpandableTableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = expandableTableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as? MyTableViewCell else {
assertionFailure("Cell shouldn't be nil")
return UITableViewCell()
}
cell.label.text = "Cell at row \(indexPath.row) section \(indexPath.section)"
return cell
}
func expandableTableView(_ expandableTableView: LUExpandableTableView, sectionHeaderOfSection section: Int) -> LUExpandableTableViewSectionHeader {
guard let sectionHeader = expandableTableView.dequeueReusableHeaderFooterView(withIdentifier: sectionHeaderReuseIdentifier) as? MyExpandableTableViewSectionHeader else {
assertionFailure("Section header shouldn't be nil")
return LUExpandableTableViewSectionHeader()
}
sectionHeader.label.text = "Section \(section)"
return sectionHeader
}
}
// MARK: - LUExpandableTableViewDelegate
extension ViewController: LUExpandableTableViewDelegate {
func expandableTableView(_ expandableTableView: LUExpandableTableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
/// Returning `UITableViewAutomaticDimension` value on iOS 9 will cause reloading all cells due to an iOS 9 bug with automatic dimensions
return 50
}
func expandableTableView(_ expandableTableView: LUExpandableTableView, heightForHeaderInSection section: Int) -> CGFloat {
/// Returning `UITableViewAutomaticDimension` value on iOS 9 will cause reloading all cells due to an iOS 9 bug with automatic dimensions
return 69
}
// MARK: - Optional
func expandableTableView(_ expandableTableView: LUExpandableTableView, didSelectRowAt indexPath: IndexPath) {
print("Did select cell at section \(indexPath.section) row \(indexPath.row)")
}
func expandableTableView(_ expandableTableView: LUExpandableTableView, didSelectSectionHeader sectionHeader: LUExpandableTableViewSectionHeader, atSection section: Int) {
print("Did select cection header at section \(section)")
}
func expandableTableView(_ expandableTableView: LUExpandableTableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
print("Will display cell at section \(indexPath.section) row \(indexPath.row)")
}
func expandableTableView(_ expandableTableView: LUExpandableTableView, willDisplaySectionHeader sectionHeader: LUExpandableTableViewSectionHeader, forSection section: Int) {
print("Will display section header for section \(section)")
}
}
要获取更多用法详情,请参阅示例应用程序
问题
- 在iOS 9上返回
UITableViewAutomaticDimension
会由于iOS 9的自动尺寸bug导致所有单元格重新加载。在iOS 10上则正常工作。
需求
- Xcode 10.2+
- Swift 5.0+
- iOS 9.0+
作者
许可
- LUExpandableTableView 在 MIT 许可证 下提供。