Swift 4.2 当键盘显示时使 tableView 的底部向上移动

2024-05-08

尽管我已经进行了搜索,但我对如何最好地解决这个问题感到困惑。

我有一个 tableView,其中底部单元格是列表的输入,就像苹果提醒的工作方式一样。当列表中的项目太多时,键盘会覆盖列表,我看不到正在输入的内容。

我认为我需要更改表视图的物理大小并确保在键盘显示时它滚动到底部。

有些人说是键盘观察者,但我发现的大多数代码都已经过时,并且在放入 Xcode 时会出现错误。

NSNotificationCenter Swift 3.0 键盘显示和隐藏 https://stackoverflow.com/questions/41718520/nsnotificationcenter-swift-3-0-on-keyboard-show-and-hide

这是我能找到的最好的,但我也听说了一些限制,使用 UITableViewController 而不是嵌入 UITableView 等等......

这是我到目前为止的代码:

NotificationCenter.default.addObserver(self, selector: #selector(EntryViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(EntryViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)


@objc func keyboardWillShow(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        print("notification: Keyboard will show")
        if self.view.frame.origin.y == 0{
            self.view.frame.origin.y -= keyboardSize.height
        }
    }

}

@objc func keyboardWillHide(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y != 0 {
            self.view.frame.origin.y += keyboardSize.height
        }
    }
}

我认为这会将整个视图向上移动,这意味着安全区域(例如导航栏等)的下方有 TableView。在这种方法中我是否使导航视图不透明?


一种解决方案(我有时使用)是简单地更改内容偏移量tableView当键盘出现/消失时。我相信这会在您的实例中起作用,而不是像您提到的那样改变 tableView 的约束UIViewController is a UITableViewController。请参阅下面的代码来了解我的建议,希望这对您有所帮助!

处理通知:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    NotificationCenter.default.addObserver(self, selector: #selector(EntryViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(EntryViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    NotificationCenter.default.removeObserver(self)
}

Actions:

@objc func keyboardWillShow(notification: Notification) {
    if let keyboardHeight = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
        print("Notification: Keyboard will show")
        tableView.setBottomInset(to: keyboardHeight)
    }
}

@objc func keyboardWillHide(notification: Notification) {
    print("Notification: Keyboard will hide")
    tableView.setBottomInset(to: 0.0)
}

扩展:

extension UITableView {

