ループ内で、ユーザーが画面を押しているかどうかを、コードから知ることはできないでしょうか?
UIViewを継承したクラスで、下記のようにプログラムを行い、
TouchesBeganでtouchFlag =trueにしてLoopをよび、
ループ内でNSRunLoop.Current.RunUntilを挟んでTouchesEndedが取得できるようにしています。
しかし、TouchesEndedが発生しない場合があります。
画面をPortraitの状態で行っていると、発生するのですが、
LandscapeだとTouchesEndedのイベントがおきず、ループを延々と回る状態になります。
そこで、ループ内で動的に画面をタップしているかどうか?を
知ろうと思ったのですが、そういうプロパティやメソッドがみつかりませんでした。
もしくはなぜPortraitでTouchesEndedが発生し、Landscapeでは発生しないのか?
がわかればいいのですが、こちらもわかりませんでした。
下記コードのコメントにもかきましたが、
ループ内には他のコードがたくさんあり、いくつかの処理をしています。
その中にはPortraitとLandscapeで処理が違うところもあるのですが、
原因になるようなところがみつかりませんでした。
(ほんとはそこが一番怪しいとは思うのですが…。)
ループ内の処理中に画面を再度タップすると
TouchesBeganのイベントは発生します。
しかしTouchesEndedは発生しません。
C#
1public override void TouchesBegan(NSSet touches, UIEvent evt) 2{ 3 base.TouchesBegan(touches, evt); 4 touchFlag = true; 5 Loop(); 6} 7 8public override void TouchesEnded(NSSet touches, UIEvent evt) 9 { 10 base.TouchesEnded(touches, evt); 11 touchFlag = false; 12 } 13 14 15private void Loop() 16 { 17 while (touchFlag) 18 { 19//実際にはループ内に他のコードがありますが、省略しています。 20 NSRunLoop.Current.RunUntil(NSDate.FromTimeIntervalSinceNow(0.2)); 21 } 22 23 } 24
ループ内でタップが取得できるか、
もしくはTouchesEndedがなぜ発生しないのか?
どちらかがわかればいいのですが、わかりません。
よろしくお願いします。
環境
Windows10
VS2019
C#
Xamarin
追記
詳しく調べたら少し状況が違っていたので、訂正します。
LandscapeだけでなくPortraitでも発生しないです。
画面の向きは関係なかったです。
「問題はタップの位置」のようです
TouchesBeganとTouchesEndedの中に
タップの座標を表示するようにコードを追加してみました
C#
1 CGPoint pos = new CGPoint(); 2 UITouch touch = touches.AnyObject as UITouch; 3 if (touch != null) { 4 pos = touch.LocationInView(this); 5 }
このposのXとYの座標をみると
Y座標がだいたい270以下くらい?になると
TouchesBeganは発生するが、TouchesEndedだけが発生しないようです。
X座標のほうもだいたい300前後以下くらいで発生しなくなります。
ただし、「だいたい300前後以下」であり、
Xが100くらいのときでも、たまにTouchesEndedが発生したりします。
つまり、画面の左上のほうは発生せず、
右下のほうにいくほどTouchesEndedが正しく発生します。
でも、なぜなのかわかりません…。
回答1件
あなたの回答
tips
プレビュー