2012-04-03 6 views
1

私はショッピングカートを持つiPhoneアプリを開発していますが、カートを表示するのにUITableViewを使用しています。各項目にはセルがあり、-tableFooterViewにはカスタムビューが設定されています。このビューでは、クレジットカードのCVVを確認するためのテキストフィールドと、チェックアウトプロセスを完了するボタンが表示されます。テーブルフッタービューのUIButtonが、キーボードが表示されているときのタッチに応答しません

ユーザーがCVVテキストフィールドをタップすると、キーボードが何もカバーしないようにテーブルビューのサイズを変更します。

- (void)keyboardWillShow:(NSNotification *)n 
{ 
    // I'll update this to animate and scroll the view once everything works 
    self.theTableView.frameHeight = self.view.frameHeight - KEYBOARD_HEIGHT_PORTRAIT_IPHONE; 
} 

そのCVVを入力した後、ユーザーはキーボードを閉じDoneボタンをタップすることができます。

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    return NO; 
} 

そのすべての作品は、しかし、キーボードが表示されている間、私のチェックアウトボタン(ノーマルUIButton)はタッチイベントに応答しません。テーブルはスクロールしますが、ボタンのtouchUpInsideイベントは発生しません。

[完了]をタップしてキーボードを閉じると、チェックアウトボタンがtouchUpInsideイベントを認識します。

私が見たことから、キーボードが覆っていたボタンは、キーボードが外されるまで、キーボードの後ろからスクロールしても反応しないようです。この同じ-tableFooterView内の、キーボードによって覆われていないボタンは、キーボードが見えている間は、タッチに反応したままである。

のiOS 5とiOS 4に

を実行すると、誰もが起こっていることができるものの任意の提案を提供できるのと同じ行動?トラブルシューティングに役立つアイデアはありますか?

ありがとうございます!

編集 - 実際に

を更新し、キーボードで覆われているtableFooterViewの部分は、タッチイベントに応答していません。私のカスタムUIViewサブクラスでは、-touchesBegan:withEvent:を実装し、タッチが発生したことだけを記録します。

キーボードが表示される前に、ビューのどこに触れてもログステートメントが得られます。ただし、テーブルビューのサイズを変更すると、ビューの上部に触れるだけでログステートメントが生成されます。

また、キーボードで覆われていたtableFooterViewの部分が、表示されるようにその部分をスクロールすると、そのビューの背景色の色に変わります。

+0

これにはいくつか修正がありますか? – rishi

+0

@rishi修正を見つけましたか? :) – vburojevic

+0

@vburojevicはい、解決策は少し奇妙でした:)私は答えとして投稿します – rishi

答えて

0

UITableViewのサイズを変更すると、UIButton(サブビュー)がビュー階層の後ろに送信されると思います。フレームのサイズを変更した後、明示的に前面に表示する必要があるかもしれません。

[self.theTableView bringSubviewToFront:yourUIButton]; 
1

私は同じ問題がありました。私はそれがiOSのバグだと思うが、私はそれのための回避策を発見した:


- (void)keyboardWillShow:(NSNotification *)note { 
    NSDictionary* userInfo = [note userInfo]; 

    // get the size of the keyboard 
    NSValue *boundsValue = [userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey]; 
    CGSize keyboardSize = [boundsValue CGRectValue].size; // screen size 
    CGFloat keyboardHeight; 
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || 
     self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     keyboardHeight = keyboardSize.height; 
    } else { 
     keyboardHeight = keyboardSize.width; 
    } 

    // resize the view with the keyboard 
    __block CGRect origFrame = self.view.frame; 
    __block CGRect viewFrame = origFrame; 
    viewFrame.size.height -= keyboardHeight - ((self.tabBarController != nil) ? self.tabBarController.tabBar.frame.size.height : 0); 
    // Set the height to zero solves the footer view touch events disabled bug 
    self.view.frame = CGRectMake(origFrame.origin.x, origFrame.origin.y, 
           viewFrame.size.width, 0); 
    // We immediately set the height back in the next cycle, before the animation starts 
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
     self.view.frame = origFrame; // The original height 
     // start the animation 
     [UIView animateWithDuration:0.4 animations:^{ 
      [self.view setFrame:viewFrame]; 
     }]; 
    }); 
} 

トリックは、次の実行サイクルで元に0にのtableViewの高さを設定することです。

これはiOS 4.3と5.1のどちらでも動作します。

0

私のために働いた。だから私はボタンをタップジェスチャーを追加する必要が

@IBOutlet private weak var myButton: CustomUIButton! 

override public func awakeFromNib() { 
    super.awakeFromNib() 

    let myButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(myButtonAction(_:))) 
    myButton.addGestureRecognizer(myButtonTapGesture) 
} 

@IBAction func myButtonAction(_ sender: AnyObject) { 
    // button action implementation 
} 

- そのボタンのアクションはXIBを介して連結されているため

は、ボタンでテーブルビューのフッターを持っていた、それとは別に、より次のコードを追加。

関連する問題