0

UIAttachmentBehavior と UIPanGestureRecognizer で水平方向のスワイプを実装するカスタム UITableViewCell があります。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の変更前の前の位置に移動します(セルがあった場合は1セル下)削除、セルが追加された場合は 1 つ上のセル)。私が知る限り、これは、tableView 内の位置が変更されたときにセルのフレームが更新されていないため、位置の y 座標が同期していないためです。[self setNeedsDisplay] と、見つけた他のすべての「ビューの更新」メソッドを試しましたが、役に立ちませんでした。

上記のアニメーターを次のように作成しています。

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

1 に答える 1

0

問題はいくつかの異なる場所にあるようです:

  1. アニメーターは、テーブル ビュー全体を参照ビューとして初期化されています。
  2. 次に、 tableViewの座標系で midY のアンカーを使用してアタッチメント動作を作成します。つまり、アタッチメント動作は、セルの中心点がある場所にあるtableView の参照座標系のポイントに固定されます。tableView をスクロールしようとすると、奇妙なことも起こるに違いありません。

ダイナミクス動作の目標に応じて、実現しようとしている物理シミュレーションを完全に定義するために、アニメーターの参照フレームとアタッチメントのアンカー ポイントの両方を変更する必要があります。上記に基づいて、パン上のセル全体を単純に移動しようとしているように見えます。テーブルビューはフレームを使用してセルを直接配置するため、ビュー階層内の特定のコンテナービューのみを移動することをお勧めします。

キャンセル時にスナップバック効果を持つパンを提供しようとしている場合、この効果はいくつかの UIAttachmentBehavior インスタンスを使用してより適切に実装される可能性があります。1 つの動作インスタンスは、スワイプしたいビューを静止位置に固定し、もう 1 つは実際にパンを実行し、パンに上記のようにビューを移動します。dampingとを変更することで、2 つの相互作用間の相互作用を微調整できますfrequencyこの質問は、動的アイテムを使用して一般的にドラッグするための良い参考資料です。

要約すると、現在の問題を解決するには:

  1. セルの座標系に対するアニメーターの参照境界を定義します。cell.contentView
  2. アニメーターはその座標系のビューのみに関係する必要があるため、セルにアニメーターを直接管理させます。アニメータは、テーブル ビューのビュー階層についての知識を持っていない必要があります。セルのアニメーターから UIDynamicBehavior アイテムを追加/削除します。
于 2014-03-08T00:10:52.737 に答える