【问题标题】:How to overlay a view above a keyboard in iOS [duplicate]如何在iOS中覆盖键盘上方的视图[重复]
【发布时间】:2018-02-01 14:06:55
【问题描述】:

我需要展示一个覆盖打开键盘的帮助屏幕 - 帮助屏幕应该使下方的整个视图变暗,并仅保留一个完全透明的小孔以“突出显示”该部分。重点是提供一些关于几个视图组件的信息,同时突出显示它们。如果没有键盘,我可以将视图放在层次结构的顶部,但在这种情况下,UI 使用带有自定义输入附件的键盘,该附件需要可见。

我尝试插入一个新的UIWindow 并将其放在所有UIWindows 之上:

class CustomTextField: UITextField {
    override var canResignFirstResponder: Bool {
        return false
    }
}

class ViewController: UIViewController {
    var textField: UITextField = CustomTextField()

    override func viewDidAppear(_ animated: Bool) {
        view.backgroundColor = .white
        super.viewDidAppear(animated)

        textField.frame = CGRect(x: 0, y: 0, width: 200, height: 50)
        view.addSubview(textField)
        textField.backgroundColor = UIColor.gray
        textField.becomeFirstResponder()

        DispatchQueue.main.asyncAfter(wallDeadline: .now() + 1) {

            self.window.windowLevel = 100000002.0 // based on experiments with UIApplication.shared.windows this should be the top most window
            let controller = UIViewController()
            controller.view.backgroundColor = UIColor.black.withAlphaComponent(0.5)
            self.window.rootViewController = controller
            self.window.makeKeyAndVisible()
        }
    }
    let window = UIWindow(frame: UIScreen.main.bounds)
}

但是这种方法有两个问题:

  1. 一旦窗口变为键且可见,键盘就会隐藏。
  2. 即使在使用windowLevel = 100000002.0 时,键盘似乎也位于窗口上方(键盘会进行动画处理,因此在隐藏时,我可以看到它位于窗口上方)。

任何想法如何处理这两个问题?有没有可能?

【问题讨论】:

  • 这可能对你有帮助 - How to display UIView over keyboard in iOS
  • 哇,你说得对……我怎么没找到?非常感谢!
  • @MilanNosáľ 您描述的两个问题与我遇到的两个问题完全相同。您会认为使用新窗口并将其设为键会使它显示在键盘上方,但可惜不是。为什么键盘一出现在屏幕上窗口就消失没有多大意义。您在下面的回答是帮助我解决这两个问题的原因。谢谢!!!

标签: ios keyboard uiwindow


【解决方案1】:

好的,正如@Krunal 所指出的,这是this question 的副本。诀窍是将覆盖视图添加到键盘所在的窗口(恰好是UIApplication.shared.windows.last):

类视图控制器:UIViewController { var textField: UITextField = UITextField() 覆盖 func viewDidAppear(_ animated: Bool) { view.backgroundColor = .white super.viewDidAppear(动画) textField.frame = CGRect(x: 0, y: 0, width: 200, height: 50) view.addSubview(textField) textField.backgroundColor = UIColor.gray textField.becomeFirstResponder() DispatchQueue.main.asyncAfter(wallDeadline: .now() + 1) { // 这可以解决问题 让 customView = UIView(frame: self.view.bounds) customView.backgroundColor = UIColor.black.withAlphaComponent(0.5) customView.layer.zPosition = CGFloat(Float.greatestFiniteMagnitude) UIApplication.shared.windows.last?.addSubview(customView) } } }

【讨论】:

  • 你也可以接受你自己的答案,如果它对你有用的话。重复与否无关紧要:)
  • @Krunal 是的,我知道,但是您只能在两天后接受您的问题 :).. 但是非常感谢您 - 我会给您一些支持,以感谢您的一些回答: D
  • 这个答案肯定有效,但我使用键盘通知UIResponder.keyboardWillChangeFrameNotification 添加自定义视图。重要的是要理解这必须在键盘添加到层次结构之后添加,以便您的自定义视图能够浮动在键盘上方。我删除了键盘通知UIResponder.keyboardWillHideNotification 中的自定义视图。我的自定义视图是一个类级别的属性,所以我只需要调用 myCustomView.removeFromSuperview() 来删除它。
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
相关资源
最近更新 更多