非常规使用 UITableView, reloadSections时动画效果异常
2017-02-25 13:25
1161 查看
直接上现象:
可以看到在调用
如果情况只是这样,那还好搞。但事实是,有时候你还在
效果:
强制取消
效果:
可是如果我们非要保留这个过渡动画呢?
你没有看错,需求有时就是这个样子的,所以才会发生流血事件 -_-#
效果:
如果你把动画放慢,会发现在动画过程中,
Demo下载 - Raspberry Pi
Demo - CSDN附件
这种方法不官方,但确实可行,是目前我想到的保留动画的解决方式。如果你们有其它的解决方式,请一定通知我: <824219521@qq.com>
可以看到在调用
reloadSections方法更新
Section 2时,由于
Section 1只有一个
Header区域,没有对应的
Cell, 从而引起了这个现象。更新调用的方法如下:
func reloadSection2(_ sender: UIButton) { tableView.reloadSections(IndexSet.init(integer: 2), with: .automatic) }
问题说明
按照通常的逻辑关系,没有行数的Section压根就不应该创建相关的UI,但在实际应用时,由于数据获取和UI显示的不同步或者某些历史原因,导致我们先给UI占了位,等数据获取后再刷新显示,这就出现了上面所说的场景和现象了。
如果情况只是这样,那还好搞。但事实是,有时候你还在
Section没有内容的时候把那个
Section Header给隐藏起来了,这就给定位问题带来了很大的麻烦。我和我的小伙伴花了整整一天,才在项目中找到原因,简直累死。现在做了Demo来演示这个问题。
解决方案1 - 取消动画的方式
全局刷新TableView:
func reloadSection2(_ sender: UIButton) { tableView.reloadData() }
效果:
强制取消
reloadSections的动画效果:
func reloadSection2(_ sender: UIButton) { UIView.performWithoutAnimation { tableView.reloadSections(IndexSet.init(integer: 2), with: .automatic) } }
效果:
可是如果我们非要保留这个过渡动画呢?
你没有看错,需求有时就是这个样子的,所以才会发生流血事件 -_-#
解决方案2 - 保留动画效果
给空Section指定一个行,并通过设置高度控制显示/隐藏override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if section == 1 { return 1 //强制给Section 1指定一行Cell } return 3 } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.section == 1 { return 0 //通过控制Section 1的Cell的高度来隐藏这个指定的Cell } return 40 }
效果:
如果你把动画放慢,会发现在动画过程中,
Section 1强制指定的的Cell有时会在动画初期出现,这个是由于
View的
clipsToBounds没有设置的缘故,导致视图的内容可以在边界外显示出来。我们可以给
Cell设置这个属性,以消除这个影响:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) cell.textLabel?.text = self.randomSmallCaseString(length: 20); cell.backgroundColor = UIColor.green cell.clipsToBounds = true; // 设置这个属性,那内容限制在视图的边框内部不会越界显示 return cell }
Demo下载 - Raspberry Pi
Demo - CSDN附件
这种方法不官方,但确实可行,是目前我想到的保留动画的解决方式。如果你们有其它的解决方式,请一定通知我: <824219521@qq.com>
相关文章推荐
- 使用UITableView实现图片视差效果
- UITableView中cell点击的绚丽动画效果
- UITableView的使用(UITableViewCell\section页眉\section页脚复用、sectionHeaderView点击效果)
- 手势检测实现相册的左右滑动(并加上移动与旋转的特效) 首先,activity_main.xml里,使用ViewFlipper组件(可使用动画控制多个组件之间的切换效果) <?xml version="
- 【iOS开发】关于显示一连串图片组成动画效果UIImageView的使用
- IOS 开发使用UITableView实现抽屉打开关闭效果
- ViewPager使用1-ViewPager多页面滑动切换以及动画效果(ViewPager+Layout+PagerAdapter )
- 有关ViewFlipper的使用及设置动画效果的讲解
- View动画另一些使用场景--LayoutAnimation和Activity之间的切换效果
- Android 使用View的旋转实现漂亮的动画效果
- UITableview reloadData Animation 动画效果
- 使用maskView设计动画效果
- Android成长日记-使用ViewFlipper实现屏幕切换动画效果
- UITableView Cell 弹簧动画效果
- 有关ViewFlipper的使用及设置动画效果的讲解
- iOS-UITableView使用reloadSections刷新section问题
- 使用ViewPager多页面滑动切换以及动画效果
- uitable view自带的动画效果
- Android入门(34)——第十一章 使用ViewFlipper实现屏幕切换动画效果
- Objective-UIImageView的创建和使用(带动画效果)