UITableViewCell框架在更改时不会更新

时间:2014-03-07 18:41:09

标签: objective-c uitableview uipangesturerecognizer uikit-dynamics

我有一个自定义UITableViewCell来实现与UIAttachmentBehavior和UIPanGestureRecognizer水平滑动。这是UITableViewCell子类中的相关部分:

- (void)panDidChange:(UIPanGestureRecognizer *)gesture {
CGPoint location = [gesture locationInView:[self tableView]];
location.y = CGRectGetMidY(self.frame);
switch (gesture.state) {
    case UIGestureRecognizerStateBegan: {
        self.panAttachment = [[UIAttachmentBehavior alloc] initWithItem:self attachedToAnchor:location];
        [self.animator addBehavior:self.panAttachment];

        break;
    }

然后,当UIGestureRecognizerStateChanged时,我只是将self.panAttachment.anchorPoint设置为位置。

现在,这在启动时运行良好,但是只要我将一个单元格添加到tableView或从tableView中删除一个单元格并尝试滑动,​​单元格就会在tableView更改之前移动到它之前的位置(如果一个单元格向下移动)如果添加了细胞,则删除一个细胞,一个细胞。到目前为止,正如我所知,这是因为当它在tableView中的位置发生变化时,单元格的框架没有被更新,因此位置的y坐标不同步。我已经尝试了[self setNeedsDisplay]和我能找到的所有其他“更新视图”方法,但无济于事。

我正在创建上面引用的动画师:

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:[self tableView]];

1 个答案:

答案 0 :(得分:0)

看起来这个问题出现在几个不同的地方:

  1. 您的动画制作工具正在初始化,并将整个表格视图作为参考视图。
  2. 然后,您正在 tableView 的坐标系中使用midY锚创建附件行为,这意味着您的附件行为现在已锚定到 tableView&#中的某个点39; s 参考坐标系,即细胞中心点所在的位置。我打赌如果你试图滚动你的tableView,也会发生奇怪的事情。
  3. 根据您的动态行为目标,您需要修改动画师的参考框架和附件的定位点,以便完全定义您尝试实现的物理模拟。基于以上所述,看起来您正试图简单地将整个单元格移动到平底锅上。我建议您尝试仅移动视图层次结构中的特定容器视图,因为表视图将使用框架直接放置单元格。

    如果您希望在取消时提供具有快照效果的平移,则可以使用几个UIAttachmentBehavior实例更好地实现此效果。一个行为实例用于锚定您想要滑动到其静止位置的视图,另一个用于实际执行平移并移动视图,就像您在平移期间在上面一样。您可以通过更改dampingfrequency来调整两个互动之间的互动。 This question是使用动态项目拖动的好参考。

    总结以解决您当前的问题:

    1. 定义动画师对单元格坐标系的参考边界,最好使用cell.contentView
    2. 让您的单元直接管理动画师,因为动画师只应关注其坐标系中的视图。您的动画师应该不了解表格视图的视图层次结构。添加/删除单元格动画制作中的UIDynamicBehavior项目。