9

これが起こっているビデオです:

http://cl.ly/3V0D3U1m3w0E

基本的に、パン中に UIImageView (X) のイメージ プロパティを変更すると、ビュー内のすべてのコントロールがパンされていない元の位置に戻ります。(それらはすべて UIView に埋め込まれているため、「セルをパン」できますが、UIImageViews はビューの外にあり、独立しています。)

画像を変更しない場合:

http://cl.ly/3T1N1G33320G

記録のために、ユーザーが一定量パンしたときに画像を変更します。80 ポイントだと思います。

コードは次のとおりです。

// Only allow the cell to be moved 100 pixels left or right
if (xPos <= 100 && xPos >= -100) {
    // Move our cell to the xPos we defined
    CGRect slidingViewFrame = self.slidingView.frame;
    slidingViewFrame.origin = CGPointMake(xPos - 100, 0);
    self.slidingView.frame = slidingViewFrame;

    if (xPos >= 80) {
        if (_removeIconIsActive == NO) {
            // Change remove icon to a red, active state and animate the change
            self.removeIconImageView.image = [UIImage imageNamed:@"remove-icon-active.png"];

            _removeIconIsActive = YES;
        }

        CGRect removeIconFrame = self.removeIconImageView.frame;
        removeIconFrame.origin = CGPointMake(40, 35);
        self.removeIconImageView.frame = removeIconFrame;
    }
}

ビューはストーリーボードで設定されますが、移動と操作はすべてコードで行われます。

ストーリーボードのレイアウトは次のとおりです。

ここに画像の説明を入力

セルのパンニングを処理する完全なメソッドは次のとおりです: https://gist.github.com/anonymous/c51c7cb2997c89094f08

4

1 に答える 1

6

自動レイアウトを使用している場合は、フレーム プロパティをまったく変更しないでください。フレームは、「書き込み」プロパティではなく、レイアウト制約を適用した結果です。

ビューの x 位置を設定する制約があると思います。その制約の を作成し、IBOutletを変更する代わりに、制約のプロパティをframe変更します。constant次にlayoutIfNeeded、ビューのを呼び出します。

ビュー、制約、およびアウトレットについて詳しく確認しないと、最終的なコードを提供できませんが、次のようなコードで終了します。

self.leftConstraint.constant = xPos - 100.f;
[self.slidingView setNeedsUpdateConstraints];
[self.slidingView layoutIfNeeded];

何が起こっているかについての私の解釈は、画像を設定すると画像ビューの固有のサイズが変更され、それにより制約が再計算され、すべてが開始位置にスナップされるというものです。別のピクセルをスライドさせるとすぐに、再びキックインし、frameプロパティが再び勝ちます。

それが役に立てば幸い。

于 2013-06-12T19:36:21.247 に答える