タッチイベントの動作をみて?と思った事を確認しました。
環境
Xcode 7.2\iPhone5S\ios8.3
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Began");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Ended");
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
//NSLog(@"Move”); //いっぱい発生するからコメントした方がわかりやすい
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Cancel");
}
マルチタッチの有効無効は、
[self.view setMultipleTouchEnabled: en];
en= //YES:有効 NO:無効 で実行した。
太鼓をたたくように、両手の人差し指で、左指でタッチして離すと同時に右指でタッチした時の 押す(touchesBegan:)と離す(touchesEnded:)の順番があれ?と思った件
例) 左指→右指の場合で
シングルタッチ( [self.view setMultipleTouchEnabled:NO] の場合 )
ゆっくり操作すれば、検出が
touchesBegan:(左)
↓
touchesEnded:(左)
↓
touchesBegan:(右)
なのですが、早く操作すると、
touchesBegan:(左)
↓
touchesEnded:(左)
になるのである。(右は無視かよー)
きっと時間で押す/離すを管理していて、検出してないのだろうと推測
話しにならないのでマルチタッチ( [self.view setMultipleTouchEnabled:YES] の場合 )
の登場となった。
ゆっくり操作すれば、検出が
touchesBegan:(左)
↓
touchesEnded:(左)
↓
touchesBegan:(右)
なのですが、早く操作しても、OK(キター)と思いきや
touchesBegan:(左)
↓
touchesBegan:(右)
↓
touchesEnded:(左)
になる場合がある。(私の感覚では、左指を離してから右を押したんですが・・・)
ハードウエアでは、そのように検出されるのかもしれないし、仕様かも?
押すと離すのどちらか一方で処理するのであれば問題ないとおもうのですが、押すと離すに敏感な処理をする場合は注意ですね。
event と touches のタッチデータの中身って同じなのかな?の件
各メソッドにこれを追加して確認した。(hogehogeにイベント名)
NSLog(@"<<hogehoge>>");
//touches = event.allTouches; //event内タッチデータ確認する場合使用
NSArray *tchArray = [touches allObjects];
NSUInteger tchCount = [tchArray count];
UITouch *tchAny = [touches anyObject];
UITouch *tch;
for( int i=0;i<tchCount;i++)
{
tch = [tchArray objectAtIndex:i];
UITouchPhase ph=tch.phase;
NSUInteger tc=tch.tapCount;
NSLog(@"[%ld]Phase:%ld tapCount:%ld",(long)tch,(long)ph,(long)tc );
}
パラメータ event内の allTouches は、今のタッチ状況のデータのようで。同じではなかったです。
発生したイベントは、touchesで、現状を見るなら event.allTouchesなのでしょうね。
###マルチタッチは、何本まで?の件
=> 5本でした。なるほど納得。(!!そーいえばiPADに5本指ジェスチャーがあった)
- では、6本目がきたらどうなるのか?
=> 5本分のマルチタッチキャンセル(touchesCancelled:)がきました。
- では、7本目がきたらどーなるのか?
=> 無反応でした。
いままでキャセルってバックグラウンドに移動する時しか発生しないと思ってましたがこんなところにもキャンセルがいたのですね.
[touches anyObject] って マルチタッチの場合はどのデータ?
パラメータでもらうtouches を[touches anyObject] で処理するのですがマルチタッチの場合の UITouchは、複数のタッチデータ( [touches allObjects] )中の先頭のデータのようです。
event.allTouchesの最初のオブジェクトではないですよ。(注意:sampleでは touchesを上書きしてるので)
Attributの (.phase)の Stationaryってなんだろう?
UITouchPhase ph=tch.phase; <=これで取得できる値
タッチ状態で、説明にあるのですが、イベントにない
0:Began
1:Moved
2:Stationary <----- これ
3:Ended
4:Cancelled
tchAny.phase では、出たり出なかったりするので、tchAnyではよくわからなかったのですが、
(UIEvent *)event内の.allTouchesの tch.phase をモニターしたら理解できました。
( touches = event.allTouches; を実行して確認しました。)
例えば、2つの指でマルチタッチして、1つの指を動かした場合に動かさない方の指の状態がこれになります。(こんど使ってみーよー)
Attributについて (.tapCount)の 数って何?
NSUInteger tc=tch.tapCount; <=これで取得できる値
説明どうり一定時間内に同じ場所をタッチ(押して離す)した回数でtouchesBegan:でカウントアップされてます。
複数でタッチすると、それぞれでカウントされるようですね。(すげー)
通常 touchesEnded:では、touchesBegan:と同じ値が出力されますが、長押しの場合は、0が返ってきました。(なるほど長押しはタップではないから0なんだ。よくできてる パチパチ)
- で・・・値はどこまで
一定間隔でタップしたらどんどんふえるようですね。
100回ぐらいまで確認しました(Centuple tap)が、気を抜くとリセットされるので限界確認できなかったです。NSUIntegerなのでたぶん・・・心が折れるぐらいと思います。
タッチ(押す/離す)をカウントしているしているという事は、離してから一定時間 次の押すまで前回の情報をもっている事になる。どうもこの時間が、シングルタッチでの無応答時間のような気がする。
ところで、シングルタップやダブルタップの時間定義(タイムチャートみたいな押してる時間や離している時間のスペック)ってあるのだろうか?
あとがき
一度確認しておきたかった事柄だったのですが 思っていたよりも発見がありました。
今回は、iphone5sだったんで、3DTouch関連は、またの機会に・・・・
そして、 (.majorRadius) (.majorRadiusTolerance )については、http://qiita.com/yimajo/items/ce6ae6c2159deb69a781
が参考になるかと・・・・