在键盘上显示带有按钮的 UIView,如 Skype、Viber 即时通讯工具(Swift、iOS)

2023-11-26

我想创建附件视图,将其放置在输入附件视图下,通过键盘,就像在 Skype 应用程序或 Viber 中一样:

enter image description here

我已经问过这样的问题了here,但是这个问题的建议解决方案并不是那么优雅,因为当我将滚动视图拖动到顶部时,我希望我的附件 UIView 用键盘向下移动(我使用 UIScrollViewKeyboardDismissModeInteractive)。

因此,我创建一个函数,找出放置键盘和自定义输入附件视图的视图:

    func findKeyboardView() -> UIView? {
       var result: UIView? = nil

       let windows = UIApplication.sharedApplication().windows
       for window in windows {
           if window.description.hasPrefix("<UITextEffectsWindow") {
               for subview in window.subviews {
                   if subview.description.hasPrefix("<UIInputSetContainerView") {
                       for sv in subview.subviews {
                           if sv.description.hasPrefix("<UIInputSetHostView") {
                               result = sv as? UIView
                               break
                           }
                       }
                       break
                   }
               }
              break
           }
       }
       return result
   }

enter image description here

之后我添加一个自定义 UIView 并创建一些约束:

    func createAttachView() {
        attach = MessageChatAttachmentsView(frame: CGRectZero)
        let newView = findKeyboardView()
        newView!.addSubview(attach!)
        newView!.addConstraint(NSLayoutConstraint(item: accessoryView, attribute: .Bottom, relatedBy: .Equal, toItem: attach!, attribute: .Top, multiplier: 1.0, constant: 0.0))
        attach!.addConstraint(NSLayoutConstraint(item: attach!, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 260))
        attach!.addConstraint(NSLayoutConstraint(item: attach!, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 320))
    }

这将在输入附件视图下和键盘上方创建自定义 UIView,并且当我向上滚动时它会移动。但是当我想按下按钮时,我按下键盘上的一个键。

enter image description hereenter image description here

那么我怎样才能将此视图移动到 UIInputSetHostView 中视图层次结构的顶部呢?


好吧,感谢 Brian Nickel,我找到了也许不是优雅但非常简单的解决方案。所以我重写了 inputAccessoryView 以通过键盘创建工具栏。所以基本上,如果我按下此工具栏上的附加按钮,我想看到另一个 inputView,而不是键盘。 因此,在我的自定义输入附件视图类中,我只创建了一些隐藏的文本视图:

class MessageChatInputAccessoryView : UIToolbar {
    var textView:UITextView!  //textView for entering text
    var sendButton: UIButton! //send message
    var attachButton: UIButton! // attach button "+"
    var attachTextView:UITextView! --> this one 

    override init(frame: CGRect) {
        super.init(frame: frame)
        .....
        ..... 
        attachTextView = UITextView(frame: CGRectZero)
        attachTextView.alpha = 0.0
        self.addSubview(attachTextView)
        ....
     }

所以在我的主视图控制器中,我创建了函数,为这个新创建的attachTextView重新初始化inputView,如下所示:

func attach(sender: UIButton) {
     if attachMenuIsShown {
          accessoryView.attachTextView.inputView = accessoryView.textView.inputView
          accessoryView.attachTextView.reloadInputViews()
          attachMenuIsShown = false
       } else {
           accessoryView.attachTextView.becomeFirstResponder()
           accessoryView.attachTextView.inputView = MessageChatAttachmentsView(frame: CGRectZero)
           accessoryView.attachTextView.reloadInputViews()
           attachMenuIsShown = true
    }

}

因此,当我按下附加按钮时,我的 AttachTextView 成为第一响应者,然后我重新初始化此 textView 的输入视图。我的附件视图就在输入附件视图下。当我再次按下附加按钮时,我使用主文本视图(即键盘视图)的默认 inputView 重新初始化 inputView 。

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

在键盘上显示带有按钮的 UIView,如 Skype、Viber 即时通讯工具(Swift、iOS) 的相关文章

  • SwiftUI 列表与右侧的部分索引?

    是否可以有一个在右侧有索引的列表 就像下面 SwiftUI 中的示例一样 我在 SwiftUI 中做了这个 Contacts swift TestCalendar Created by Christopher Riner on 9 11 2
  • UICollectionView 自动滚动到 IndexPath 处的单元格

    在加载集合视图之前 用户设置集合视图数组中的图像数量 所有单元格都不适合屏幕 我有 30 个单元格 但屏幕上只有 6 个 问题 如何在加载 UICollectionView 时自动滚动到具有所需图像的单元格 新的 编辑过的答案 将其添加到v
  • 无法构建 Saurik 的 ldid 实用程序

    当我执行此命令 make sh 时 我遇到这些错误 构建用于越狱调整开发的 ldid 实用程序 Bilals Mac ldid billy make sh g arch i386 arch x86 64 arch ppc arch armv
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • 如何在 Firebase 控制台中使用 Apple 新的 APN .p8 证书

