tableview折叠动效
缘起于看见书旗小说的列表有点击折叠的动效,觉得十分炫酷。想了三分钟,不知道怎么写。晚上百度了下,知道了大致流程,于是自己实现了下,发现不少坑,于是写下这篇博文
实现原理:
1 tableview cell高度自适应
2 点击cell时,控制cell对应的数据源显示,更新约束后,tableView reloadData
贴下核心代码:
class CellMdl:NSObject {
var title:String?
var img:UIImage?
var detail:String?
}
class FoldCell:UITableViewCell {
var title:UILabel!
var detail:UILabel!
var imgView:UIImageView!
var indicator:UIImageView!
var mdl:CellMdl!
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
addViews()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func addViews() {
}
override func layoutSubviews() {
title.snp.makeConstraints { (make) in
make.top.left.equalTo(self)
make.height.equalTo(44)
make.right.equalTo(indicator.snp.left)
}
indicator.snp.makeConstraints { (make) in
make.centerY.equalTo(title)
make.right.equalTo(self)
}
imgView.snp.makeConstraints { (make) in
make.top.equalTo(title.snp.bottom)
make.left.right.equalTo(self)
}
detail.snp.makeConstraints { (make) in
make.top.equalTo(imgView.snp.bottom)
make.left.right.bottom.equalTo(self)
}
}
func showIndicatorAni(back:Bool,blk:(()->Void)?) {
let rotate = !back ? CGAffineTransform(rotationAngle: .pi) : .identity
UIView.animate(withDuration: 0.3, animations: {
self.indicator.transform = rotate
}) { (finish) in
self.detail.text = !back ? self.mdl.detail : nil
self.imgView.image = !back ? self.mdl.img : nil
// self.layoutIfNeeded()
if blk != nil {
blk!()
}
}
}
// 设置数据源
func setMdl(cellMdl:CellMdl) {
mdl = cellMdl
title.text = cellMdl.title
// detail.text = cellMdl.detail
// imgView.image = cellMdl.img
}
}
这里对应cell声明一个专属cell的model,为cell提供数据
实现autolayout的关键步骤是
1.setModel时,仅将显示的头部视图赋值,未赋值视图应没内容自适应后不会显示,将传入的model用变量存下来(后续使用)
2.点击动画,代码请细看showIndicatorAni函数
这里有两参数,第一个back参数:是否折叠,第二个是个blk,方便外部进行操作。
如果不折叠,即显示全部内容,将model的数据赋值给需要显示的视图;如果折叠,不需要显示全部内容,将不需显示的视图内容清空。
动画完且数据设置完全后,更新约束self layoutIfNeed后将动作传出
然后是外部tableView点击的具体实现
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if previousCell != nil {
previousCell?.showIndicatorAni(back: true,blk: nil)
}
if let foldcell = tableView.cellForRow(at: indexPath) as? FoldCell {
weak var weakSelf = self
foldcell.showIndicatorAni(back: false,blk: {
weakSelf?.tableView.reloadData()
})
previousCell = foldcell
}
}
这里设置个变量previousCell标识前一个选择的cell。为什么写这个变量?选择的cell动画后,前一个cell的动画要还原,并且显示的视图要隐藏,要隐藏,要隐藏!!!
然后新选择的cell.showIndicator,回调中刷新tableview
顺带提一下tableview设置的关键点
1.cell自适应设置姿势
tableView.estimatedHeight = 100
tableView.rowHeight = UITableviewAutomaticDimension
2.cell单选
tableView.allowMutableSelection = false
效果图贴一张

