ZYThumbnailTableView 1.0.5

ZYThumbnailTableView 1.0.5

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布日期上次发布日期2016年10月
SPM支持 SPM

liuzhiyi1992 维护。



  • liuzhiyi1992
可展开型预览TableView,开放接口,完全自由定制
An expandable preview TableView, custom-made all the modules completely with open API you can.
设计由 Sergii Ganushchak 完成



TableView 只有一个缩略图单元格,你可以使用手势让它展开其他扩展视图,全部 DIY
非常自由定制的可扩展TableView,其中tableViewCell、topExpansionView、bottomExpansionView都提供接口自由定制,功能堪比小型阅读app



如果你已经更新了Xcode 7.3,请使用名为 'Xcode7.3-Handle' 的分支。
如果已更新Xcode7.3,请下载分支Xcode7.3-Handle使用即可。

英文文档

总结

使用TableView皮肤,功能强大的内核类似于一个小型应用,解耦臂部和腿部,支持高度定制。每个单元格作为整体进行职业工作。你可以通过上滑和下滑来扩展更多扩展视图,您可以通过开放API完全自定义单元格和扩展视图,以携带参数来满足您的交互需求。

  • 工作特性:TableViewCell充当包含缩略图内容的容器,初始显示的内容限制为'cellHeight',当点击时,将重新计算完整的高度,之后你可以在扩展视图之间滑动。
  • 自定义:tableViewCell、topExtensionView、bottomExtensionView您可以提供给thumbnailTableView。
  • 简单易用:分配一个ZYThumbnailTableViewController对象,分配您自己的tableViewCell、ExtensionView(顶部或底部),然后您可以使用带有分配块的indexPath来实现您的要求。

使用

您可以参考示例代码来完成自己的缩略TableView。祝您玩得开心。
创建一个ZYThumbnailTableView对象

zyThumbnailTableVC = ZYThumbnailTableViewController()


配置tableViewCell、cellHeight、重用标识、dataSource等必要参数...

zyThumbnailTableVC.tableViewCellReuseId = "DIYTableViewCell"
zyThumbnailTableVC.tableViewCellHeight = 100.0
zyThumbnailTableVC.tableViewDataList = dataList
//you can modify the cellHeight & dataList all the place dynamically
//you must ensure the dataSource newest, dont forget to update it in network callback .
zyThumbnailTableVC.tableViewBackgroudColor = UIColor.whiteColor()
//default backgroundColor is white.


然后配置您的tableViewCell

//--------insert your custom tableview cell
zyThumbnailTableVC.configureTableViewCellBlock = {
    return DIYTableViewCell.createCell()
}


配置更新单元格功能

zyThumbnailTableVC.updateTableViewCellBlock =  { [weak self](cell: UITableViewCell, indexPath: NSIndexPath) -> Void in
    let myCell = cell as? DIYTableViewCell
    //Post is my datasource model
    guard let dataSource = self?.zyThumbnailTableVC.tableViewDataList[indexPath.row] as? Post else {
        print("ERROR: illegal tableview dataSource")
        return
    }
    myCell?.updateCell(dataSource)
}


配置您的扩展视图(顶部或底部)

  • 这两个块都提供了'indexPath'作为参数,我在示例中省略了'indexPath'参数,因为在我的BottomView中不需要使用它。
  • 这是关于zyThumbnailTableVC.keyboardAdaptiveView的配置,因为在我的BottomView中有一个测试字段,将其分配给keyboardAdaptiveView,ZYKeyboardUtil将处理键盘遮挡TextField的事件。(注意:分配给zyThumbnailTableVC.keyboardAdaptiveView和传递给createBottomExpansionViewBlock的同一个对象)
//--------insert your diy TopView
zyThumbnailTableVC.createTopExpansionViewBlock = { [weak self](indexPath: NSIndexPath) -> UIView in
    //Post是我的数据model
    let post = self?.zyThumbnailTableVC.tableViewDataList[indexPath.row] as! Post
    let topView = TopView.createView(indexPath, post: post)!
    topView.delegate = self;
    return topView
}

let diyBottomView = BottomView.createView()!
//--------let your inputView component not cover by keyboard automatically (animated) (ZYKeyboardUtil)
zyThumbnailTableVC.keyboardAdaptiveView = diyBottomView.inputTextField;
//--------insert your diy BottomView
zyThumbnailTableVC.createBottomExpansionViewBlock = { _ in
    return diyBottomView
}


ZYKeyboardUtil的工作效果


一般来说,完成您的自定义thumbnailtableView后,您可以在自定义的视图文件中创建交互,并使用'indexPath'将这些交互连接起来。

我在交互中使用'indexPath'的方式

  • 标记为已读,绿色圆点消失。
  • 标记为喜爱,在单元格的边缘显示一个星星。

我创建视图时,在topView对象中保存了'indexpath'参数,如果喜爱按钮被点击,我使用代理根据'indexPath'修改数据源,并通过zyThumbnailTableVC.reloadMainTableView()重新加载表格。

//TopView---------------------------------------------
class func createView(indexPath: NSIndexPath, post: Post) -> TopView? {
    //--------do something
    view.indexPath = indexPath
    return view
}