    随着最近 Apple 开发者帐户的升级 我面临着一个困难 在尝试创建推送通知证书时 它为我提供了 p8 证书 而不是可以导出到 p12 的 APNs 证书 Firebase 控制台仅接受 p12 证书 那么我如何从这些新的 p8 证书中获取
  • 在没有预览窗口的情况下使用 AVCaptureVideoDataOutputSampleBufferDelegate

    我正在开发一个基于 Swift 的 macOS 应用程序 我需要捕获视频输入 但不将其显示在屏幕上 而不是显示视频 我想将缓冲的数据发送到其他地方进行处理 并最终显示它在 a 中的一个物体上SceneKit scene 我有一个Camera
  • 导入 RNCryptor 后架构 armv7 的未定义符号

    我导入了 RNCryptor 可以在这里找到 https github com rnapier RNCryptor https github com rnapier RNCryptor进入我的应用程序 但是 我在日志中收到了三个错误 Und
  • 从“NSPercientStoreResult”转换为不相关类型“Entity”总是失败

    我正在创建一个小应用程序来学习 CoreData 中的多对多关系 但是 使用下面的代码 从 NSFetchResult 到实体类 Groepering 的转换出现错误 与我的项目相比 我在互联网上找到的示例没有看到任何差异 为什么转换仍然失
  • 是否可以使用 Firebase 安排推送通知? [复制]

    这个问题在这里已经有答案了 我已经阅读了我能找到的所有文档 但仍然不知道这是否可行 如果我是用户 我可以安排特定时间的推送通知吗 Example 1 我是用户并打开应用程序 2 我允许通知并转到 pickerView 或其他任何内容 并设置
  • 在 Xcode 5 中重命名 iOS 项目[重复]

    这个问题在这里已经有答案了 我需要重命名一个 iOS 项目 有没有办法在不开始一个全新项目的情况下做到这一点 我发现的所有其他信息都与 Xcode 4 或旧版本相关 这些方法似乎使项目崩溃 我在尝试任何名称更改之前创建了一个快照 在 Xco
  • 如何接收有关与我共享的记录中所做更改的 CloudKit 通知?

    我有两个 iCloud 帐户 A and B 在两个不同的设备上 来自其中之一 A 我将 ckrecord 分享给另一个人 B 像这样 let controller UICloudSharingController controller p
  • 在 iOS 上将 NSString 转换为 NSDate 的正确方法?

    我一直在使用此方法将常规 NSString 对象转换为 NSDate 但尝试向 Apple 提交更新 但遭到拒绝 在 iOS 中还有什么其他方法可以做到这一点 NSString date str 2011 08 12T12 20 00Z N
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • 减少 CoreData 的调试输出?

    我正在开发一个使用 CoreData 的 iOS macOS 项目 它工作正常 但它会向控制台输出大量调试信息 这使得控制台无法使用 因为我的打印语句隐藏在所有与 CoreData 相关的内容中 我有一个非常简单的 CoreData 设置
  • Swift:使具有相同“形状”的两种类型符合通用协议

    我有两种不同的类型 它们代表相同的数据 并且具有完全相同的 形状 这两种不同的类型是代码生成的 我被迫处理它们 但是 我想让它们符合一个通用的协议 这样我就可以对这两种类型一视同仁 这是一个例子 假设这是我所坚持的两种代码生成类型 stru
  • 作为!与 Swift 中 Xcode 6.3 中的 as 运算符对比

    Xcode 6 3 使 Swift 发生了很大变化 我必须更换每个应用程序中的数十个位置as gt as 为什么 现在有什么规则 在 Swift 1 2 之前 as运算符可用于执行两种不同类型的转换 具体取决于要转换的表达式的类型及其要转换
  • UIPanGestureRecognizer 对坐标的限制

    我在主 UIView 中添加了一个子视图 称为panel 并且我向其中添加了gestureRecognizer 因为我希望它只能在Y轴上拖动并且只能在某些限制下 即160 300 超过300它不能拖动 我以这种方式实现了手势处理 IBAct
  • UIImageJPEGRepresentation 在视网膜显示屏上提供 2x 图像

    我有这段代码 它创建一个图像 然后向其添加一些效果并缩小其大小以使其largeThumbnail UIImage originalImage UIImage imageWithData self originalImage thumbnai
  • PFQueryTableViewController 错误

    我正在遵循在线教程 使用 Parse 作为后端创建照片共享应用程序 我已经运行了两次教程 两次都从头开始创建应用程序 但在同一位置仍然出现相同的错误 我到处寻找解决方案 但仍然没有运气 我正在使用 PFQueryTableViewContr
  • 在 UIScrollview 上显示缩略图的最佳方法是什么(从服务器下载)

    我想在 UIScrollview 如照片应用程序 上显示许多图像 作为缩略图 所有图像将从服务器下载 据我所知 有几种选择 1 通过创建 UIImageviews 然后将它们添加为主滚动视图上的子视图 2 通过子类化一个UIView类 然后

随机推荐