我有一个带有自定义UICollectionView的水平UICollectionViewFlowLayout,该自定义UIAttachmentBehavior在每个单元格上都设置了UIAttachmentBehavior,以便在左右滚动时具有弹性。该行为具有以下属性:

attachmentBehavior.length = 1.0f;
attachmentBehavior.damping = 0.5f;
attachmentBehavior.frequency = 1.9f;

将新单元格添加到集合 View 时,它会添加到底部,然后也使用ojit_code动画到其位置。自然地,它会上下弹跳,直到它停在原位。到目前为止,一切都按预期进行。

在新添加的单元格停顿之前向左或向右滚动集合 View 时,我开始出现的问题。向左和向右增加上下左右单元格已被添加的跳动。这导致电池中非常奇怪的圆周运动。

我的问题是,在滚动集合 View 时是否可以停止UIAttachmentBehavior的垂直运动?我尝试了不同的方法,例如使用多种附件行为以及在集合 View 中禁用滚动,直到新添加的单元格停止运行为止,但是没有一种方法可以阻止这种情况。

最佳答案

解决此问题的一种方法是使用附件行为的继承的.action属性。

您将需要首先设置几个变量,例如(从内存,未经测试的代码):

BOOL limitVerticalMovement = TRUE;
CGFloat staticCenterY = CGRectGetHeight(self.collectionView.frame) / 2;

将这些设置为自定义UICollectionViewFlowLayout的属性

创建附件行为时:
UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:item attachedToAnchor:center];
attachment.damping = 1.0f;
attachment.frequency = 1.5f;
attachment.action = ^{
    if (!limitVerticalMovement) return;

    CGPoint center = item.center;
    center.y = staticCenterY;
    item.center = center;
};

然后,您可以通过适当设置limitVerticalMovement来打开和关闭限制功能。

09-04 23:26