UICONTROLSを含むビューでタッチダウンとタッチアップを検出します
-
29-10-2019 - |
質問
ユーザーが目に見えるときと上昇したときに検出しようとしています。ビューには、いくつかのボタンやその他のUIKITコントロールが含まれています。これらのタッチイベントを検出したいのですが、消費しません。
私は2つのアプローチを試しましたが、どちらも十分ではありませんでした:
最初に、透明なオーバーレイオーバーライドを追加しました-touchesbegan:withevent:and -touchesedended:withevent:そして、次のレスポンダーにイベントを転送します
[self.nextResponder touchesBegan:touches withEvent:event]
ただし、UIKITオブジェクトはすべての転送されたイベントを無視しているようです。
次に、私はオーバーライド-pointinside:withevent:and -hittest:withevent:。これはタッチを検出するのに非常に役立ちました 下 イベントですが、ポイントインサイド::そしてヒッテスト::はタッチで呼び出されません 上 (つまり、[[[[event alltouches] AnyObject]フェーズ]がuitouchphasededに等しくない)。
基礎となるuicontrolsとの相互作用を邪魔することなく、タッチダウンとタッチアップの両方のイベントを検出する最良の方法は何ですか?
解決
による iOSのイベント処理ガイド3つのオプションがあります:
1)sendeventをオーバーライドするためにuiwindowをサブクラス化:
2)オーバーレイビューの使用
3)それを行う必要がないように設計...だから本当に2つのオプションのようなものです。
Uiwindowサブクラスを使用して、リンゴの例の単純化を次に示します。
1)ペン先の窓のクラスをUiwindowのサブクラスに変更します。 2)この方法を.mファイルに入れます。
- (void)sendEvent:(UIEvent *)event
{
NSSet * allTouches = [event allTouches];
NSMutableSet *began = nil;
NSMutableSet *moved = nil;
NSMutableSet *ended = nil;
NSMutableSet *cancelled = nil;
// sort the touches by phase so we can handle them similarly to normal event dispatch
for(UITouch *touch in allTouches) {
switch ([touch phase]) {
case UITouchPhaseBegan:
if (!began) began = [NSMutableSet set];
[began addObject:touch];
break;
case UITouchPhaseMoved:
if (!moved) moved = [NSMutableSet set];
[moved addObject:touch];
break;
case UITouchPhaseEnded:
if (!ended) ended = [NSMutableSet set];
[ended addObject:touch];
break;
case UITouchPhaseCancelled:
if (!cancelled) cancelled = [NSMutableSet set];
[cancelled addObject:touch];
break;
default:
break;
}
// call our methods to handle the touches
if (began)
{
NSLog(@"the following touches began: %@", began);
};
if (moved)
{
NSLog(@"the following touches were moved: %@", moved);
};
if (ended)
{
NSLog(@"the following touches were ended: %@", ended);
};
if (cancelled)
{
NSLog(@"the following touches were cancelled: %@", cancelled);
};
}
[super sendEvent:event];
}
それはあまりにも多くの出力を持っていますが、あなたはアイデアを得るでしょう...そしてあなたが望む場所にあなたのロジックを適合させることができます。