uiview、タッチがいつビューに入ったかを判断する方法
-
11-10-2019 - |
質問
uiviewのすべてのタッチ方法は、タッチがそのビューの境界内で始まった場合にのみ呼び出されているようです。ビューの外側に触れたが、指をビューにドラッグしたユーザーにビューを応答させる方法はありますか?
それが重要な場合、私の特定のアプリケーションは、mkpinannotationViewをドラッグするためです(組み込み4.0ドラッグを使用)。ユーザーがピンを別のビューにドラッグした場合、何かが起こりたいと思います(たまたまannotationViewでもありますが、何でもかまいません)。ピンを手放すまで、ドラッグする方法は呼び出されません。また、ドラッグされているuiviewは、ビュー内から触れて始めない限り、呼び出されているようです。
監督はmkmapviewであるため、そのtouchmovedイベントを使用して、ユーザーが適切な場所にあるかどうかを確認することは困難です。ありがとう!
解決
だからしばらくの間それを遊んだ後、私は答えが与えられたことを発見しました ここ 質問されている質問は違っていたとしても、実際に私が必要としていたものを私に与えました。
Subclass UigestureRecognizerができることがわかりました。そして、それが追加されたビュー(mkmapviewを含む)にすべてのタッチを処理させます。これにより、すべての通常のmkmapviewインタラクションが問題なく動作することができます。しかし、タッチについても警告します。 Touchmovedでは、タッチの場所を確認します。そして、それが私の他の見解の範囲内にあるかどうかを確認してください。
私が試したすべてから。これは、ユーザーがmkannotationをドラッグしている間にタッチモーメントを傍受する唯一の方法のようです。
他のヒント
確かにできます:
(hitstateview.h)
#import <UIKit/UIKit.h>
@interface HitstateView : UIView {
id overrideObject;
}
@property (nonatomic, retain) id overrideObject;
@end
(hitstateview.m)
#import "HitstateView.h"
@implementation HitstateView
@synthesize overrideObject;
- (void)dealloc {
self.overrideObject = nil;
[super dealloc];
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *hitView = [super hitTest:point withEvent:event];
if (hitView == self) {
return overrideObject;
}
return hitView;
}
@end
このビューをタッチエリアのサイズにします。 Touchesに移動したいビューにOverIdeObjectを設定します。 IIRCは、HitstateViewのサブビューである必要があります。
すべてのビューが継承されます UIResponder
したがって、すべてのビューがタッチベガン/移動/終了します - ビューの外でタッチを開始することは、ビューがビューを越えて動くとビューがイベントを取得しないことを意味するとは思いません。何かがmkmapviewにドラッグされたという通知を取得したい場合は、タッチを処理するがイベントを渡すサブクラスを作成する必要があります。 super
, 、階層がタッチで必要なことは何でもできるようにします。イベントを観察するだけで、イベントをキャプチャまたは変更する必要はありません。
それはあなたのビューの設定方法に依存します。一般的に、レスポンダーチェーンを活用することが最良の方法です。特定のニーズに対処するにはあまりにも具体的であるかもしれませんが、トリックをプレイできます。
また、ヒットテストをオーバーライドすることで、フォワードイベントでトリックをプレイすることもできます。
あなたの特定のケースはかなりエキゾチックに聞こえるので、問題の両方のビューを含めるのに十分な大きさの親ビューを持つ親ビューを持つようなトリックをプレイする必要があるかもしれません。