0

特定の寸法に合わせて画像をトリミングする必要があります。ビューには、下から始まる 3 つのレイヤーがあります。

  1. に生の画像がありUIImageます。この画像はカメラからのものです。(cameraImage と呼ばれる)
  2. UIViewこのイメージを持っています。ユーザーが「トリミング」をクリックすると、UIView の境界を使用して、その中の生の画像がトリミングされます。
  3. これらすべてに加えて、画像をパン、回転、ピンチして収まるようにする必要があるサイズをユーザーに示すガイド画像があります。

上部のガイド画像にパン ジェスチャを追加し、下部の raw 画像を制御したいと考えています。そのため、ガイド イメージは決して移動しませんが、パン ジェスチャをリッスンしています。生の画像をゼロに戻さずにレコグナイザーをリセットする方法がわかりません。多分誰かが助けることができますか?

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:recognizer.view];
recognizer.view.center = CGPointMake(recognizer.view.center.x+translation.x, recognizer.view.center.y+ translation.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:recognizer.view];
}

上記のコードは、私のジェスチャーでうまく機能し、下の画像に添付されています。問題は、ユーザーがビューの境界の外に出ると、画像のパンが停止し、基本的に動かなくなることです。もう触れることはできないので、そこに座っています。ですから、ジェスチャーを上に付ければ、この問題は解決すると思いました。

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:recognizer.view];
cameraImage.center = CGPointMake(recognizer.view.center.x+translation.x, recognizer.view.center.y+ translation.y);
}

これはほとんど機能します。cameraImage の中心を設定し、レコグナイザーをリセットする 3 行目を削除しました。取り除かないと、パンしようとするたびに cameraImage が同じ位置に戻ってしまいます。画像をもう一度クリックすると、タッチしたピクセルから開始されないため、ほとんど機能します。画像を元の位置に戻し、パンできるようにします。

4

1 に答える 1

2

最初のオプション: レコグナイザーがUIGestureRecognizerStateEnded状態に入るとき

if(recofnizer.state == UIGestureRecognizerStateEnded )
{
...
}

その時点での翻訳をクラスのインスタンス変数 (@property) に保存します。

そして、常に保存した翻訳を新しい翻訳に追加します。コードでは、これは次のようになります。

 - (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
       CGPoint translation = [recognizer translationInView:recognizer.view];
       CGPoint updatedTranslation = CGPointMake(translation.x+self.savedTranslation.x,translation.y+self.savedTranslation.y);
       cameraImage.center = CGPointMake(recognizer.view.center.x+updatedTranslation.x, recognizer.view.center.y+ updatedTranslation.y);
       if(recofnizer.state == UIGestureRecognizerStateEnded )
       {
          self.savedTranslation = updatedTranslation;
       }
}

@property (nonatomic, assign) CGPoint savedTranslation;インターフェイスに追加することを忘れないでください。また、savedTranslation 変数がクラスの init メソッドで初期化されていることを確認してください。self.savedTranslation = CGPointMake(0,0);

2番目のオプション:スクロールビューのviewForZoomingとしてイメージビューを使用して、スクロールビューで必要なことをすべて行うことを検討する必要があります。これにより、ユーザーが慣れているように、非常にスムーズな対話が可能になります!

このスクロールビューの上にマスク/ガイドを配置できますが、マスク/ガイド ビューの userInteraction を無効にして、ユーザーが下のスクロールビューに触れられるようにしてください。

于 2013-04-10T21:15:01.817 に答える