我有一段代码,如果文本框被键盘覆盖,我会向上滚动视图。我使用的方法样式如Xamarin开发人员指南中的"UIKeyboard.Notifications.ObserveWillShow"示例所示,其中回调方法为"KeyboardWillShow"。这是我的实现。
public void KeyboardWillShow(UIKeyboardEventArgs KeyboardArgs, UIView uiResponderView)
{
if (ScrollView != null)
{
if (uiResponderView != null)
{
UIEdgeInsets contentInsets = new UIEdgeInsets(0.0f, 0.0f, KeyboardArgs.FrameBegin.Height, 0.0f);
ScrollView.ContentInset = contentInsets;
ScrollView.ScrollIndicatorInsets = contentInsets;
CGRect tableViewRect = ScrollView.Frame;
tableViewRect.Height -= KeyboardArgs.FrameBegin.Height;
if (!tableViewRect.Contains(uiResponderView.Frame.Location))
{
ScrollView.ScrollRectToVisible(uiResponderView.Frame, true);
}
}
}
}
我还在听Xamarin开发人员指南中的"UIKeyboard.Notifications.ObserveWillHide"示例中的键盘何时隐藏,其中回调方法为"KeyboardWillHide"。这是我的实现。
public void KeyBoardWillHide(object sender, UIKeyboardEventArgs args)
{
ScrollView.ContentInset = UIEdgeInsets.Zero;
ScrollView.ScrollIndicatorInsets = UIEdgeInsets.Zero;
}
所有这些第一次都能正常工作,但每次"KeyboardArgs.FrameBegin.Height"都返回0。有人能告诉我我缺了什么吗?
编辑:我还应该注意到,在"ViewWillDisappear"中,我处理掉了观察者。
解决方案:根据Kevin的笔记,我将"KeyboardWillShow"事件更改为使用"Keyboard Args.FrameEnd.Height",而不是"Keyboards Args.FrameBegin.Heith",并且该过程正常运行。事件现在看起来像:
public void KeyboardWillShow(UIKeyboardEventArgs KeyboardArgs, UIView uiResponderView)
{
if (ScrollView != null)
{
if (uiResponderView != null)
{
UIEdgeInsets contentInsets = new UIEdgeInsets(0.0f, 0.0f, KeyboardArgs.FrameEnd.Height, 0.0f);
ScrollView.ContentInset = contentInsets;
ScrollView.ScrollIndicatorInsets = contentInsets;
CGRect tableViewRect = ScrollView.Frame;
tableViewRect.Height -= KeyboardArgs.FrameEnd.Height;
if (!tableViewRect.Contains(uiResponderView.Frame.Location))
{
ScrollView.ScrollRectToVisible(uiResponderView.Frame, true);
}
}
}
}
解决方案:
使用FrameEnd.Height
而不是FrameBegin.Height
。
参考文献:
UIKeyboardFrameBeginUserInfoKey
NSValue对象的键,该对象包含一个CGRect,该CGRect在屏幕坐标中标识键盘的起始框矩形。框架矩形反映设备的当前方向。
UIKeyboardFrameEndUserInfoKey
NSValue对象的键,该对象包含一个CGRect,该CGRect在屏幕坐标中标识键盘的结束框矩形。框架矩形反映设备的当前方向。
苹果的文档:https://developer.apple.com/documentation/uikit/uikeyboardframebeginuserinfokeyhttps://developer.apple.com/documentation/uikit/uikeyboardframeenduserinfokey
其他相关案例:iOS 11-键盘高度在键盘通知中返回0