Tests测试 | ✗ |
Lang语言 | SwiftSwift |
许可证 | MIT |
Released上次发布 | 2017 年 8 月 |
SwiftSwift 版本 | 3.2 |
SPM支持 SPM | ✗ |
由 Rob Nash 维护。
折叠机制可以在几分钟内安装。但 UI 的创意设计和样式则取决于实现的开发者。
运行 XCode 方案 'CollapsibleTableDemo' 来查看演示 App
CocoaPods
将 pod "CollapsibleTable"
行添加到您的 Podfile
Carthage
将 github "rob-nash/CollapsibleTable"
行添加到您的 Cartfile
首先子类化 UITableViewHeaderFooterView
import UIKit
class ArrowSectionHeaderView: UITableViewHeaderFooterView
{
@IBOutlet fileprivate weak var mainTitleLabel: UILabel!
@IBOutlet fileprivate weak var arrowImageView: UIImageView?
fileprivate var isRotating = false
}
然后遵守 HeaderFooterViewCollapsible 协议
import CollapsibleTable
extension ArrowSectionHeaderView: HeaderFooterViewCollapsible
{
func updateTitle(with value: String) {
mainTitleLabel.text = value
}
func open(animated: Bool) {
if animated == true && isRotating == false {
isRotating = true
UIView.animate(withDuration: 0.2, delay: 0, options: [.curveLinear,.allowUserInteraction], animations: {
self.arrowImageView?.transform = .identity
}, completion: { _ in
self.isRotating = false
})
} else {
layer.removeAllAnimations()
arrowImageView?.transform = .identity
isRotating = false
}
}
func close(animated: Bool) {
let angle = radians(degrees: 90)
let transform = CGAffineTransform(rotationAngle: angle)
if animated == true && isRotating == false {
isRotating = true
UIView.animate(withDuration: 0.2, delay: 0, options: [.curveLinear,.allowUserInteraction], animations: {
self.arrowImageView?.transform = transform
}, completion: { _ in
self.isRotating = false
})
} else {
layer.removeAllAnimations()
arrowImageView?.transform = transform
isRotating = false
}
}
private func radians(degrees: CGFloat) -> CGFloat {
return .pi * degrees / 180
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
guard let t = touches.first else { return }
let point = t.location(in: self)
respondToTouchAtPoint(point)
}
}
创建一个表示表格视图每个部分的实例集合。
import Foundation
class Food
{
/// The section title
fileprivate let title: String
/// The rows
fileprivate var items: [Item]
/// Are rows hidden
fileprivate var isHidden = false
init(title: String, items: [Item], isHidden: Bool) {
self.title = title
self.items = items
self.isHidden = isHidden
}
}
class Item
{
let title: String
var isSelected: Bool
init(title: String, isSelected: Bool = false) {
self.title = title
self.isSelected = isSelected
}
}
表示表格视图部分的每个模型实例都必须遵守 CollapsibleTableSectionDatasource。
extension Food: CollapsibleTableSectionDatasource
{
typealias TableRow = Item
var rows: [Item] {
get {
return items
}
set(newValue) {
items = newValue
}
}
var state: RowVisibility {
get {
return isHidden ? .collapsed : .expanded
}
set(newValue) {
switch newValue {
case .collapsed:
isHidden = true
case .expanded:
isHidden = false
}
}
}
var sectionTitle: String {
return title
}
var sectionHeaderNibName: String {
return "ArrowSectionHeaderView"
}
var sectionHeaderViewIdentifier: String {
return "ArrowSectionHeaderViewID"
}
var sectionHeaderNibBundle: Bundle {
return .main
}
}
创建一个遵守 TableCollapsible 的 UITableView 子类。
import UIKit
import CollapsibleTable
class FoodShoppingTableView: UITableView, TableCollapsible
{
typealias TableSection = Food
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
separatorStyle = .none
let nib = UINib(nibName: "ArrowSectionHeaderView", bundle: nil)
register(nib, forHeaderFooterViewReuseIdentifier: "ArrowSectionHeaderViewID")
observeSectionHeaders()
}
deinit {
stopObservingSectionHeaders()
}
}
通过从 CollapsibleTableDatasource 派生来创建一个数据源。
import UIKit
import CollapsibleTable
class FoodShoppingTableViewDatasource: CollapsibleTableDatasource<Food>
{
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: CustomCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell
let section: Food = sections[indexPath.section]
let item: Item = section.rows[indexPath.row]
cell.mainTitleLabel?.text = item.title
return cell
}
}
然后连接它们
import UIKit
import CollapsibleTable
class ViewController: UIViewController
{
@IBOutlet private weak var tableView: FoodShoppingTableView! {
didSet {
let appDelegate = UIApplication.shared.delegate as? AppDelegate
tableView.dataSource = appDelegate?.foodShoppingTableViewDatasource
}
}
}
如果您喜欢这个库并希望请您喝一杯,可以使用比特币。
比特币地址:15Gj4DBTzSujnJrfRZ6ivrR9kDnWXNPvNQ