Xamarin.form 键盘出现时向上移动视图

2024-02-19

我正在尝试构建一个聊天应用程序用户界面,布局的想法非常简单:

当输入栏获得焦点时,键盘会显示并“推”聊天栏,因为它是一个网格,ListView 将调整大小以适合屏幕:

我更新输入栏的边距以“推”它:

NSValue result = (NSValue)args.Notification.UserInfo.ObjectForKey(new NSString(UIKeyboard.FrameEndUserInfoKey));
CGSize keyboardSize = result.RectangleFValue.Size;
if (Element != null){
Element.Margin = new Thickness(0, 0, 0,keyboardSize.Height); //push the entry up to keyboard height when keyboard is activated
}

这是结果:https://drive.google.com/file/d/1S9yQ6ks15BRH3hH0j_M8awpDJFRFitUi/view?usp=sharing https://drive.google.com/file/d/1S9yQ6ks15BRH3hH0j_M8awpDJFRFitUi/view?usp=sharing

视图确实向上推了,ListView 也按预期调整了大小,但是有两个问题我不知道如何解决:

  1. 调整大小后如何保留ListView滚动位置?
  2. 缺乏动画来提升视图

我在网上搜索过,尝试过 IQKeyboardManager 和 KeyboardOverLap,上推动画很好很流畅,但是奇怪的事情发生了:

https://drive.google.com/file/d/1Zm0lMKB3wq07ve67wlcvLuNM_6Waad7R/view?usp=sharing https://drive.google.com/file/d/1Zm0lMKB3wq07ve67wlcvLuNM_6Waad7R/view?usp=sharing

  1. 这种方法不是调整ListView的大小,而是将整个ListView向上推,我看不到前几项,当然滚动条可以滚动到屏幕之外
  2. ListView 底部有额外的奇怪空间

任何帮助将不胜感激,谢谢!

解决方案:

  void OnKeyboardShow(object sender, UIKeyboardEventArgs args)
    {
        NSValue result = (NSValue)args.Notification.UserInfo.ObjectForKey(new NSString(UIKeyboard.FrameEndUserInfoKey));
        CGSize keyboardSize = result.RectangleFValue.Size;
        if (Control != null)
        {
            int bottomMargin = 0;
            var sa = UIApplication.SharedApplication.KeyWindow.SafeAreaInsets;
            bottomMargin = (int)sa.Bottom;

            CGPoint offset = Control.ContentOffset;
            var difference = keyboardSize.Height - bottomMargin;

            if (Control.ContentSize.Height > Control.Frame.Height)
            {
                offset.Y += difference;
                Control.SetContentOffset(offset, true);
            }
            else if (Control.ContentSize.Height + keyboardSize.Height > Control.Frame.Height)
            {
                offset.Y += Control.ContentSize.Height + keyboardSize.Height - Control.Frame.Height - bottomMargin;
                Control.SetContentOffset(offset, true);
            }

            Control.ContentInset = new UIEdgeInsets(0, 0, difference, 0);
            Control.ScrollIndicatorInsets = Control.ContentInset;

        }

    }

    void OnKeyboardHide(object sender, UIKeyboardEventArgs args)
    {
        if (Control != null)
        {
            Control.ContentInset = new UIEdgeInsets(0, 0, 0, 0);
            Control.ScrollIndicatorInsets = new UIEdgeInsets(0, 0, 0, 0);
        }

    }

解决方案:

参考下面的代码

在 iOS 自定义渲染器中

protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
{
  base.OnElementChanged(e);

  if(Control!=null)
  {
     Control.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag;

     NSNotificationCenter.DefaultCenter.AddObserver(this, new Selector("KeyBoardWillShow:"), new NSString("UIKeyboardWillShowNotification"), null);

     NSNotificationCenter.DefaultCenter.AddObserver(this, new Selector("KeyBoardWillHide:"), new NSString("UIKeyboardWillHideNotification"), null);

  }

}


[Export("KeyBoardWillShow:")]
void KeyBoardWillShow(NSNotification note)
{
  NSValue keyboardRect = (NSValue)note.UserInfo.ObjectForKey(new NSString(UIKeyboard.FrameEndUserInfoKey));
  Control.ContentInset = new UIEdgeInsets(0,0, keyboardRect.RectangleFValue.Size.Height,0);
}


