1

UICollectionViewに含まれる他のいくつかのUIViewの1つにドラッグアンドドロップしたい、いくつかのサブビューを含むUIViewサブクラスがあります。ドラッグが開始されたら、ドラッグされたビューを現在のサイズからドラッグ中に小さいサイズにスケーリングしたいと思います (元のビューは大きすぎて、最初に縮小せずにドロップ ターゲットを簡単に選択できません)。私はこれを持っています:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.superview bringSubviewToFront:self];
    self.transform = CGAffineTransformMakeScale(0.3f, 0.3f);
    startLocation = ([[touches anyObject] locationInView:self]);
    startLocation = CGPointApplyAffineTransform(startLocation, self.transform);
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{  
    CGPoint pt = [[touches anyObject] locationInView:self];
    float dx = pt.x - startLocation.x;
    float dy = pt.y - startLocation.y;
    CGPoint newCenter = CGPointApplyAffineTransform (CGPointMake(self.center.x + dx, self.center.y + dy), self.transform);
    self.center = newCenter;
}

これは、ドラッグされた UIView を希望どおりにスケーリングし、ドラッグできるようにするための開始です。ただし、ドラッグされた UIView はマウス ポインターで直接移動しません (私はシミュレーターで実行しています)。画像がシミュレーター画面の左上隅近くにある場合、マウス ポインターとドラッグされたビューが一緒になります。しかし、画面の右上隅から離れると、ビューはマウス ポインターと一緒に直接移動しなくなります。マウス ポインターは、ドラッグされた UIView の動きに対して約 2:1 の比率で移動するように見えます。

二次的な問題は、ドラッグが終了したときにアイテムがドロップされていない場合、UIView をスーパービューに再アタッチする前に元のスケールに戻す必要があり、その方法がよくわからないことです。

ここで完全に軌道から外れている場合は、より良いアプローチに関する提案など、どんな助けにも感謝します。(ドロップターゲットを分離してドロップするために他にやるべきことがあることは知っていますが、そこで何をする必要があるかはわかっていると思います)。

ご指導ありがとうございます。

正規表現

4

2 に答える 2

2

さて、私は答えを得て、他の誰かがそれを必要とする場合に備えてここに投稿するべきだと思いました。以前の返信ありがとうございます。私は次の記事に出くわしました:

CGAffineTransformRotateを適用した後にUIImageViewを移動するにはどうすればよいですか?

そして、これは私に次の解決策をもたらしました。元のコードでは、変換を開始位置に適用していましたが、タッチポイントには適用していませんでした。だから、これが私が問題を解決した結果です:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.superview bringSubviewToFront:self];
    self.transform = CGAffineTransformMakeScale(0.2f, 0.2f);
    startLocation = ([[touches anyObject] locationInView:self]);
    startLocation = CGPointApplyAffineTransform(startLocation, self.transform);
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint pt = [[touches anyObject] locationInView:self];
    if (!CGAffineTransformIsIdentity(self.transform))
        pt = CGPointApplyAffineTransform(pt, self.transform);
    float dx = pt.x - startLocation.x;
    float dy = pt.y - startLocation.y;
    CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy);
    self.center = newCenter;
}

したがって、変換がUIViewに適用されている場合にのみ、変換をタッチポイントに適用する必要がありました。ある時点で、タッチポイントに変換を適用しましたが、条件付きではありませんでした。その場合、変換がタッチポイントに適用される前に、おそらくポイントが移動しました。とにかく、上記のコードは問題を解決したようです。

于 2013-02-20T17:59:42.187 に答える
0

touchesmoved はまだ古いサイズを使用しているようです。提案として、まずサイズを変更せずにドラッグ アンド ドロップを実装するだけで開始します。

ドラッグ アンド ドロップが機能している場合は、サイズ変更を実装します。最初にドラッグを開始し、次にドロップします。段階的に行うことで、達成しようとしていることをよりよく感じることができます。

2:1 の比率については、ビュー全体のサイズを変更しなかった変換に関するものだと感じていますが、間違っている可能性があります。ただし、ドラッグ ビューを小さくし、中央がドラッグ ポイントを指していることを確認してください。

役立つ参考文献は次のとおりです。

http://www.edumobile.org/iphone/iphone-programming-tutorials/simple-drag-and-drop-on-iphone/ http://bynomial.com/blog/?p=77

于 2013-02-20T00:54:50.637 に答える