tableview折叠动效的更多相关文章
- iOS转场弹窗、网易云音乐动效、圆环取色器、Loading效果等源码
iOS精选源码 view controller transition and popover (控制器转场和弹窗) UITableView头部悬停+UITableView侧滑嵌套 一行代码集成时间选择 ...
- iOS开发Facebook POP动效库使用教程
如果说Origami这款动效原型工具是Facebook Paper的幕后功臣,那么POP便是Origami的地基.感谢Facebook开源了POP动效库,让人人都能制作出华丽的动效.我们只需5步,便能 ...
- 一个绚丽的loading动效分析与实现!
最终效果如下 从效果上看,我们需要考虑以下几个问题: 1.叶子的随机产生: 2.叶子随着一条正余弦曲线移动: 3.叶子在移动的时候旋转,旋转方向随机,正时针或逆时针: 4.叶子遇到进度条,似乎是融合进 ...
- 用AE如何制作如下三个loading动效,
在本期象牙绘UED团队分享当中,我们将详细演示用AE如何制作如下三个loading动效, 其中涉及到AE表达式的应用.值曲线调整.速度曲线编辑等知识. 对于初学者来说可能信息量略大,希望通过是视频教程 ...
- 玩转HTML5移动页面(动效篇)(转载)
本文转载自: 玩转HTML5移动页面(动效篇)
- 玩转HTML5移动页面(动效篇)
原文:http://www.grycheng.com/?p=458 作为一名前端,在拿到设计稿时你有两种选择: 1.快速输出静态页面 2.加上高级大气上档次狂拽炫酷屌炸天的动画让页面动起来 作为一个有 ...
- 动效解析工厂:Mask 动画
转载自:http://www.cocoachina.com/ios/20160214/15250.html 前言:很多动效都是多种动画的组合,有时候你可能只是需要其中某个动画,但面对庞杂的代码库或是教 ...
- Web动效研究与实践
随着CSS3和HTML5的发展,越来越多狂拽炫酷叼炸天的动效在网页设计上遍地开花,根据最新的浏览器市场份额报告,IE6的份额已经降到了5.21%,这简直是一个喜大普奔的消息,做动效可以完全不care低 ...
- Android 一个绚丽的loading动效分析与实现!
http://blog.csdn.net/tianjian4592/article/details/44538605 前两天我们这边的头儿给我说,有个 gif 动效很不错,可以考虑用来做项目里的loa ...
随机推荐
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- GO语言异常处理01---恐慌的报出与处理
package main import ( "fmt" "math" ) /*自己报出恐慌的语法*/ func main021() { fmt.Println( ...
- PyTorch Data Parrallel数据并行
PyTorch Data Parrallel数据并行 可选择:数据并行处理 本文将学习如何用 DataParallel 来使用多 GPU. 通过 PyTorch 使用多个 GPU 非常简单.可以将模型 ...
- deeplearning量化
deeplearning量化 量化配置 通过字典配置量化参数 TENSORRT_OP_TYPES = [ 'mul', 'conv2d', 'pool2d', 'depthwise_conv2d', ...
- 如何在TVM上集成Codegen(下)
如何在TVM上集成Codegen(下) Bring DNNL to TVM: JSON Codegen/Runtime 现在实现将中继图序列化为JSON表示的DNNL codegen,然后实现DNNL ...
- VLAN与三层交换机
VLAN概述与优势 ①分割广播域 物理分割 逻辑分割 ②VLAN的优势 控制广播 增强网络安全性 简化网络管理 VLAN的范围 VlAN ID范围 范围 用途 0,4095 保留 仅限系统使用,用户 ...
- Kali 2021.2 最新安装教程 图文详解(保姆式)
0x00 前言 Kali Linux 新版本(2021.2)增加大量新工具和功能,感兴趣的小伙伴可以到kali官网查看相关介绍. 新版采用Xfce 4.16桌面环境,附上帅照! 0x01 安装环境 宿 ...
- Spring Cloud Alibaba(15)---Sleuth+Zipkin
SpringCloudAlibaba整合Sleuth+Zipkin 有关Sleuth之前有写过两篇文章 Spring Cloud Alibaba(13)---Sleuth概述 Spring Cloud ...
- Pytest学习笔记2-setup和teardown
前言 我们在做自动化的时候,常常有这样的需求: 执行每一条用例时,都重新启动一次浏览器 每一条用例执行结束时,都清除测试数据 在unittest中,我们可以使用 setUp() 和 tearDown( ...
- Spring Cloud专题之三:Hystrix
在微服务架构中,我们将系统拆分成很多个服务单元,各单位的应用间通过服务注册与订阅的方式相互依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问 ...