質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

1回答

1725閲覧

iOSのピンチインアウトとパン操作が同時にできない

yrema

総合スコア286

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2019/05/23 02:42

ピンチイン・アウトしている最中に指を離さずパン操作もしたいのですが、
現状だとピンチイン・アウトをすると一度指を離さないとパン操作になりません(逆も然り)。
これを指を離さずできるようにしたいのですが、何が悪いのでしょうか?

c#

1 // ピンチジェスチャー追加 2 UIPinchGestureRecognizer pinchGesture = new UIPinchGestureRecognizer(Pinch); 3 pinchGesture.Delegate = new GestureDelegate((PaintViewController)viewController, m_BaseImageView); 4 paintCanvasView.AddGestureRecognizer(pinchGesture); 5 6 // パンジェスチャー追加 7 UIPanGestureRecognizer panGesture = new UIPanGestureRecognizer(Pan); 8 panGesture.MinimumNumberOfTouches = 2; // 2本指のみ 9 panGesture.Delegate = new GestureDelegate((PaintViewController)viewController, m_BaseImageView); 10 paintCanvasView.AddGestureRecognizer(panGesture);

c#

1 2 internal void Pan(UIPanGestureRecognizer gestureRecognizer) 3 { 4 // フリーハンドキャンセル 5 m_PaintCanvasView.PaintFreeHandView.CancelTouch(); 6 7 // 画像の移動 8 TranslateImage(gestureRecognizer); 9 } 10 11 /// <summary> 12 /// 背景画像の移動 13 /// </summary> 14 /// <param name="gestureRecognizer"></param> 15 internal void TranslateImage(UIPanGestureRecognizer gestureRecognizer) 16 { 17 Debug.WriteLine("TranslateImage1"); 18 19 AdjustAnchorPointForGestureRecognizer(gestureRecognizer); 20 var image = gestureRecognizer.View; 21 if (gestureRecognizer.State == UIGestureRecognizerState.Began || gestureRecognizer.State == UIGestureRecognizerState.Changed) 22 { 23 var translation = gestureRecognizer.TranslationInView(this.m_PaintCanvasView); 24 image.Center = new CGPoint(image.Center.X + translation.X, image.Center.Y + translation.Y); 25 // Reset the gesture recognizer's translation to {0, 0} - the next callback will get a delta from the current position. 26 gestureRecognizer.SetTranslation(CGPoint.Empty, image); 27 } 28 } 29 30 31 internal void Pinch(UIPinchGestureRecognizer gestureRecognizer) 32 { 33 // フリーハンドキャンセル 34 m_PaintCanvasView.PaintFreeHandView.CancelTouch(); 35 36 // 画像の拡縮 37 ScaleImage(gestureRecognizer); 38 } 39 40 /// <summary> 41 /// 背景画像の拡縮 42 /// </summary> 43 /// <param name="gestureRecognizer"></param> 44 internal void ScaleImage(UIPinchGestureRecognizer gestureRecognizer) 45 { 46 Debug.WriteLine("ScaleImage1"); 47 AdjustAnchorPointForGestureRecognizer(gestureRecognizer); 48 if (gestureRecognizer.State == UIGestureRecognizerState.Began || gestureRecognizer.State == UIGestureRecognizerState.Changed) 49 { 50 Debug.WriteLine("ScaleImage2"); 51 gestureRecognizer.View.Transform *= CGAffineTransform.MakeScale(gestureRecognizer.Scale, gestureRecognizer.Scale); 52 // Reset the gesture recognizer's scale - the next callback will get a delta from the current scale. 53 gestureRecognizer.Scale = 1; 54 } 55 } 56 // Scale and rotation transforms are applied relative to the layer's anchor point. 57 // This method moves a UIGestureRecognizer's view anchor point between the user's fingers 58 static void AdjustAnchorPointForGestureRecognizer(UIGestureRecognizer gestureRecognizer) 59 { 60 Debug.WriteLine("AdjustAnchorPointForGestureRecognizer1"); 61 if (gestureRecognizer.State == UIGestureRecognizerState.Began) 62 { 63 Debug.WriteLine("AdjustAnchorPointForGestureRecognizer2"); 64 var image = gestureRecognizer.View; 65 var locationInView = gestureRecognizer.LocationInView(image); 66 var locationInSuperview = gestureRecognizer.LocationInView(image.Superview); 67 68 image.Layer.AnchorPoint = new CGPoint(locationInView.X / image.Bounds.Size.Width, locationInView.Y / image.Bounds.Size.Height); 69 image.Center = locationInSuperview; 70 } 71 } 72 class GestureDelegate : UIGestureRecognizerDelegate 73 { 74 PaintViewController controller; 75 UIImageView uiImageView; 76 77 public GestureDelegate(PaintViewController controller, UIImageView uiImageView) 78 { 79 Debug.WriteLine("GestureDelegate"); 80 this.controller = controller; 81 this.uiImageView = uiImageView; 82 } 83 84 public override bool ShouldReceiveTouch(UIGestureRecognizer aRecogniser, UITouch aTouch) 85 { 86 Debug.WriteLine("ShouldReceiveTouch"); 87 88 //nint numberOfTouches = aRecogniser.NumberOfTouches; 89 //Debug.WriteLine("numberOfTouches " + numberOfTouches.ToString()); 90 91 return true; 92 } 93 94 // Ensure that the pinch, pan and rotate gestures are all recognized simultaneously 95 public override bool ShouldRecognizeSimultaneously(UIGestureRecognizer gestureRecognizer, UIGestureRecognizer otherGestureRecognizer) 96 { 97 Debug.WriteLine("Test1"); 98 // if the gesture recognizers's view isn't one of our images don't recognize 99 if (gestureRecognizer.View != uiImageView) 100 return false; 101 102 Debug.WriteLine("Test2"); 103 // if the gesture recognizers views differ, don't recognize 104 if (gestureRecognizer.View != otherGestureRecognizer.View) 105 return false; 106 107 Debug.WriteLine("Test3"); 108 // if either of the gesture recognizers is a long press, don't recognize 109 if (gestureRecognizer is UILongPressGestureRecognizer || otherGestureRecognizer is UILongPressGestureRecognizer) 110 return false; 111 112 Debug.WriteLine("Test4"); 113 return true; 114 } 115 }

◆環境
Visual Studio 2017
Xamarin 4.12
Xamarin.iOS 12.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

投稿2021/03/05 16:37

errolizer

総合スコア441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問