动画在UITableView

时间:2017-08-04 20:16:17

标签: ios objective-c uitableview

我正在制作UIViewController来管理消息传递屏幕。我使用UITableView和一些自定义单元格来执行此操作。

为简化起见,每个单元格都包含:

  • 聊天"泡泡" (a UIView子类)
  • 其聊天文字(UILabel
  • 时间戳标题标签(可能隐藏)
  • 底部页脚标签(用于"发送...","已发送"等等;也可能隐藏)

由于性能问题,我没有使用单元格高度的自动调整大小,而是将单元格高度缓存到NSMutableDictionary

当用户发送或接收新消息时,我希望发生以下情况:

  1. 重新加载当前的最后一个消息单元格,如果需要,隐藏其底部标签。
  2. 新的最后一个消息单元格附加在UITableView
  3. 的底部
  4. 滚动UITableView,以便显示新的最后一个单元格。
  5. 我可以根据需要将其显示在屏幕的最终状态,但两者之间的动画实际上有点时髦。我已经尝试了很多不同的方法来让动画表现出来。基本上,似乎正在进行一些重大的重新加载,即使唯一可以可能更改其高度的单元格是最后一个单元格(在插入新单元格之前)。另外,我想让最后一个单元格出现"出现"没有动画的地方。如果是,它应该在屏幕外,然后我应该能够在屏幕上制作动画。

    我的当前"用户发送了一条新消息"方法:

    - (IBAction)sendButtonPressed {
        //Creation of the new message, into 'message' variable
    
        [self.messages          addObject:message];
    
        int thisIndex           = (int)self.messages.count - 1;
        NSIndexPath *this       = [NSIndexPath indexPathForRow:thisIndex inSection:0];
        int prevIndex           = (int)self.messages.count - 2;
        NSIndexPath *prev       = [NSIndexPath indexPathForRow:prevIndex inSection:0];
        [self removeCachedHeightForIndex:prevIndex];
        [self.tableView beginUpdates];
        [self.tableView reloadRowsAtIndexPaths:@[prev] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView insertRowsAtIndexPaths:@[this] withRowAnimation:UITableViewRowAnimationTop];
        [CATransaction setCompletionBlock:^{
            [self scrollToBottomAnimated:YES];
        }];
        [self.tableView endUpdates];
    }
    

    这似乎重新加载UITableView中的最后几个单元格。或者,至少,调用它时可见的每个单元格似乎都以某种方式进行动画处理。只有prev的单元格才会以任何方式发生变化。

    长期以来,我可能会将页眉和页脚标签拉出到不同的单元格中,但有没有办法按原样修复此动画故障?

0 个答案:

没有答案