如何获得 iOS 8.3 表情符号键盘高度?

Posted

技术标签:

【中文标题】如何获得 iOS 8.3 表情符号键盘高度?【英文标题】:How to get iOS 8.3 emoji keyboard height? 【发布时间】:2015-04-28 17:32:15 【问题描述】:

我可以处理两个事件:键盘显示时和键盘隐藏时。 在 ios 8.2 及更早版本中一切正常。

但是当您更改键盘语言时如何处理事件?当您将英文键盘更改为 emoji 键盘时,emoji 键盘的高度(在 ios 8.3 中)更大并且隐藏了内容。

或者你有一个解决方案如何控制 iOS 8.3 表情符号键盘高度?

【问题讨论】:

查看UIKeyboardWillChangeFrameNotification/UIKeyboardDidChangeFrameNotification。每次键盘框架改变时都会触发这些,无论键盘是否隐藏。例如,更改键盘类型(ascii/emoji)或切换键盘上方的预测文本栏。 好的。让我更新我的 Xcode 和模拟器,我会给你一个优化的工作解决方案。给我一个小时左右。 【参考方案1】:

好的。所以看着我的旧代码,我记得,我使用 2 个观察者 (UIKeyboardDidShowNotification/UIKeyboardDidHideNotification)。我使用单个观察者 (UIKeyboardWillChangeFrameNotification),它会触发每个事件:键盘隐藏、键盘显示、键盘更改框架。

在我的例子中,文本框和发送按钮嵌套在UIView 中,这是在UIViewControllerview 中添加的视图,高于一切。

我在viewDidAppear 中添加观察者并在viewWillDisappear 中删除观察者。(以避免在视图不活动时触发任何通知)。

以上信息对于您的情况不是必需的,只是为了提供信息而添加。相关代码如下:

添加观察者:

- (void) viewDidAppear:(BOOL)animated 

    [super viewDidAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];

处理通知:

- (void) keyboardWillChangeFrame:(NSNotification*)notification 

    NSDictionary* notificationInfo = [notification userInfo];

    CGRect keyboardFrame = [[notificationInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

    [UIView animateWithDuration:[[notificationInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]
                          delay:0
                        options:[[notificationInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]
                     animations:^

                         CGRect frame = self.textViewContainer.frame;
                         frame.origin.y = keyboardFrame.origin.y - frame.size.height;
                         self.textViewContainer.frame = frame;

                      completion:nil];

您可能需要对frame.origin.y... 行进行一些调整才能正确计算。我不知道您是否有UITabBarController 或底部的任何条。这里最安全的选择是:

frame.origin.y = self.view.frame.size.height - keyboardFrame.size.height - X;

如果您的 VC 覆盖整个屏幕,则 X 为 0。如果不是,请使用任何底栏的高度。

【讨论】:

在这种情况下,布局约束需要更新。 虽然 remus 也提供了一个正确的答案,但这个答案是正确的并且更容易实现/更少的代码。完美运行。 是的,但是之后它如何关闭键盘。我启用了点击手势来关闭它,它仍然停留在键盘原来的位置上方....你能帮帮我吗?【参考方案2】:

我遇到了同样的问题。只需将 UIKeyboardFrameBeginUserInfoKey 替换为 UIKeyboardFrameEndUserInfoKey 。 :-)

它对我有用。

【讨论】:

【参考方案3】:

值得注意的是,表情符号键盘与启用建议文本的标准键盘高度相同。

要正确确定键盘高度并调整您的视图,请添加以下观察者:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];

然后我使用以下方法对键盘调整进行动画处理。实际上,您只需要 keyboardBounds 对象,但如果您碰巧使用了 AutoLayout,您可以这样做:

- (void)keyboardDidShow:(NSNotification *)notification

    [self scrollControlBarTo:notification up:YES];


-(void)keyboardDidHide:(NSNotification *)notification

    [self scrollControlBarTo:notification up:NO];


- (void)scrollControlBarTo:(NSNotification *)notification up:(BOOL)up

    [_keyboardControlsBar layoutIfNeeded];
    CGRect keyboardBounds;
    NSDictionary *info = [notification userInfo];
    NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    double duration = [number doubleValue];
    [[info objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardBounds];
    UIViewAnimationCurve curve = [[info objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];

    [UIView animateWithDuration:duration
                          delay:0
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^
                         [UIView setAnimationCurve:curve];
                         _keyboardControlsBarBottomConstraint.constant = (up) ? keyboardBounds.size.height : 0;
                         [self.view layoutIfNeeded];
                      completion:nil];

【讨论】:

是否也可以确定键盘动画时间??那将是完美的! ***.com/questions/1419221/… - 更新了我的答案以包含相关位。 请参阅***.com/questions/18957476/ios-7-keyboard-animation,了解有关 iOS 7 未记录的键盘动画动画曲线的讨论。 不错的@jszumski - 更新了答案,似乎是最简单的实现。【参考方案4】:

上面的代码,但在 swift 中:

func viewDidAppear(_ animated: Bool) 

    super.viewDidAppear(animated)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChangeFrame(_:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)

...

func keyboardWillChangeFrame(_ notification: Notification?) 

let notificationInfo = notification?.userInfo

let keyboardFrame = notificationInfo?[UIResponder.keyboardFrameEndUserInfoKey]?.cgRectValue

UIView.animate(withDuration: TimeInterval((notificationInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.floatValue ?? 0.0), delay: 0, options: UIView.AnimationOptions(rawValue: (notificationInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber)?.intValue ?? 0), animations: 

    let frame = self.textViewContainer.frame


     frame.origin.y = (keyboardFrame?.origin.y ?? 0.0) - frame.size.height
        self.textViewContainer.frame = frame

    )

【讨论】:

以上是关于如何获得 iOS 8.3 表情符号键盘高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 iOS 8 表情符号键盘?

iOS崩溃:在键盘上敲击地球仪以转到表情符号键盘会导致崩溃

iOS 键盘扩展:像粘贴一样的拟我表情

如何在其他设备上显示我的键盘扩展的表情符号

显示软键盘而不改变视图位置

如何使用 swiftui 创建表情符号键盘?