答案 0 :(得分:13)
您可以将新的子视图添加到应用程序窗口。
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);
}
答案 1 :(得分:4)
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)
答案 2 :(得分:3)
您是否找到了解决此问题的有效方法?在iOS9中,您将customView放在窗口的顶部:
UIApplication.sharedApplication().windows[windowCount-1].addSubview(customView);
但如果键盘解除,顶部Windows将被删除,因此您的customView
将被删除。
期待您的帮助!
谢谢你的帮助!
答案 3 :(得分: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
中的最后一个窗口。
答案 4 :(得分:2)
您绝对可以将视图添加到应用程序窗口,也可以完全添加另一个窗口。您可以设置其框架和级别。级别可以是UIWindowLevelAlert
。
答案 5 :(得分:2)
方法1-取消键盘后不隐藏视图
正如TamásSengel所说,Apple的准则不支持在键盘上添加视图。在Swift 4.2中通过键盘添加视图的推荐方法是:
1)对于要在键盘上添加的视图,在超级视图中添加底部约束(不要忘记前导,尾随和高度约束,不要添加顶部约束!),从情节提要中选择该约束,然后拖动到您的班级(IBOutlet),在我的情况下是:
@IBOutlet weak var textFieldOverKeyboardBottomConstraint: NSLayoutConstraint!
2)将您想通过键盘的视图连接到班级(IBOutlet),在我的情况下是:
@IBOutlet weak var textFieldOverKeyboard: UIView!
3)添加viewDidLoad键盘侦听器(了解更多:Apple Guidelines):
// Keyboard hide/show notification observer
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
4)为键盘侦听器添加@objc函数,该函数只会更改自定义视图的底部约束常量:
// MARK: - Keyboard
@objc private func keyboardWillShow(notification: Notification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
UIView.animate(withDuration: 0.5) { [unowned self, keyboardSize] in
self.textFieldOverKeyboardBottomConstraint.constant = keyboardSize.height
self.view.layoutIfNeeded()
}
}
}
@objc private func keyboardWillHide(notification: Notification) {
textFieldOverKeyboardBottomConstraint.constant = 0
}
方法1:包含图片的结果
方法2-取消键盘后隐藏视图
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()
}
方法2:包含图片的结果
方法2:在TableView Controller中-在底部添加粘性视图
如果您想使用此方法(2),请点击此链接以处理iPhone X等屏幕的安全区域。文章:InputAccessoryView and iPhone X
override var inputAccessoryView: UIView? {
return toolBar
}
override var canBecomeFirstResponder: Bool {
return true
}
答案 6 :(得分:0)
虽然访问最顶层的窗口是可行的,但我会避免这样做,因为它明显会干扰Apple的指导。
我要做的是解雇键盘并用相同尺寸的视图替换它的框架。
可以从列出的here键盘通知中访问键盘的框架,其userInfo
包含可以使用UIKeyboardFrameEndUserInfoKey
访问的密钥。