独自のビュー境界の外で、タッチ ドラッグ/ポジショニングに大きく依存するカスタム クラスを作成しました。さまざまな関連メソッドで定義された関連プロトコルがあります。このプロトコルを使用するものの例は、カスタム クラスからオブジェクトをドロップできるようにするビューです。
私が抱えている問題は、その位置の下に気にするオブジェクトがあるかどうかに関係なく、タッチがいつ終了するか (オブジェクトが「ドロップ」される) を把握することです。(「ケア」については、「プロトコルに準拠」を読んでください!)。
- (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
、何も適合しない場合に返します。
再度、感謝します..