返回

当微信公众号遇上iOS12.1:键盘唤起收起后,该位置区域事件点击失效

前端


iOS 12.1 的更新给广大果粉们带来了一系列新功能和优化,然而,它也带来了一个让人头疼的问题:在微信公众号中,当弹出键盘后,再次收起时,原虚拟键盘位置区域的事件点击失效。这个 bug 给用户带来了极大的不便,也让开发者们伤透了脑筋。

问题

当用户在微信公众号中输入文字时,会弹出虚拟键盘。当用户输入完毕,点击发送按钮或其他区域时,虚拟键盘会收起。但是,此时如果用户再次点击原虚拟键盘位置区域,该区域的事件会失效,也就是不会触发任何点击事件。

问题分析

为了分析这个问题,我们首先需要了解 iOS 中的键盘事件处理机制。在 iOS 中,键盘的弹出和收起会触发两个不同的事件:

  • 键盘弹出事件: 当键盘弹出时,系统会触发一个 UIKeyboardWillShowNotification 通知。
  • 键盘收起事件: 当键盘收起时,系统会触发一个 UIKeyboardWillHideNotification 通知。

当键盘弹出时,系统会自动调整应用程序的布局,以腾出空间给键盘。当键盘收起时,系统会恢复应用程序的布局。

在 iOS 12.1 中,微信公众号中出现了这样一个问题:当键盘弹出后,再次收起时,原虚拟键盘位置区域的事件失效。究其原因,是因为在 iOS 12.1 中,当键盘收起时,系统没有正确地恢复应用程序的布局。导致了原虚拟键盘位置区域的事件失效。

解决方案

这个问题的解决方案是,在键盘收起时,手动恢复应用程序的布局。这可以通过以下步骤实现:

  1. UIKeyboardWillHideNotification 通知中,获取键盘的高度。
  2. 使用 UIViewframe 属性来调整应用程序的布局,使之腾出空间给键盘。
  3. 在键盘收起后,使用 UIViewframe 属性来恢复应用程序的布局。

以下代码示例演示了如何实现此解决方案:

// 在 UIKeyboardWillHideNotification 通知中获取键盘的高度
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

- (void)keyboardWillHide:(NSNotification *)notification {
    // 获取键盘的高度
    CGRect keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGFloat keyboardHeight = keyboardFrame.size.height;

    // 使用 UIView 的 frame 属性来调整应用程序的布局
    UIView *rootView = self.view;
    rootView.frame = CGRectMake(0, 0, rootView.frame.size.width, rootView.frame.size.height + keyboardHeight);

    // 在键盘收起后,使用 UIView 的 frame 属性来恢复应用程序的布局
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        rootView.frame = CGRectMake(0, 0, rootView.frame.size.width, rootView.frame.size.height - keyboardHeight);
    });
}

通过以上步骤,就可以解决 iOS 12.1 微信公众号中键盘事件失效的问题。

结语

本文深入剖析了 iOS 12.1 微信公众号中弹出键盘后,再次收起时,原虚拟键盘位置区域的事件点击失效问题,并提供了详细的解决方案。希望本文能够帮助遇到此类问题的开发者们快速解决问题。