//touch up inside---------------------------------------------
@IBAction func clickFavoriteButton(sender: UIButton) {
    //--------do something
    delegate.topViewDidClickFavoriteBtn?(self)
}

//delegate func    in   ViewController---------------------------
func topViewDidClickFavoriteBtn(topView: TopView) {
    let indexPath = topView.indexPath
    //Post is my dataSource model
    let post = zyThumbnailTableVC.tableViewDataList[indexPath.row] as! Post
    post.favorite = !post.favorite
    zyThumbnailTableVC.reloadMainTableView()
}


对于导航栏,我在示例的ViewController中对zyThumbnailTableView对象的navigationItem进行处理,或者您可以在源代码中让ZYThumbnailTabelViewController继承您的公共Controller。

//------------ViewController------------
func configureZYTableViewNav() {
        let titleView = UILabel(frame: CGRectMake(0, 0, 200, 44))
        titleView.text = "ZYThumbnailTabelView"
        titleView.textAlignment = .Center
        titleView.font = UIFont.systemFontOfSize(20.0);
        //503f39
        titleView.textColor = UIColor(red: 63/255.0, green: 47/255.0, blue: 41/255.0, alpha: 1.0)
        zyThumbnailTableVC.navigationItem.titleView = titleView
    }



关于中文

总结

tableView的外观,类似于一个强大交互的小型应用的心脏,四肢高度解耦,高度自由定制,每个cell实际上都是一个业务的缩略视图,请原谅我语文表达不好,这样的缩略视图在以下文中称为thumbnailView。它可以根据上下手势展开更多的功能视图块,这些视图块已经开放了接口,支持用户自定义提供创建,同时接口中带的参数基本满足用户需要的交互,当然tableviewCell也是完全自由diy的。

  • 工作特点:tableViewCell充当一个缩略内容的容器,初始内容展示局限于cellHeight,当cell被点击后,根据缩略view内容重新计算出完整的高度,装入另一个容器中完整展示出来,并且可以上下拖动扩展出上下功能视图。

  • 自由定制:除了功能之外,所有视图都开放接口灵活diy,tableViewCell,头部扩展视图(topView),底部扩展视图(bottomView)都是自己提供。

  • 使用简单:只需要将自己的tableViewCell,topView,bottomView配置给ZYThumbnailTableViewController对象。


用法

------结合Demo介绍使用方法,手把手定制自己的ThumbnailTableView:
创建ZYThumbnailTableViewController对象:

zyThumbnailTableVC = ZYThumbnailTableViewController()


配置tableViewCell必须的参数:cell高,cell的重用标志符,tableView的数据源等

zyThumbnailTableVC.tableViewCellReuseId = "DIYTableViewCell"
zyThumbnailTableVC.tableViewCellHeight = 100.0
//当然cell高可以在任何时候动态配置
zyThumbnailTableVC.tableViewDataList = dataList
zyThumbnailTableVC.tableViewBackgroudColor = UIColor.whiteColor()
//背景颜色可不设置,默认为白色


接下来给ZYTableView配置你自己的tableViewCell,当然除了createCell外还可以在里面进行其他额外的操作,不过这个Block只会在需要生成cell的时候被调用,而重用cell并不会

//--------insert your diy tableview cell
zyThumbnailTableVC.configureTableViewCellBlock = {
    return DIYTableViewCell.createCell()
}


配置cell的update方法,tableView配置每个cell必经之处,除了updateCell可以添加额外的操作。这里要注意updateCell时建议尽量使用zyThumbnailTableVC对象里的数据源datalist,同时要注意始终保持VC对象里的数据源为最新,接口回调更改数据源时不要忘了对zyThumbnailTableVC.tableViewDataList的更新。

zyThumbnailTableVC.updateTableViewCellBlock =  { [weak self](cell: UITableViewCell, indexPath: NSIndexPath) -> Void in
    let myCell = cell as? DIYTableViewCell
    //Post是我的数据model
    guard let dataSource = self?.zyThumbnailTableVC.tableViewDataList[indexPath.row] as? Post else {
        print("ERROR: illegal tableview dataSource")
        return
    }
    myCell?.updateCell(dataSource)
}


配置你自己的顶部扩展视图 & 底部扩展视图(expansionView)

  • 两个Block都提供了indexPath参数,只是因为我BottomView的业务暂时不需要识别对应的是哪个cell,所以在使用时省略了这个参数。
  • 这里还有一个对zyThumbnailTableVC.keyboardAdaptiveView的赋值,因为我BottomView中包含有TextField,正如上文所说,ZYKeyboardUtil会自动帮我处理键盘遮挡事件。(==注意==:分配给keyboardAdaptiveView的和传递给Block的是同一个对象)
//--------insert your diy TopView
zyThumbnailTableVC.createTopExpansionViewBlock = { [weak self](indexPath: NSIndexPath) -> UIView in
    //Post是我的数据model
    let post = self?.zyThumbnailTableVC.tableViewDataList[indexPath.row] as! Post
    let topView = TopView.createView(indexPath, post: post)!
    topView.delegate = self;
    return topView
}

