如何在iOS

时间:2015-09-04 06:45:11

标签: ios swift uiview uikeyboard

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

enter image description here

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

7 个答案:

答案 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:包含图片的结果

enter image description here

方法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:说明图片enter image description here

方法2:包含图片的结果

enter image description here

方法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访问的密钥。