2

ドラッグアンドドロップのようなアプリがあります。画像を選択して画面上の任意の場所にドラッグできる場所!私が直面している問題は、別のビューに移動すると、戻ったときにすべての画像が中央にリセットされることです。たとえば、ボタンを押して画面2に移動すると、今行ったすべての「ドラッグされた」画像が中央に戻ります。

これは、AUTOLAYOUTを有効にしている場合にのみ発生します:(すべての画像が中央から始まるので、autolayoutで何かを推測しています...

何か案は ?!

これが私のドラッグイメージコードの例です。

 - (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {

CGPoint translation = [recognizer translationInView:self.view];
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                     recognizer.view.center.y + translation.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
}
4

1 に答える 1

6

ドラッグアンドドロップコードは、view.centerプロパティを変更することにより、レイアウトを手動で構成しています。

自動レイアウトを有効にすると、自動レイアウトがレイアウトの設定を担当するため、view.center、view.bounds、およびview.frame(実際には中心と境界から計算される)の設定を独占的に担当します。

したがって、自動レイアウトを有効にすると、view.centerを手動で設定できますが、次に自動レイアウトを実行すると、設定されている制約を満たすレイアウトが計算されます。

では、自動レイアウトで機能するようにコードをどのように更新しますか?自動レイアウトを使用する場合は、handlePan:メソッドを変更して、view.centerを変更する代わりに、view.centerの計算に使用されている自動レイアウト制約を変更する必要があります。この詳細は、制約の構成によって異なります。ただし、たとえば、ビューの上部スペースをスーパービューに設定するNSLayoutContraint topSpaceConstraintと、ビューの左側のスペースをスーパービューに設定する別のNSLayoutConstraint leftSpaceConstraintがあると仮定すると、同じ効果を生成できます。

view.center = CGPointMake(view.center.x + translation.x,
                          view.center.y+ translation.y);

代わりに次のようなことをすることによって

topSpaceConstraint.constant = topSpaceConstraint.constant + translation.y;
leftSpaceConstraint.constant = leftSpaceConstraint.consant + translation.x;
[view setNeedsLayout];
[view layoutIfNeeded];

最初の2行は、制約を更新します。最後の2行により、自動レイアウトシステムは、実行ループの次のターンまで待機するのではなく、結果のフレームを再計算してすぐに適用します。

または、UIGestureRecognizerChangedイベントを取得したときにフレームを手動で更新し、UIGestureRecognizerEndedイベントを取得したときにのみ上記のように制約を更新することで、結果を「永続的」にすることができる場合があります。多くのUIGestureRecognizerChangedイベント中に、自動レイアウトシステムに依存するのではなく、フレームを直接更新するため、パフォーマンスが向上します。

于 2012-11-24T14:47:32.450 に答える