【问题标题】:Keyboard/Toolbar breaks when removing and adding views in window在窗口中删除和添加视图时键盘/工具栏中断
【发布时间】:2021-03-21 03:20:22
【问题描述】:

在您的应用程序中执行以下行会以某种方式破坏键盘及其工具栏。工具栏从键盘“分离”并开始在状态栏下方的屏幕顶部滑入和滑出。

if #available(iOS 13.0, *) {
    for scene in UIApplication.shared.connectedScenes {
        guard let windowScene = scene as? UIWindowScene else { continue }
        for window in windowScene.windows {
            for view in window.subviews {
                view.removeFromSuperview()
                window.addSubview(view)
            }
        }
    }
} else {
    for window in UIApplication.shared.windows {
        for view in window.subviews {
            view.removeFromSuperview()
            window.addSubview(view)
        }
    }
}    

我知道这很“hacky”,我只是偶然发现它,现在我很好奇为什么删除和添加视图会导致这种行为。有人有想法吗? (系统添加的工具栏也会发生这种情况,例如在 web 视图中)

在这里很难看到,但您可以看到左侧工具栏按钮:

【问题讨论】:

    标签: ios swift xcode keyboard toolbar


    【解决方案1】:

    问题是总是有多个窗口,其中一个是UITextEffectsWindow,它负责显示键盘(可能还有其他视图,因为它是一个私有API,所以没有任何官方文档)。

    在遍历窗口时忽略UITextEffectsWindow 将解决您的键盘问题。

    for window in windowScene.windows.reversed() {
        if NSStringFromClass(window.classForCoder) == "UITextEffectsWindow" {
            NSLog("===== Ignore UITextEffectsWindow")
    
            return
        }
    
        for view in window.subviews.reversed() {
            view.removeFromSuperview()
            window.addSubview(view)
        }
    }
    

    但由于UITextEffectsWindow 是一个私有API,如果窗口是UIWindow,也许你应该做相反的事情并且只删除视图。

    【讨论】:

    • 这是我一直在寻找的答案,非常感谢:full_moon_with_face: :P
    【解决方案2】:

    removeFromSuperView() 方法将删除所有引用被删除视图的自动布局约束,以及该视图的子视图。它们不会因为您重新添加视图而神奇地恢复存在,因此您最终会得到视图的框架恰好是什么。

    由于您在这里进行试验,您可以尝试这个来查看视图是否恢复了它们的约束:

            for view in window.subviews {
                let constr = view.constraints
                view.removeFromSuperview()
                window.addSubview(view)
                NSLayoutConstraint.activate(constr)
            }
    

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多