当用户点击UITextView和键盘时,如何使背景变暗/着色?

时间:2018-02-25 06:14:11

标签: ios swift uitextview

目前,当我点击UITextView内部/外部时,我能够使键盘显示/隐藏。我想通过在键盘出现时将背景变暗来使这个更好,然后在键盘消失后让背景恢复正常。

我被告知这种行为可能被称为“焦点”或“模态阴影叠加”,但无法找到符合我目标的教程或图像。 Here is a screenshot显示了我想要完成的内容:当为新的Instagram帖子编写标题时,背景色调较暗。

  1. 如何在Swift中实现此行为?
  2. 在iOS编程中调用了什么行为?
  3. 谢谢。 [:

1 个答案:

答案 0 :(得分:0)

首先回答你的两个问题:

  1. 有很多方法可以实现叠加。

    • 您可以添加 UIView 作为子视图,将其作为与textView的垂直间距约束,并对齐 self.view 的底部,并在键盘输入时更改其alpha值呈现/驳回。
    • 您可以在viewcontroller的self.view中添加 MaskView 。问题在于,当应用蒙版时,它将所有其他区域变为黑色(当然,您可以更改颜色),并且只有您在蒙版框架中设置的部分将是您建议的颜色(黑色,0.5阿尔法)。
  2. 您可以将其称为添加叠加层(除了在Apple的文档中添加我遇到过的掩码之外别无其他)

  3. 现在我已经使用了很长一段时间的方法。

    我将一个名为 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)以解除键盘,但这取决于你想要如何解雇它。

    以下是它的外观

    1

    希望它有所帮助!