[Export("KeyBoardWillHide:")]
void KeyBoardWillHide(NSNotification note)
{
  Control.ContentInset = UIEdgeInsets.Zero;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin.form 键盘出现时向上移动视图 的相关文章

随机推荐

  • 无法将 Json 解析为 NSDictionary

    我有一个 Web 服务 它返回以下 Json String password 1234 user andreas 我调用网络服务并尝试解析返回的数据 例如 NSURLConnection sendAsynchronousRequest re
  • 找不到模块:无法解析“F:\React\react-complete-guide\src\Component”中的“../axios”

    我在我的中遇到这个编译错误React我尝试发送的项目GET要求 src Component Form js Module not found Can t resolve axios in F React react complete gui
  • 是一个PrintWriter和BufferedWriter

    基本上我想知道 PrintWriter 是否是缓冲写入器 我见过这样的代码PrintWriter pw new PrintWriter new BufferedWriter new FileWriter file 然而从这个javadoc
  • 如何用C语言制作ppm文件的黑白图片?

    嘿 我的代码需要一些帮助 我读取了 ppm 文件 将颜色更改为黑色和白色 并希望将其保存到新文件中 我可以读取文件的标题并将其写入新文件 但我在更改颜色方面遇到了困难 我知道我可以用以下公式得到灰度值 0 299 红色分量 0 587 绿色
  • 从不同文件夹压缩文件,保留目录结构

    我编写了一些非常有趣的代码来压缩多个文件和文件夹 该脚本将采用参数列表 文件和文件夹 并将它们压缩为以日期 时间作为名称的 zip 所以我需要一些在参数是文件时执行的代码 该代码应将文件的目录结构添加到 zip 文件中 THE SCRIPT
  • 如何使用 DBpedia 属性构建主题层次结构?

    我试图通过遵循下面提到的两个 DBpedia 属性来构建主题层次结构 skos 更广泛的财产 dcterms 主题属性 我的目的是给这个词确定它的主题 例如 给出这个词 支持向量机 我想从中识别主题 例如分类算法 机器学习等 然而 有时我对
  • 使用 Perl 单行从文本文件中提取列:类似于 Unix cut

    我使用的是 Windows 我想使用 Perl Python 批处理等单行代码从文本文件中提取某些列 在 Unix 上我可以这样做 cut d f 1 3
  • 如何轻松地在 Git 中的多个发布分支上应用错误修复?

    我已经使用 git 进行单人开发有一段时间了 但直到现在我还没有遇到任何棘手的分支问题 而且我似乎忘记了一些基本的东西 而我在阅读实用版本后无疑 知道 这些东西使用 Git 进行控制书籍 我经常比我的网站上实际发布的内容提前几个版本 因此当
  • Hololens TCP 套接字 - Hololens 服务器的 Python 客户端

    经过几周的挫折后 我终于能够将一个字符串从 Python 客户端发送到 Hololens 服务器 代码如下并且运行完美 但是 我想知道是否有使用套接字经验的人可以帮助我修改此代码以将 openCV 网络摄像头帧 基本上只是发送图像 从 Py
  • 警告:复制捆绑资源构建阶段包含此目标的 Info.plist 文件

    我将一个项目分成两个构建 并给每个构建一个plist文件 一切正常 但我不断收到此构建警告 警告 复制捆绑资源构建阶段包含此目标的 Info plist 文件 MyApp Info plist 当我尝试构建时我得到了这个MyApp 构建第二
  • 数据库架构更新

    我正在开发一个使用本地 SQLite 数据库的 AIR 应用程序 并且想知道在分发新版本的应用程序时如何管理数据库架构更新 还考虑跳过某些版本的更新 例如 不是从 1 0 到 1 1 而是从 1 0 到 1 5 您会推荐什么技术 对于 SQ
  • WebClient DownloadFileAsync() 阻塞线程

    我正在尝试使用 WPF 和 MVVM 从我的网络服务器下载一个大文件 500 mb 因此 以下属性都绑定到某种控件 进度条 问题是 即使使用 DownloadFileAsync 应用程序仍然挂起 文件is从我的日志中可以看出 正在下载 当然
  • Apple Watch 的预处理器宏?

    我正在看苹果的Lister 适用于 Apple Watch iOS 和 OS X https developer apple com library prerelease ios samplecode Lister Listings Obj
  • Laravel 5.4:如何获取本周的记录?

    为了获取当天的所有记录 我做了 dt Carbon now dataToday Data whereDay created at dt gt day gt get 为了获取本周的记录 我尝试了以下方法 但没有成功 dataThisWeek
  • Ansible win_package 永远卡住

    我正在使用 win package 模块在 Windows 2016 服务器中安装 Nessus 但每当我执行它时 它就会永远挂起而没有响应 即使等了一个小时 也没有任何回应 我已经将 Nessus 安装程序保存在 Windows 服务器目
  • 创建全景视图android

    我想在 Android 中创建一个视图 屏幕 活动 其中的表格包含十列 由于 10 列不会在屏幕中调整宽度 不会采用可读格式 因此我一次显示 3 列 我想在应用程序中集成一个功能 如果用户在桌子上从右向左滑动 滑动 其他 3 4 列应该可见
  • 如何在网格视图中隐藏空列而不知道哪些列是空的?

    我正在使用一个 gridview 它根据下拉列表中的选择从 SQL 数据库中提取数据 源表有六列用于选择的属性 但根据选择的内容 可能会有一到六列为空 全部为空值 当该列为空时 我希望将其隐藏 以便页面不那么笨重和混乱 在过去的几天里 我一
  • 如何在 Debian Linux 系统上以非 root 身份安装 h5py (+numpy+libhdf5+...)

    我需要在 Debian Linux 系统上安装 h5py Python 模块及其所有缺少的依赖项 这项任务因以下原因而变得复杂 我在这个系统上没有任何超级用户权限 没有 sudo 没有 root 密码等 我使用的其余代码需要 Python
  • 生成 .p12 文件时没有证书与私钥匹配

    我已经成功生成了 p12文件 但我收到一条消息 如下所示 C OpenSSL Win32 bin gt openssl pkcs12 export inkey mykey key in exported pem out myfile p12
  • Xamarin.form 键盘出现时向上移动视图

    我正在尝试构建一个聊天应用程序用户界面 布局的想法非常简单 当输入栏获得焦点时 键盘会显示并 推 聊天栏 因为它是一个网格 ListView 将调整大小以适合屏幕 我更新输入栏的边距以 推 它 NSValue result NSValue