如何在不裁剪行/子视图的情况下为 tableView 的大小调整设置动画?

Posted

技术标签:

【中文标题】如何在不裁剪行/子视图的情况下为 tableView 的大小调整设置动画?【英文标题】:How do you animate the resizing of a tableView without its rows/subviews getting clipped? 【发布时间】:2009-10-13 06:25:16 【问题描述】:

编辑:我最初就一般视图调整大小提出了这个问题,但现在我意识到它是针对 tableViews 的更具体的问题。

假设一个 tableView 最初有一个 (0 0, 320 460) 的框架,即它填满了整个 iPhone 屏幕。为了调整 tableView 的高度并为调整大小设置动画,我将以下代码映射到一个按钮:

[UIView beginAnimations:@"Animation" context:nil];
[UIView setAnimationDuration:3];

CGRect rect = self.table.bounds;
rect.size = CGSizeMake(320, 200);
self.table.bounds = rect;
self.table.center = CGPointMake(160, 100);

[UIView commitAnimations]; 

此代码将动画表格的高度向下,但是......在任何动画发生之前,表格将剪掉所有不适合新边界的表格单元格。因此,给定一个最初适合 10 行的 tableView,上面的动画代码将导致以下事件序列:

    tableView 会立即删除底部的 5 行。请注意,它只删除了行 - tableView 的背景仍然延伸到底部。 tableView 按预期动画显示表格其余部分的高度变化。

这不是我正在寻找的行为。 tableView 不应立即剪切底部 5 行,而应将其行保持在原位,而表格的底部边缘仅向上移动。

根据我看到的行为,似乎 tableView 在发现其边界将发生变化后立即收到某种消息来刷新其行。有人可以阐明这种行为以及如何避免这种行为吗?

【问题讨论】:

【参考方案1】:

视图的bounds属性定义了视图的内部坐标空间。如果您要更改视图的大小和/或位置,您应该只更改视图的框架。从理论上讲,bounds 属性可以定义一个与视图的封闭框架断开的完全任意的坐标空间,而 UIKit 似乎就是为了支持这种区别而设计的。在实践中,我认为我从未见过它在 UIKit 中以这种方式工作(bounds.size 始终与 frame.size 相同,并且 bounds.origin 始终为 0,0),但这就是区别在那里,记住这一点很重要 - 特别是如果这种行为在未来发生变化。

我不确定简单地更改代码来修改框架而不是边界是否能解决问题,但我建议从那里开始。如果那不能解决它,那么问题可能是 tableview 正在立即删除将在新框架中变得不可见的行,所以如果是这种情况,唯一的解决方案可能是自己做动画设置一个简单的 NSTimer 驱动的例程,随着时间的推移缓慢地改变帧的大小/位置,从而创建你想要的错觉,尽管 tableview 的优化或与 Core Animation 的交互。

【讨论】:

【参考方案2】:

您是否尝试过更改动画块内的边界中心。

我不知道这个具体案例,但 ISTR 之前必须做类似的事情。框架、边界和中心之间的关系有时会令人沮丧。

【讨论】:

是的,试过了,它的效果与只是更改框架相同(表格在动画之前将下半部分切掉)。我感觉它与滚动视图的 contentSize 有关,但无法弄清楚。

以上是关于如何在不裁剪行/子视图的情况下为 tableView 的大小调整设置动画?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 SwiftUI clipShape 影响子视图

如何在没有 UINavigationController 的情况下为 detailViewController 视图设置动画?

在不移动叠加视图的情况下裁剪和缩放图像,而是在 ImageView 中移动图像

如何在不将其添加到子视图的情况下截取 uiview?

如何在不改变其位置的情况下在界面生成器中将子视图置于前面

如何在不缩放图像子视图的情况下缩放图像?迅速的ios