    func setBottomInset(to value: CGFloat) {
        let edgeInset = UIEdgeInsets(top: 0, left: 0, bottom: value, right: 0)

        self.contentInset = edgeInset
        self.scrollIndicatorInsets = edgeInset
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 4.2 当键盘显示时使 tableView 的底部向上移动 的相关文章

随机推荐

  • 如何使用 R vctrs 包构建一个可以与 c() 结合的对象

    我试图了解如何用向量构建对象 我认为这很简单 但是当我在我的对象上使用 c 时遇到了麻烦 我们的对象有两个属性 x 和描述符 在本例中都是字符串 我的对象将具有不同类型的属性 我们构建了一个构造函数 new toy vector 我还没有在
  • 当一个模块安装了两个版本时 Perl 会做什么?

    我在正在使用的远程机器上没有 root 访问权限 因此我使用 cpanm 和 local lib 的组合 如下所述here https stackoverflow com a 2980715 1156644将 CPAN 模块安装到我的本地目
  • 提交表单时 ng-required 不起作用

    我在带有 required 属性的输入文本框中包含以下代码 但是当我跳出该字段或提交表单时 它不会阻止表单提交并通知用户该字段是必填字段 div class col sm 8 div
  • Node.js 子进程

    我试图弄清楚这对于 node js 子进程来说是否是一个不错的用例 我有一款多人游戏 人们可以进行 1v1 比赛 我应该为每场比赛使用子进程吗 并不是真的需要 由于节点是基于事件的 并且单个进程将能够处理数千个这样的玩家对 您将为每个这样的
  • 从什么时候起sqlite的持久日志模式成为Android中的默认日志模式?

    从什么时候起sqlite的持久日志模式成为Android中的默认日志模式 我知道Android版本4 1 1 API 16 中的日志模式已经改变 但这并不准确 因为发行说明中不包含此信息 我不知道是否可以在发行说明中找到 如果您认识的人确切
  • 使用jmeter测试多个网站

    如何使用jmeter测试100个不同的网站 来自DMOZ 我认为可以通过将jmeter与脚本集成来完成 基本上 该脚本是告诉 jmeter 从文本或 csv 文件中读取 URL 并将 http 请求采样器更改为文件中的 URL 以运行测试
  • 使用 VBA 清除 Excel 单元格格式而不清除 NumberFormat

    是否可以在不改变 的情况下清除Excel单元格格式和内容 使用VBA NumberFormat 给定的单元格 我尝试过 ClearContents ClearFormats 但 ClearFormats 删除了数字格式细胞也 请建议 你可以
  • 前置条件失败:从 iOS 13.4 开始,在 SwiftUI 中使用 GeometryReader 时输入索引无效

    昨天 我将 XCode 和我的项目升级到 iOS 13 4 我开始在使用 GeometryReaders 的视图周围看到很多失败 除了 前提条件失败 输入索引无效 之外 该错误没有显示任何内容 升级到 13 4 1 后我遇到了完全相同的问题
  • 使用 javascript onchange 下拉菜单

    我有一个简单的下拉菜单 我希望拥有它 以便如果用户选择 有一个婴儿 则消息会更改为 有一个婴儿 但对于任何其他选择 该消息保持不变 什么也没有 但这不起作用 有人可以帮忙吗 请玩我的jsfiddle http jsfiddle net Z9
  • 当 ToString() 具有协作对象时,为什么 WPF 数据绑定不显示文本?

    在一个简单的形式中 我绑定到许多不同的对象 有些放在列表框中 有些放在列表框中 有些放在列表框中 一些在文本块中 其中一些对象具有协作对象 在这些对象上ToString 方法在执行其工作时调用 通常是某种格式化程序 当我单步执行代码时 我发
  • 用Python识别图像

    我对 OCR 识别和 Python 都有点陌生 我想要实现的是从 Python 脚本运行 Tesseract 以 识别 tif 中的某些特定数字 我以为我可以为 Tesseract 做一些培训 但我在 Google 和 SO 上没有找到任何
  • 添加属性的描述

    如何为我的房产添加文字描述 我的代码 private bool SpaceKey public bool SpaceKey get return SpaceKey set SpaceKey value 看看描述 属性 http msdn m
  • 如何使用代码隐藏创建 StackPanel -> 边框 -> 背景

    我正在尝试设置 a 的属性TreeViewItem gt StackPanel在 C 中就像这个问题 https stackoverflow com questions 8203316 adding content to a treevie
  • C# 使用 WebClient 下载分块编码内容

    我编写了一个客户端应用程序 该应用程序应该从网络服务器下载文件 非常简单 using WebClient webClient new WebClient webClient DownloadFile http localhost audio
  • 获取无法使用引导轮播脚本读取未定义的属性“offsetWidth”

    我创建了一个carousel with Bootstrap 3 3它可以在我的本地计算机上运行 但是当我将整个内容上传到服务器上时 其中引导程序js文件与单个文件中的其他文件一起编译 我收到此错误 Cannot read property
  • Python3:如何“不”四舍五入到最接近的偶数?

    我知道Python3的round 函数四舍五入到最接近的偶数 我怎样才能防止这种情况发生并使其像Python2那样从零舍入一半 您可以使用Decimal and ROUND HALF UP from decimal https docs p
  • sympy 中共轭的导数

    当我尝试用 SymPy 区分符号时 我得到以下结果 In x Symbol x In diff x x Out 1 当我将符号与其共轭微分时 结果是 In 55 diff x x conjugate Out 55 0 但是 当我尝试区分符号
  • 具有多个数据源 Oracle 和 H2 的 Spring Boot

    我为我的 Angular 项目开发了一个 Spring Boot RestController 并遇到了问题 在我的休息服务逻辑中 我使用了两个不同的数据库来获取数据 在这里您可以看到数据源配置 应用程序 属性 datasource1 sp
  • 是否可以将 FormData 与图像文件一起从 Angular 6 应用程序发送到 Web API

    是否可以将表单数据与图像文件一起从 Angular 6 应用程序传递到 Web api 应用程序组件 ts onSelectFile event if event target files event target files 0 this
  • Swift 4.2 当键盘显示时使 tableView 的底部向上移动

    尽管我已经进行了搜索 但我对如何最好地解决这个问题感到困惑 我有一个 tableView 其中底部单元格是列表的输入 就像苹果提醒的工作方式一样 当列表中的项目太多时 键盘会覆盖列表 我看不到正在输入的内容 我认为我需要更改表视图的物理大小