2012-03-15 11 views
0

私はImageViewを長押しして別の場所にドラッグできるようにするUILongPressGestureRecognizerを実装しています。長時間のプレスが始まると、私は、ドラッグが準備ができていることを示すためにビューを拡大し、ユーザーは次にドラッグできます。これは、セレクタが変更状態で呼び出されるたびにImageViewsフレームを更新することによって実現されます。これは完全に動作しますが、ビューのコピーを作成し、それを開始状態の親ビューに追加して、親ビューでコピーフレームを更新し続けたいとします。私はこれをスクロールビューからドラッグすることによる問題を排除するためにしたいと思います。私はしかし、HandleChangeStateメソッドで正しいロジックを取得するように見えることはできません。コピーは正しくドラッグされません。UILongPressGestureRecognizerを使用したUIImageViewのドラッグ&ドロップの実装

アイデア?

私はより一般的なUILabelとUIImageView用のUILongPressGestureRecognizerを作成しようとしているため、コードの一部が表示されていますが、この問題はありません。

public class LearningViewLongPressGestureRecognizer : UILongPressGestureRecognizer 
    { 
     private UIImageView draggedImageView; 
     private UILabel draggedLabel; 
     private RectangleF originalFrame;  
     private UIView parentView; 
     private DRAG_CONTENT_TYPE contentType; 

     public enum DRAG_CONTENT_TYPE 
     { 
      UIIMAGEVIEW, 
      UILabel 
     } 

     public static Selector LongPressSelector 
     { 
      get 
      { 
       return new Selector ("HandleLongPress"); 
      } 
     } 

     public LearningViewLongPressGestureRecognizer (UIView parent, DRAG_CONTENT_TYPE contentType) 
     { 
      this.contentType = contentType; 
      this.AddTarget(this, LongPressSelector); 
      this.Delegate = new LongPressRecognizerDelegate(); 
      this.parentView = parent; 
     } 

     [Export("HandleLongPress")] 
     public void HandleLongPress(UILongPressGestureRecognizer recognizer) 
     { 
      Console.WriteLine ("HandleLongPress Called."); 
      switch (recognizer.State) 
      { 
      case UIGestureRecognizerState.Began: 
       Console.WriteLine ("HandleLongPress Began."); 
       HandleBeginState(recognizer); 
       break; 
      case UIGestureRecognizerState.Changed: 
       Console.WriteLine ("HandleLongPress Changed."); 
       HandleChangedState(recognizer); 
       break; 
      case UIGestureRecognizerState.Cancelled: 
       Console.WriteLine ("HandleLongPress Canceled."); 
       break; 
      case UIGestureRecognizerState.Ended: 
       Console.WriteLine ("HandleLongPress Ended."); 
       break; 
      default: 
       Console.WriteLine ("HandleLongPress Default."); 
       break; 
      } 
     } 

     private void HandleBeginState(UILongPressGestureRecognizer recognizer) 
     { 
      this.originalFrame = this.View.Frame;      

      if (contentType == DRAG_CONTENT_TYPE.UIIMAGEVIEW) 
      { 
       draggedImageView = new UIImageView(); 
       draggedImageView.Image = ((UIImageView)this.View).Image;  
       draggedImageView.Frame = this.View.Frame; 

       //Change the view scale to indicate to the user that the view is selected and ready for dragging. 
       draggedImageView.Transform *= CGAffineTransform.MakeScale(1.1f, 1.1f); 

       parentView.AddSubview(draggedImageView); 
       parentView.BringSubviewToFront(draggedImageView);     
      }        
     } 

     private void HandleChangedState(UILongPressGestureRecognizer recognizer) 
     {   
      PointF currentLocationOfTouchInParentView = recognizer.LocationInView(draggedImageView);//recognizer.TranslationInView(this.View); 
      PointF deltaFromOriginal = new PointF(currentLocationOfTouchInParentView.X - originalFrame.X, currentLocationOfTouchInParentView.Y - originalFrame.Y); 

      RectangleF newFrame = draggedImageView.Frame; 
      newFrame.Offset(deltaFromOriginal.X, deltaFromOriginal.Y); 
      draggedImageView.Frame = newFrame; 
     } 

     private void HandleCanceledState(UILongPressGestureRecognizer recognizer) 
     { 

     } 

     private void HandleEndedState(UILongPressGestureRecognizer recognizer) 
     { 

     } 

     protected class LongPressRecognizerDelegate : UIGestureRecognizerDelegate 
     { 
      public override bool ShouldReceiveTouch (UIGestureRecognizer recognizer, UITouch touch) 
      { 
       return true; 
      } 
     } 
    } 

答えて

0

解決済みの問題です。ジェスチャを開始した元のタッチ位置のデルタと親ビュー内の現在のタッチ位置を取得し、そのオフセットをドラッグしたビューフレームに追加する必要がありました。以下は私の解決策です。

private void HandleBeginState(UILongPressGestureRecognizer recognizer) 
     { 
      this.originalFrame = this.View.Frame;      
      this.originalTouchLocation = recognizer.LocationInView(parentView); 

      if (contentType == DRAG_CONTENT_TYPE.UIIMAGEVIEW) 
      { 
       draggedImageView = new UIImageView(); 
       draggedImageView.Image = ((UIImageView)this.View).Image;  
       draggedImageView.Frame = new RectangleF(originalFrame.X, originalFrame.Y, originalFrame.Size.Width, originalFrame.Size.Height); 

       parentView.AddSubview(draggedImageView); 
       parentView.BringSubviewToFront(draggedImageView); 

       //Change the view scale to indicate to the user that the view is selected and ready for dragging. 
       draggedImageView.Transform *= CGAffineTransform.MakeScale(1.1f, 1.1f); 
      }        
     } 

     private void HandleChangedState(UILongPressGestureRecognizer recognizer) 
     {   
      PointF currentLocationOfTouchInParentView = recognizer.LocationInView(parentView); 
      PointF deltaFromOriginalTouch = new PointF(currentLocationOfTouchInParentView.X - originalTouchLocation.X, currentLocationOfTouchInParentView.Y - originalTouchLocation.Y); 

      RectangleF newFrame = originalFrame; 
      newFrame.Offset(deltaFromOriginalTouch.X, deltaFromOriginalTouch.Y); 
      draggedImageView.Frame = newFrame;   
     } 
+0

どのSDKを使用していますか? – Oliver

関連する問題