let diyBottomView = BottomView.createView()!
//--------let your inputView component not cover by keyboard automatically (animated) (ZYKeyboardUtil)
zyThumbnailTableVC.keyboardAdaptiveView = diyBottomView.inputTextField;
//--------insert your diy BottomView
zyThumbnailTableVC.createBottomExpansionViewBlock = { _ in
    return diyBottomView
}


结合ZYKeyboardUtil工作的效果


就这样,属于你自己的thumbnailtableView就完成了。展开、关闭,基本功能都可以使用,但如果有交互功能之类的在topView、bottomView中,就要在自己的头部尾部扩展控件和自定义的tableViewCell中完成,ZYThumbnailTableView提供cell的indexPath以贯通这三者通讯交流。


回顾一下Demo中的交互是如何利用indexPath的:

  • 标记为已读后,小圆点会消失
  • 标记为喜爱后,会在对应的cell旁边出现一个星星

createView时,我将从createTopExpansionViewBlock参数中得到的indexPath存储在我的topView对象中,当喜爱按钮被点击时,就可以根据indexPath利用代理改变对应数据源中的状态,同时在下次createView时根据indexPath取得对应的数据源来显示。如果这些交互会更新与cell相关的数据,还可以在代理方法中调用zyThumbnailTableVC.reloadMainTableView()使tableView重新加载。

//TopView---------------------------------------------
class func createView(indexPath: NSIndexPath, post: Post) -> TopView? {
    //--------do something
    view.indexPath = indexPath
    return view
}

//touch up inside---------------------------------------------
@IBAction func clickFavoriteButton(sender: UIButton) {
    //--------do something
    delegate.topViewDidClickFavoriteBtn?(self)
}

//代理方法---------------------------------------------
func topViewDidClickFavoriteBtn(topView: TopView) {
    let indexPath = topView.indexPath
    //Post是我的数据model
    let post = zyThumbnailTableVC.tableViewDataList[indexPath.row] as! Post
    post.favorite = !post.favorite
    zyThumbnailTableVC.reloadMainTableView()
}


还有对于导航条样式的处理,Demo中直接在外面对zyThumbnailTableView对象的navigationItem进行处理,或者可以在我的源代码中让ZYThumbnailTabelViewController继承您封装过导航栏样式的父类。

func configureZYTableViewNav() {
        let titleView = UILabel(frame: CGRectMake(0, 0, 200, 44))
        titleView.text = "ZYThumbnailTabelView"
        titleView.textAlignment = .Center
        titleView.font = UIFont.systemFontOfSize(20.0);
        //503f39
        titleView.textColor = UIColor(red: 63/255.0, green: 47/255.0, blue: 41/255.0, alpha: 1.0)
        zyThumbnailTableVC.navigationItem.titleView = titleView
    }


配置档

Block

  • ConfigureTableViewCellBlock = () -> UITableViewCell?
  • UpdateTableViewCellBlock = (cell: UITableViewCell, -indexPath: NSIndexPath) -> Void
  • CreateTopExpansionViewBlock = (indexPath: NSIndexPath) -> UIView
  • CreateBottomExpansionViewBlock = () -> UIView

定义

  • NOTIFY_NAME_DISMISS_PREVIEW
    通知名(让显示出的thumbnailView消失)
  • MARGIN_KEYBOARD_ADAPTATION
    自动处理键盘遮挡输入控件后,键盘与输入控件保持的间距(自动处理键盘遮挡事件使用ZYKeyboardUtil实现)
  • TYPE_EXPANSION_VIEW_TOP
    处理展开抖动事件时,顶部扩展控件的标识
  • TYPE_EXPANSION_VIEW_BOTTOM
    处理展开抖动事件时,底部扩展控件的标识

属性
开放:

  • tableViewCellHeight
  • tableViewDataList
  • tableViewCellReuseId
  • tableViewBackgroudColor
  • keyboardAdaptiveView 如果您自定义控件中有希望不被键盘遮挡的输入控件,分配给它,它会帮您自动处理遮挡事件

私有:

  • mainTableView
  • clickIndexPathRow 记录被点击cell的indexPath列
  • spreadCellHeight 存储thumbnailCell展开后的实际高度
  • cellDictionary 存储所有活动的cell
  • thumbnailView 缩略视图
  • thumbnailViewCanPan 控制缩略视图展开(扩展topView&buttomView)手势是否工作
  • animator UI物理引擎控制器
  • expandAmplitude 视图展开时抖动动作的振幅
  • keyboardUtil 自动处理键盘遮挡事件工具对象ZYKeyboardUtil

Delegate func

  • 可选 func zyTableViewDidSelectRow(tableView: UITableView, indexPath: NSIndexPath)

对外会用到的func

  • dismissPreview() 让thumbnailView消失,在没有zyThumbnailTableView对象的地方可以使用通知NOTIFY_NAME_DISMISS_PREVIEW
  • reloadMainTableView() 重新加载tableView


关系

@liuzhiyi1992 在 Github 上


许可证

ZYThumbnailTableView 采用 MIT 许可证发布。详情请参阅 LICENSE 文件。


有什么问题可以在github中提交 issues 进行交流,谢谢