取消停靠时,将UIToolbar移到键盘上方

时间:2015-05-13 05:17:14

标签: ios keyboard uitoolbar

我有一个位于屏幕底部的UIToolbar。当用户点击工具栏中的UITextField时,会出现键盘,我会检测键盘大小并通过更改其自动布局约束常量来移动工具栏。 (它对其超级视图有一个底部间距约束。)这很好用,直到用户在iPad上取消键入(或拆分)键盘。此时工具栏定位不正确。我注意到在消息应用程序中,即使用户取消键盘键盘,工具栏也始终位于键盘上方,当用户重新定位键盘时,它总是完美地位于键盘上方。在做了一些研究之后,it was suggested通过倾听UIKeyboardWillChangeFrameNotification并检查UIKeyboardFrameEndUserInfoKey来处理这个问题。但是,该值可能不存在,因此我不确定在这种情况下该怎么做。

我的问题是,是正确的方法来收听键盘框架更改通知并更新自动布局约束,还是有其他方法可以采取(inputAccessoryView文本字段弹出) ?如果是这样,如何检测和处理各种情况(隐藏,出现,更新框架,解除对接,重新定位)以确保它始终位于键盘上方或底部如果没有键盘(或者没有键盘)正在使用的硬件键盘??

请参阅下文,了解我目前如何处理UIKeyboardWillChangeFrameNotification处理程序中的键盘外观/消失/帧更改(Obj-C +伪代码的混合)。

这个问题是它在取消停靠/拆分时错误地定位工具栏,在取消停靠时重新定位,以及使用硬件键盘。此外,我发现当键盘未对接时,展开/折叠QuickType不会触发UIKeyboardWillChangeFrameNotification(停靠时)。

keyboardFrameWillChange {
    CGSize keyboardBeginSize = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGSize keyboardEndSize = [info[UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    CGFloat newOffset = 0;
    CGFloat toolbarPositionOffset = self.toolbarBottomConstraint.constant;

    //get collection view's contentInset and contentOffset

    //keyboard is appearing or disappearing or device is rotating with keyboard up
    if keyboardEndSize.height == keyboardBeginSize.height {
        if toolbarPositionOffset > 0 { //if dismissing
            newOffset = keyboardEndSize.height;
            toolbarPositionOffset -= newOffset;
            //update content inset and offset
        } else { //else appearing
            newOffset = keyboardEndSize += newOffset;
            toolbarPositionOffset += newOffset;
            //update content inset and offset
        }
    }
    //keyboard height increasing (expanding QuickType)
    else if keyboardEndSize.height > keyboardBeginSize.height {
        newOffset = keyboardEndSize.height - keyboardBeginSize.height;
        toolbarPositionOffset += newOffset;
        //update content inset and offset
    }
    //else keyboard height decreasing (collapsing QuickType)
    else {
        newOffset = keyboardBeginSize.height - keyboardEndSize.height;
        toolbarPositionOffset -= newOffset;
        //update content inset and offset
    }

    self.toolbarBottomConstraint.constant = toolbarPositionOffset;
    //set new contentInset and offset

    [self.toolbar layoutIfNeeded];
}

1 个答案:

答案 0 :(得分:0)

我找到了解决我遇到的问题的解决方案,虽然它没有提供我的目标确切的最终结果。具体来说,不是在取消停靠/拆分时尝试在键盘上方移动工具栏,而是在这种情况下将其固定在底部,并且只有在停靠时才将其放在键盘上方。这解决了我在硬件键盘上遇到的问题。

收听UIKeyboardWillShowNotification并将工具栏的约束常量设置为等于UIKeyboardFrameEndUserInfoKey值。

聆听UIKeyboardWillHideNotification并将工具栏的约束常量设置为等于0

请勿收听UIKeyboardWillChangeFrameNotification或任何其他键盘通知。

通过这样做,这些通知将在键盘出现或隐藏时发送,如您所料。但神奇地(我可能不会很明显地添加),当键盘的框架发生变化(用户展开/折叠QuickType)时,将调用UIKeyboardWillShowNotification。当用户取消键盘键盘时,会触发UIKeyboardWillShowNotification,然后会立即触发UIKeyboardWillHideNotification

这是通过iOS 8.4测试的,我可以想象这可能因操作系统版本而异。