如何在iOS中在键盘上方显示UIView

14

我希望在inputAccessoryView中的"Attach"按钮被点击时创建一个简单的视图,类似于下面这张图片:

enter image description here

有没有简单的方法来实现这个功能?或者我应该创建自定义键盘?

7个回答

21

你可以将这个新的子视图添加到你的应用程序窗口中。

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
1
@rintaro:那样做不行,那会在键盘下面添加视图。 - Midhun MP
7
这是一个不太稳妥的解决方案,应该避免使用。在任何新版本的iOS中,窗口层次结构都有可能发生变化。 - atulkhatri
1
这个不支持iOS 16,无法在键盘上方添加视图,有什么方法可以解决吗? - Siek

9

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 是可行的! - Tai Le
1
嘿,这段代码在Xcode 14上无法运行。 - Coder

5

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所说,苹果的指南不支持在键盘上方添加视图。在Swift 4和5中,在键盘上方添加视图的推荐方法是:
1)在你的storyboard中添加一个带有"Next"按钮的视图作为外部视图,并连接到你的类(请参见说明图片),在我的情况下:
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()
}
解释图片: 输入图像描述

方法2:使用图片的结果

输入图像描述

在表视图控制器中-在底部添加粘滞视图

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

override var inputAccessoryView: UIView? {
    return toolBar
}

override var canBecomeFirstResponder: Bool {
    return true
}

1
这应该是正确答案。感谢用户doca。你太棒了。 - Florent

3

你有找到一些有效的方法来解决这个问题吗?在iOS9中,你可以把自定义视图放在窗口的顶部:

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

但是如果键盘消失,顶部的窗口也会被移除,所以你的customView也会被移除。

期待你的帮助!

谢谢你的帮助!


请查看我的答案,我是这样解决这个问题的 - https://dev59.com/oo_ea4cB1Zd3GeqPKSas - pavel_s

2

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


0

虽然可以通过访问最顶层的窗口来实现,但我建议避免这样做,因为它明显会干扰苹果的指南。

我会关闭键盘并用相同尺寸的视图替换其框架。

可以从键盘通知中访问键盘的框架,这些通知在此处列出,它们的userInfo包含一个可以使用UIKeyboardFrameEndUserInfoKey访问的键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接