gpt4 book ai didi

ios - 在键盘处于事件状态时呈现模态视图 Controller

转载 作者:技术小花猫 更新时间:2023-10-29 10:59:27 27 4
gpt4 key购买 nike

所以我基本上有一个表单,由几个文本字段组成。用户像往常一样在字段中键入内容。但用户也可以选择双击文本字段,它会呈现一个模态视图 Controller ,允许用户从与该字段相关的多个选项中进行选择。

我能否以某种方式在键盘上“显示”模态,这样当它被关闭时,键盘对于在我显示模态之前作为第一响应者的字段仍然有效?

现在,键盘在模态出现时消失,并在模态消失时重新出现。它在我看来很笨重,而且让人分心。很想简化它,并减少屏幕上的动画量。

最佳答案

编辑:我已经针对 iOS 12 和 Swift 更新了这个答案。修改后的示例项目(包含新的 Swift 和更新的 Objective-C 实现)是 here .


您可以创建一个新的 UIWindow 并将其放置在默认窗口之上,同时隐藏键盘窗口。


Animated example of overlaying a new UIWindow over the existing one


我在 Github 上有一个示例项目 here , 但基本过程如下。

  • 为您的模态视图创建一个新的 UIViewController 类。我调用了我的 OverlayViewController。根据需要设置相应的 View 。根据你的问题,你需要传回一些选项,所以我制定了一个委托(delegate)协议(protocol) OverlayViewController 并将主窗口的 Root View Controller (类 ViewController)作为我们的委托(delegate)。<
protocol OverlayViewControllerDelegate: class {
func optionChosen(option: YourOptionsEnum)
}
  • 向我们的原始 View Controller 添加一些支持属性。
class ViewController: UIViewController {
/// The text field that responds to a double-tap.
@IBOutlet private weak var firstField: UITextField!
/// A simple label that shows we received a message back from the overlay.
@IBOutlet private weak var label: UILabel!
/// The window that will appear over our existing one.
private var overlayWindow: UIWindow?
  • UITapGestureRecognizer 添加到您的 UITextField
override func viewDidLoad() {
super.viewDidLoad()

// Set up gesture recognizer
let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
doubleTapRecognizer.numberOfTapsRequired = 2
doubleTapRecognizer.delegate = self

firstField.addGestureRecognizer(doubleTapRecognizer)

firstField.becomeFirstResponder()
}
  • UITextField 有一个内置的手势识别器,所以我们需要允许多个 UIGestureRecognizer 同时操作。
extension ViewController: UIGestureRecognizerDelegate {
// Our gesture recognizer clashes with UITextField's.
// Need to allow both to work simultaneously.
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
  • 这是有趣的部分。当手势识别器被触发时,创建新的 UIWindow,将您的 OverlayViewController 指定为 Root View Controller , 并展示它。请注意,我们将窗口级别设置为 UIWindowLevelAlert,因此它会出现在前面。然而,尽管有警告窗口级别,键盘仍然在前面,所以我们也必须手动隐藏它的窗口。

重要的是不要将新的 UIWindow 设置为键或更改 UITextField 的第一响应者,否则键盘将被关闭.

以前(在 iOS 10 之前?)我们可以使用 overlayWindow.makeKeyAndVisible(),但现在将其设置为键将关闭键盘。此外,键盘窗口现在有一个非标准的 UIWindow.Level 值,它位于每个公开定义的值之前。我通过在层次结构中找到键盘窗口并将其隐藏来解决这个问题。

@objc func handleDoubleTap() {
// Prepare the overlay window
guard let overlayFrame = view?.window?.frame else { return }
overlayWindow = UIWindow(frame: overlayFrame)
overlayWindow?.windowLevel = .alert
let overlayVC = OverlayViewController.init(nibName: "OverlayViewController", bundle: nil)
overlayWindow?.rootViewController = overlayVC
overlayVC.delegate = self

// The keyboard's window always appears to be the last in the hierarchy.
let keyboardWindow = UIApplication.shared.windows.last
keyboardWindow?.isHidden = true
}
  • 覆盖窗口现在是原始窗口。用户现在可以选择您在叠加 View 中构建的任何选项。在您的用户选择一个选项后,您的代表应该执行您想要的任何操作,然后关闭覆盖窗口并再次显示键盘。
func optionChosen(option: YourOptionsEnum) {
// Your code goes here. Take action based on the option chosen.
// ...

// Dismiss the overlay and show the keyboard
overlayWindow = nil;
UIApplication.shared.windows.last?.isHidden = false
}
  • 叠加窗口应该消失,您的原始窗口应该出现,键盘位置与以前相同。

关于ios - 在键盘处于事件状态时呈现模态视图 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25130678/

27 4 0
文章推荐: css - 引导类 "text-center"不工作
文章推荐: c# - 使用 C# 在应用程序购买收据中验证 iOS
文章推荐: css - 响应式语义 UI React 网格、列、行
文章推荐: css - 有没有办法通过 CSS 增强 HTML