显示键盘时,表格页脚视图中的 UIButton 不响应触摸

Posted

技术标签:

【中文标题】显示键盘时,表格页脚视图中的 UIButton 不响应触摸【英文标题】:UIButton in table footer view not responding to touches when keyboard shown 【发布时间】:2012-04-03 19:21:20 【问题描述】:

我正在开发一个带有购物车的 iPhone 应用程序,并且我正在使用 UITableView 来显示购物车。每个项目都有一个单元格,-tableFooterView 设置为自定义视图,该视图为用户提供了一个文本字段来验证其信用卡的 CVV 和一个完成结帐过程的按钮。

当用户点击 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: 并记录了发生了触摸。

在显示键盘之前,触摸视图中的任何位置都会获得一条日志语句。但是,tableview 调整大小后,只有触摸视图的上部才会生成日志语句。

另外我刚刚意识到,一旦我滚动该部分可见,被键盘覆盖的 tableFooterView 部分就会变成包含视图的背景颜色的颜色。

【问题讨论】:

你找到解决办法了吗? @rishi 你找到解决方法了吗? :) @vburojevic 是的,但解决方案有点奇怪:),我将其作为答案发布 【参考方案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];
        ];
    );

诀窍是将tableView的高度设置为0,并在下一个运行周期中恢复原状。

这适用于 iOS 4.3 和 5.1。

【讨论】:

【参考方案2】:

我认为调整UITableView 的大小会使其将UIButton(子视图)发送到视图层次结构的后面。调整框架大小后,您可能需要将其显式置于前面。

[self.theTableView bringSubviewToFront:yourUIButton];

【讨论】:

【参考方案3】:

以下对我有用。

有一个带按钮的表格视图页脚,因为该按钮操作是通过 xib 链接的,除了添加了以下代码之外 -

@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

所以我必须在按钮上添加一个点击手势。

【讨论】:

以上是关于显示键盘时,表格页脚视图中的 UIButton 不响应触摸的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 页脚或页眉中添加 UIButton

出现键盘时,UITableView 的部分页脚正在移动

添加为页脚视图时,UIButton 没有响应

在表格页脚视图中放置一个按钮

在不重新加载整个表格视图的情况下更改 UITableView 的部分页眉/页脚标题

UITableview Section View 上的 UIbutton 没有动画