19

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

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

当一个新单元格被添加到集合视图时,它被添加到底部,然后也使用UIAttachmentBehavior. 自然地,它会上下反弹一点,直到它停留在它的位置上。到目前为止,一切都按预期工作。

在此处输入图像描述

当集合视图在新添加的单元格静止之前向左或向右滚动时,我开始出现的问题。将左右弹性添加到单元格已经添加的上下一个。这导致细胞中非常奇怪的圆周运动。

在此处输入图像描述

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

4

6 回答 6

4

解决此问题的一种方法是使用附件行为的继承 .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来打开和关闭限制功能。

于 2014-05-19T13:38:53.630 回答
2

如果您使用的是 iOS 9 及更高版本,则附件类中的滑动功能将非常适合该工作:

class func slidingAttachmentWithItem(_ item: UIDynamicItem,
                attachmentAnchor point: CGPoint,
               axisOfTranslation axis: CGVector) -> Self

使用方便,对滑动Apple文档非常有效

于 2016-03-21T16:27:52.533 回答
1

您是否尝试过使用CALayer's从单元格中手动删除动画removeAllAnimations

于 2014-05-12T00:51:14.550 回答
1

当集合视图开始滚动时,您会想要删除该行为,或者可能会大大降低弹性,以便它平稳但快速地休息。如果你仔细想想,你所看到的是你所描述的依恋行为的现实运动。

要使垂直弹跳保持相同的速率但防止水平弹跳,您需要添加其他行为 - 例如在每个添加的单元格的左侧和右侧具有边界的碰撞行为。这会稍微增加物理的复杂性,并且可能会影响滚动性能,但值得一试。

于 2014-05-15T14:32:59.647 回答
1

这是我设法做到的。FloatRange 限制了附件的范围,因此如果您希望它在屏幕上一直上下移动,您只需设置非常大的数字。

这进入 func identifyPanGesture(sender: UIPanGestureRecognizer) {}

let location = sender.location(in: yourView.superview)
var direction = "Y"

var center = CGPoint(x: 0, y: 0)
if self.direction == "Y" {center.y = 1}
if self.direction == "X" {center.x = 1}

let sliding = UIAttachmentBehavior.slidingAttachment(with: youView, attachmentAnchor: location, axisOfTranslation: CGVector(dx: center.x, dy: center.y))

sliding.attachmentRange = UIFloatRange(minimum: -2000, maximum: 2000)
animator = UIDynamicAnimator(referenceView: self.superview!)
animator.addBehavior(sliding)
于 2017-03-05T09:32:23.703 回答
0

在添加新单元格后,我已采取在特定时间内禁用集合视图中的滚动,然后在该时间过去后使用其action属性删除附件行为,然后立即再次添加新的附件行为。

这样,我确保向上动画在集合视图向左或向右滚动之前停止,而且在滚动时左/右弹性仍然存在。

当然不是最优雅的解决方案,但它确实有效。

于 2014-05-17T13:07:22.550 回答