【问题标题】:Animate Height Change for UITableViewCell Without Scrolling无需滚动的 UITableViewCell 的动画高度变化
【发布时间】:2013-09-17 11:46:47
【问题描述】:

我知道如何使用此处看到的方法为 UITableViewCell 的高度变化设置动画:Can you animate a height change on a UITableViewCell when selected?

但是,使用该方法,UITableView 将同时滚动,我不希望它这样做。

我有一个单元格很少的 UITableView;它占用的屏幕高度小于屏幕高度。底部单元格有一个 UITextField,当它开始编辑时,我手动设置了 UITableView 的内容偏移量,以便带有 UITextField 的单元格滚动到顶部。然后,根据 UITextField 中的输入,我可能希望增加 UITableViewCell 的大小以或多或少地显示额外的选项。

问题是,当为这个变化设置动画时,它会重新定位 UITableView,这样我的 UITextField 就不再位于顶部了。

这就是我正在做的,或多或少:

self.customAmountCellSize = height;

[self.tableView beginUpdates];
[self.tableView endUpdates];

我也试过

self.customAmountCellSize = height;
CGPoint originalOffset = self.tableView.contentOffset;

[self.tableView beginUpdates];
[self.tableView endUpdates];

[self.tableView setContentOffset:originalOffset animated:NO];

我想要行高动画,我不希望 UITableView 滚动。

有什么想法吗?

【问题讨论】:

  • 我正在将 UITableView 滚动到通常无法通过拖动实现的 ContentOffset,因为 UITableView 的内容小于单个屏幕的大小。但是,底部单元格在编辑时需要滚动到顶部。当我在编辑过程中更改底部单元格的大小时,UITableView 会滚动回一个可以通过拖动实现的 ContentOffset(在这种情况下,返回到 (0, 0) 的内容偏移量)。

标签: ios animation uitableview


【解决方案1】:

我认为表格视图正在滚动,因为您的文本字段正在成为第一响应者,而不是因为单元格高度发生变化。尝试保持单元格高度相同,只需调整偏移量即可。

如果我是正确的,那么解决方案如下:当您的键盘出现时,UITableView 会自动尝试滚动。要解决此问题,请将内容偏移量设置为您在调度到主队列中所需的偏移量,这将在下一个运行循环开始时触发。将以下代码放入您对 UIKeyboardWillShowNotification 的响应中,或在 UITextFieldDelegate shouldBeginEditing 方法中:

// Get the current offset prior to the keyboard animation
CGPoint currentOffset = self.tableView.contentOffset;
UIEdgeInsets currentInsets = self.tableView.contentInset;
__weak SomeTableViewControllerClass *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [UIView animationWithDuration:0 animations:{
        // set the content offset back to what it was
        weakSelf.tableView.contentOffset = currentOffset;
        weakSelf.tableView.contentInset = currentInsets;
    } completion:nil];
});

有时需要对表格视图的 contentInset.bottom 进行类似的修复,具体取决于您的 UITableView 的框架和其他因素。

【讨论】:

  • 我试过这个,但是没有用。另外,澄清一下,我的 UITextField 已经是第一响应者。我想我可以模拟一个非常快速的项目来展示我遇到的问题......
  • 您是否也尝试设置 contentInset ?我将更新我的示例代码向您展示。请记住,根据您的视图层次结构,contentInset 调整需求差异很大。一个示例项目会有所帮助。
【解决方案2】:

您遇到的问题似乎是您的表格视图滚动到了底部,因此当您更新其内容时,它会尝试修复该问题。

您可以采取两种方法来防止滚动:

  1. 将表格视图的内容插入设置为初始空白的高度:

    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, verticalGap, 0);
    
  2. 添加一个与垂直间隙高度相同的空页脚视图:

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, verticalGap)];
    

在这两种情况下,您都需要计算要达到的垂直空间。然后,您需要在完成后将contentInsettableFooterView 恢复到其原始状态。

【讨论】:

  • 是否可以为 tableView 的 contentInset 的变化设置动画?编辑:显然有,只要把它放在 UIView animateWithDuration 块中。
  • @MikeS,没有必要为内容插图设置动画以实现增长,但您可以在退出文本字段时对其进行动画缩小。
  • 是的,缩小的部分是问题所在;它将桌子猛拉回原位,而不是对其进行动画处理,但是使用动画效果很好。谢谢!我决定最好的方法是在编辑之前和之后设置 contentInset,正如你在第一个选项中建议的那样。这比我的重复计时器解决方案要简单得多!
  • 我会尽快给你赏金。再次感谢。
  • @MikeS,请注意,使用animateWithDurationUIScrollViewUITableView 的部分设置动画不会触发scrollViewDidScroll,从而防止自定义行为和单元格出列。如果您看到奇怪的副作用,您可能需要滚动到顶部,然后删除动画之外的内容偏移量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2015-02-27
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多