2012-04-10 4 views
2

すべてのタッチイベントをUIKeyboardでキャプチャしようとしています。トップにUIWindowを追加 UIView/UIWindow内の特定のタッチイベントを次のレスポンダに渡します(sendEvent:/ hitTest:は機能しません)

  • UIGestureRecognizer
  • とただし、次のレスポンダ
  • 、働いていたこれらのどれにイベントを渡す:

    • HitTestを:私が試してみました。

      UIKeyboardをサブクラス化することはできないようです。

      どのような方法で効果がありますか?

      おかげで、

      ピーク

      アップデート:私は(ちょうど設定のような次のレスポンダに特有のタッチイベントを渡すのUIViewまたはUIWindowを追加することができます方法:

      は、問題を単純化することができますuserInteractionEnabled NOへの)?

      HERESに私のコード(もちろん動作しません...):

      - (void)sendEvent:(UIEvent *)event { 
          NSLog(@"%@",event); 
          //if ([self eventIsNoteworthy:event]) [self extraEventHandling:event]; 
          [super sendEvent:event]; // Apple says you must always call this! 
      } 
      
      -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
          CGPoint hitPoint = [underneathButton convertPoint:point fromView:self]; 
          if ([underneathButton pointInside:hitPoint withEvent:event]) return underneathButton; 
          NSLog(@"Called"); 
          return [super hitTest:point withEvent:event]; 
          //return mainWindow; 
      } 
      
      -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
          NSLog(@"Start"); 
      
          [self.nextResponder touchesBegan:touches withEvent:event]; 
      
      } 
      
    +0

    タッチイベントを言うとき、特定のキーが押されたシーケンスを意味しますか? – blake305

    +0

    @ blake305いいえ、私はタッチされた位置のCGPointsを意味します。 – PeakJi

    +0

    自分のキーボードを作成して提示し、textFieldに押された文字を渡し、CGPointをNSLogに渡したいと思っていますか? – AMayes

    答えて

    0

    私はそれが可能だかいないかはわかりません。いくつかのことが思い浮かぶ。 1つは自分でUIKeyboardを作り直してそのように触れることです。 Apple Docsが可能です。

    もう1つは、キーボードのUIWindowオーバートップをどのように追加したかを見直すことです。私の理解では、キーボードビューは何らかの形でアプリケーションの上に異なってレイヤーされているので、キーボードのUIWindowオーバートップを持っていないかもしれません。(ref)そのリンクは、キーボードの実際のUIViewへの参照を取得するためのソリューションを提供します。そこから、UIWindowをキーボードビューの親に配置したいと考えています。支援するため

    は、ここであなたは、彼らが階層化されているかを確認するために、すべてのビューをダンプするために使用できるスクリプトです:

    static void dumpViews(UIView* view, NSString *text, NSString *indent) 
    { 
        Class cl = [view class]; 
        NSString *classDescription = [cl description]; 
        while ([cl superclass]) 
        { 
         cl = [cl superclass]; 
         classDescription = [classDescription stringByAppendingFormat:@":%@", [cl description]]; 
        } 
    
        if ([text compare:@""] == NSOrderedSame) 
         NSLog(@"%@ %@", classDescription, NSStringFromCGRect(view.frame)); 
        else 
         NSLog(@"%@ %@ %@", text, classDescription, NSStringFromCGRect(view.frame)); 
    
        for (NSUInteger i = 0; i < [view.subviews count]; i++) 
        { 
         UIView *subView = [view.subviews objectAtIndex:i]; 
         NSString *newIndent = [[NSString alloc] initWithFormat:@" %@", indent]; 
         NSString *msg = [[NSString alloc] initWithFormat:@"%@%d:", newIndent, i]; 
         dumpViews(subView, msg, newIndent); 
         [msg release]; 
         [newIndent release]; 
        } 
    } 
    

    はこのようにそれを呼び出します。dumpViews([[UIApplication sharedApplication] keyWindow], @"", @"");

    希望いくつかを助けること! :D

    +2

    同じことを達成するためにデバッガで使うことができる1つのライナーがあります: '[[[UIApplication sharedApplication] keyWindow] recursiveDescription]' – cbowns

    +0

    @cbowns that's awesome!ありがとう。 –

    +0

    お返事ありがとうございます;-)私はUIWindowがキーボードの上部にあると確信しています。私は質問を更新しました。 – PeakJi

    0

    UIKeyboardを含むプライベートビュー階層へのアクセスについては、this answerをご覧ください。 N.b.これはiOSではサポートされていないため、Appleはこれを行うアプリケーションを拒否します。 (UIKit内のプライベートビュー階層を妨げることはプライベートAPIを使うことと同じです)

    +0

    ありがとう!しかし、この方法はiOS5では使えません;-( – PeakJi

    関連する問題