目前,当我点击UITextView内部/外部时,我能够使键盘显示/隐藏。我想通过在键盘出现时将背景变暗来使这个更好,然后在键盘消失后让背景恢复正常。
我被告知这种行为可能被称为“焦点”或“模态阴影叠加”,但无法找到符合我目标的教程或图像。 Here is a screenshot显示了我想要完成的内容:当为新的Instagram帖子编写标题时,背景色调较暗。
谢谢。 [:
答案 0 :(得分:0)
首先回答你的两个问题:
有很多方法可以实现叠加。
您可以将其称为添加叠加层(除了在Apple的文档中添加我遇到过的掩码之外别无其他)
现在我已经使用了很长一段时间的方法。
我将一个名为 overlay 变量的 UIView 添加到我的ViewController中,目前将其框架设置为 CGRect.zero
var overlay: UIView = UIView(frame: CGRect.zero)
之后,我在viewDidLoad中为 keyboardWillShow 和 keyboardWillHide 添加了通知观察者。
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
并添加相应的选择器以处理通知
@objc func keyboardWillShow(notification: NSNotification)
@objc func keyboardWillHide(notification: NSNotification)
在keyboardWillShow中,我得到键盘框架以获得键盘高度
之后,我通过获取屏幕的高度并减去导航栏高度, textView的高度和任意来计算叠加的高度保证金添加到textView的顶部
然后我通过从textView正下方的 Y位置给它来初始化我的 overlay 变量。最初,我将它的颜色设置为 UIColor.clear 将其作为子视图添加到self.view,然后将其颜色更改为黑色,0.5 alpha ,持续时间为0.5动画。
@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
let overlayHeight = UIScreen.main.bounds.height - heightOfNavigationBar - keyboardSize.height - textView.frame.size.height - topConstraintofTextView(if any)
let overlayFrame = CGRect(x: 0, y: textView.frame.size.height + textView.frame.origin.y, width: UIScreen.main.bounds.width, height: overlayHeight)
self.overlay = UIView(frame: overlayFrame)
self.overlay.backgroundColor = .clear
self.view.addSubview(overlay)
UIView.animate(withDuration: 0.5, animations: {
self.overlay.backgroundColor = UIColor.black.withAlphaComponent(0.5)
})
}
}
之后,在keyboardWillHide中,我用一点动画将叠加的alpha更改为 0 ,一旦结束,我就从superView中删除叠加。
@objc func keyboardWillHide(notification: NSNotification) {
UIView.animate(withDuration: 0.5, animations: {
self.overlay.backgroundColor = UIColor.black.withAlphaComponent(0)
}, completion: { (completed) in
self.overlay.removeFromSuperview()
})
self.overlay.removeFromSuperview()
}
我在viewController的 touchesBegan 中执行self.view.endEditing(true)
以解除键盘,但这取决于你想要如何解雇它。
以下是它的外观
希望它有所帮助!