如何在 iOS 中通过键盘显示 UIView

Posted

技术标签:

【中文标题】如何在 iOS 中通过键盘显示 UIView【英文标题】:How to display UIView over keyboard in iOS 【发布时间】:2015-09-04 06:45:10 【问题描述】:

当用户在 inputAccessoryView 中点击“附加”按钮时,我想通过键盘创建一个简单的视图。 像这样的:

有简单的方法吗?或者我应该创建我的自定义键盘?

【问题讨论】:

【参考方案1】:

您可以将该新子视图添加到您的应用程序窗口。

func attach(sender : UIButton)

    // Calculate and replace the frame according to your keyboard frame
    var customView = UIView(frame: CGRect(x: 0, y: self.view.frame.size.height-300, width: self.view.frame.size.width, height: 300))
    customView.backgroundColor = UIColor.redColor()
    customView.layer.zPosition = CGFloat(MAXFLOAT)
    var windowCount = UIApplication.sharedApplication().windows.count
    UIApplication.sharedApplication().windows[windowCount-1].addSubview(customView);

【讨论】:

你可以用sender.window代替UIApplication.sharedApplication().windows[...]吗? @rintaro:那不行,那会在键盘下方添加视图 这是一个 hacky 解决方案,应该避免。窗口层次结构可以在任何新推出的 ios 版本上更改。【参考方案2】:

Swift 4 版本:

let customView = UIView(frame: CGRect(x: 0, y: self.view.frame.size.height - 300, width: self.view.frame.size.width, height: 300))
customView.backgroundColor = UIColor.red
customView.layer.zPosition = CGFloat(Float.greatestFiniteMagnitude)
UIApplication.shared.windows.last?.addSubview(customView)

诀窍是将customView 作为顶部子视图添加到持有键盘的UIWindow - 它恰好是UIApplication.shared.windows 中的最后一个窗口。

【讨论】:

从 UIApplication 获取 windows 而不是 keyWindow 的最后一个工作!【参考方案3】:

Swift 4.0

let customView = UIView(frame: CGRect(x: 0, y: self.view.frame.size.height-300, width: self.view.frame.size.width, height: 300))
customView.backgroundColor = UIColor.red
customView.layer.zPosition = CGFloat(MAXFLOAT)
let windowCount = UIApplication.shared.windows.count
UIApplication.shared.windows[windowCount-1].addSubview(customView)

【讨论】:

【参考方案4】:

正如 Tamás Sengel 所说,Apple 的指南不支持在键盘上添加视图。在 Swift 4 和 5 中添加键盘视图的推荐方法是:

1) 在故事板中添加带有“下一步”按钮的视图作为外部视图并在您的班级中连接(请参阅解释图像),在我的情况下:

IBOutlet private weak var toolBar: UIView!

2) 对于要通过键盘添加自定义视图的文本字段,将其作为附件视图添加到 viewDidLoad:

override func viewDidLoad() 
    super.viewDidLoad()
    phoneNumberTextField.inputAccessoryView = toolBar

3) 为“下一步”按钮添加操作:

@IBAction func nextButtonPressed(_ sender: Any) 
    descriptionTextView.becomeFirstResponder()

    // or -> phoneNumberTextField.resignFirstResponder()

解释图片

方法二:带图结果

在 TableView 控制器中 - 在底部添加删除视图

如果您想使用此方法 (2),请按照此链接处理 iPhone X 等屏幕的安全区域。文章:InputAccessoryView and iPhone X

override var inputAccessoryView: UIView? 
    return toolBar


override var canBecomeFirstResponder: Bool 
    return true

【讨论】:

这应该是正确的答案。感谢用户doca。你就是男人。【参考方案5】:

你有没有找到一些有效的方法来解决这个问题?在 iOS9 中,您将 customView 放在窗口的顶部:

UIApplication.sharedApplication().windows[windowCount-1].addSubview(customView);

但如果键盘关闭,顶部的 Windows 将被删除,因此您的 customView 将被删除。 期待您的帮助! 感谢您的帮助!

【讨论】:

请看我的回答,我这样解决这个问题-***.com/questions/32598490/…【参考方案6】:

您绝对可以将视图添加到应用程序的窗口中,也可以完全添加另一个窗口。您可以设置它的框架和水平。级别可以是UIWindowLevelAlert

【讨论】:

【参考方案7】:

虽然这可以通过访问最顶部的窗口来实现,但我会避免这样做,因为它明显违反了 Apple 的准则。

我要做的是关闭键盘并将其框架替换为具有相同尺寸的视图。

键盘的框架可以通过here 列出的键盘通知访问,它们的userInfo 包含一个可以通过UIKeyboardFrameEndUserInfoKey 访问的键。

【讨论】:

以上是关于如何在 iOS 中通过键盘显示 UIView的主要内容,如果未能解决你的问题,请参考以下文章

在键盘上显示带有按钮的 UIView,例如在 Skype、Viber messengers(Swift、iOS)中

iOS - 隐藏在键盘后面的 UIView 容器

加载时如何将 UIPickerView 放在 UIView 之外

如何在 iOS 中通过 UIActivityViewController 导出 PHAsset 视频

如何在 iOS 中通过 xmpp 删除单个聊天?

如何在 iOS 6+ 中通过 SKStoreProductViewController 监控下载进度?