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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

iOS

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

Xamarin

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

Q&A

解決済

1回答

671閲覧

Xamarin iOS ループ内で画面が押されているかを知るには

takaw

総合スコア128

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

iOS

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

Xamarin

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

0グッド

0クリップ

投稿2020/05/29 06:59

編集2020/05/29 14:01

ループ内で、ユーザーが画面を押しているかどうかを、コードから知ることはできないでしょうか?

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が正しく発生します。

でも、なぜなのかわかりません…。

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

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

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

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

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

hoshi-takanori

2020/05/29 07:08

そもそもそんなループをしてはいけません。
takaw

2020/05/29 07:31

アドバイスありがとうございます。 解決方法をおねがいします。
hoshi-takanori

2020/05/29 09:02

ループ中で NSRunLoop を呼んでるなら大丈夫なはずですね。失礼しました。Landscape だと必ず発生しますか? Swift で同様のコードを書いて試してみたところ、画面の向きにかかわらず iPhone X の画面下端からドラッグするとアプリ切り替えジェスチャが発動して touchesEnded が発生しないケースがありました。
takaw

2020/05/29 11:48

Landscape だとTouchesEndedが発生しないですね。 Debug.WriteLineでログを吐き出そうとしても出ないし、 TouchesEndedにブレークポイントをいれても止まらないです。 Portraitの場合は止まるんですけど。 いまループ内でのPortraitとLandscape での処理が違う部分を1つづコメントアウトしながらテストしているのですが、なかなか原因がみつからない状態です。
guest

回答1

0

自己解決

自己解決しました
複数のUIViewを使用しており、
PortraitとLandscapeでその位置とサイズが違うのですが、
FrameのCGRect座標計算とUserInteractionEnabledの設定ミスで
TouchesEndedが発生しなかったようです。
ありがとうございました。

投稿2020/05/30 07:52

takaw

総合スコア128

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問