19

左右にスクロールするときに弾むような感触を与えるために、各セルにセットを持つUICollectionViewカスタムの水平があります。動作には次のプロパティがあります。UICollectionViewFlowLayoutUIAttachmentBehavior

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

新しいセルがコレクション ビューに追加されると、そのセルは下部に追加され、UIAttachmentBehavior. 当然のことながら、その位置に収まるまで少し上下に跳ねます。今まですべてが期待どおりに機能しています。

ここに画像の説明を入力

新しく追加されたセルが静止する前にコレクション ビューを左右にスクロールすると、問題が発生し始めます。は、追加されたセルが既に持っている上下の弾力性に左右の弾力性を追加します。これにより、セル内で非常に奇妙な円運動が発生します。

ここに画像の説明を入力

私の質問は、コレクション ビューのスクロール中に UIAttachmentBehavior の垂直方向の動きを止めることは可能ですか? 新しく追加されたセルが停止するまで、複数の添付ファイル動作を使用したり、コレクション ビューでスクロールを無効にしたりするなど、さまざまなアプローチを試しましたが、どれもこれを停止していないようです。

4

6 に答える 6

4

これを解決する 1 つの方法は、添付ファイル動作の継承された .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

コレクション ビューがスクロールを開始したときの動作を削除するか、バネ性を大幅に減らして、スムーズに、しかしすばやく停止するようにする必要があります。考えてみれば、あなたが見ているのは、あなたが説明した愛着行動の現実的な動きです。

垂直方向の跳ね返りを同じレートに保ち、水平方向の跳ね返りを防ぐには、追加された各セルの左右に境界がある衝突動作など、他の動作を追加する必要があります。これにより、物理演算が少し複雑になり、スクロールのパフォーマンスに影響する可能性がありますが、試してみる価値はあります。

于 2014-05-15T14:32:59.647 に答える
1

を使用してセルからアニメーションを手動で削除しようとしましたCALayerremoveAllAnimations?

于 2014-05-12T00:51:14.550 に答える