1

独自のビュー境界の外で、タッチ ドラッグ/ポジショニングに大きく依存するカスタム クラスを作成しました。さまざまな関連メソッドで定義された関連プロトコルがあります。このプロトコルを使用するものの例は、カスタム クラスからオブジェクトをドロップできるようにするビューです。

私が抱えている問題は、その位置の下に気にするオブジェクトがあるかどうかに関係なく、タッチがいつ終了するか (オブジェクトが「ドロップ」される) を把握することです。(「ケア」については、「プロトコルに準拠」を読んでください!)。

- (CALayer *)hitTest:(CGPoint)thePointそれが私のプロトコルに準拠するビューである場合、それは簡単です。またはそれらの行に沿って何かを使用してそれを見つけ、 conformsToProtocol:@protocol(xx).

ただし、それが UIViewController のサブビューであるビューである場合 (たとえば)、UIViewController (デリゲートとして) がプロトコルに準拠していても、ビューはプロトコルに準拠していません。ビューが本当に通知を受け取りたい場合は、メッセージを送信するデリゲートが誰であるかを把握できる必要があります。

したがって、本質的に、各ビューが自分のプロトコルに準拠しているかどうかを確認しながら、最下位の UIView からビュー階層をたどるにはどうすればよいでしょうか。そうでない場合は、デリゲートがあり、それは準拠していますか..?

それとも、私が考えもしなかったもっと簡単な方法がありますか?

どうもありがとう..


解決済み

moshyのおかげで、解決策があります。

- (UIView *)viewThatConformsToProtocol:(Protocol *)protocol AtPointInWindow:(CGPoint)point {
   UIView *lowestUIView = [[(AppDelegate).navigationController view] hitTest:point withEvent:nil];
   UIResponder *respondsToProtocol = lowestUIView;
   while ((respondsToProtocol != nil) && (![respondsToProtocol conformsToProtocol:protocol])) {
      respondsToProtocol = [respondsToProtocol nextResponder]; // else try the next responder up the chain
   };
   return (UIView *)respondsToProtocol;
}

これは、ビューを返すかnil、何も適合しない場合に返します。

再度、感謝します..

4

1 に答える 1

0

最下位のビューを取得したら、 を使用してレスポンダー チェーンを上ることができます- (UIResponder *)nextResponder

ドキュメントから:

UIResponder クラスは、次のレスポンダーを自動的に保存または設定せず、代わりにデフォルトで nil を返します。サブクラスは、次のレスポンダーを設定するためにこのメソッドをオーバーライドする必要があります。UIView は、それを管理する UIViewController オブジェクト (存在する場合) またはそのスーパービュー (存在しない場合) を返すことによって、このメソッドを実装します。UIViewController は、そのビューのスーパービューを返すことによってメソッドを実装します。UIWindow はアプリケーション オブジェクトを返し、UIApplication は nil を返します。

于 2010-02-08T08:30:57.237 に答える