SwiftUI / iOS |在没有 NSNotification 的情况下获取键盘大小

Posted

技术标签:

【中文标题】SwiftUI / iOS |在没有 NSNotification 的情况下获取键盘大小【英文标题】:SwiftUI / iOS | Get keyboard size without NSNotification 【发布时间】:2019-07-29 13:30:27 【问题描述】:

我想知道是否有可能在没有任何通知的情况下获取我的应用程序当前正在运行的设备的键盘大小,因为我想在我的视图中的那个点上放置一个按钮键盘将结束。键盘出现时可能会改变位置,但正如我之前所说,我希望它在动画出现之前就在那里。

否则,ios 键盘可能存在任何静态大小,例如设备屏幕高度的 1/3 还是什么?

这就是我想要达到的目标:

iPhone XS Max 上硬编码的屏幕截图:

谢谢!

【问题讨论】:

你检查过这个问题的答案了吗?这些中的任何一个都可以指导您吗?如果不是 - 并且因为您希望此“登录”按钮在键盘不可见时不可见,您能否显示一些代码来帮助我们?特别是您的视图和模型。谢谢! ***.com/questions/56716311/… @dfd 每个视图在任何时候都应该可见,登录按钮也应该可见。它只需要从设备底部填充键盘高度。这就是我努力实现的目标。 好的,一个澄清问题:您是否要 (a) 不让您的视图适应键盘并且 (b) 让登录按钮在出现时保持静止? 没关系,你已经说过了。我的错。 :-) SwiftUI 的想法是“流动的”(也是“反应性的”,但在你的情况下不是)。我敢打赌(但还有其他人比我做得更好),如果你在UIKit 有办法实现这一点,那就是要走的路。我认为最简单的方法是使用GeometryReader 获取父级的大小,并按比例放置 - 就像你说的,屏幕高度的 1/3。 @dfd 我可以将它放在底部上方父级的 1/3 处,但这不是我想要实现的。那么,您不知道如何获取或计算键盘的确切尺寸吗? 【参考方案1】:

我已经为 Publisher 创建了一个扩展。但是,它使用 NotificationCenter

extension Publishers 
    static var keyboardHeight: AnyPublisher<CGFloat, Never> 
        let willShow = NotificationCenter.default.publisher(for: UIApplication.keyboardWillShowNotification)
            .map  $0.keyboardHeight 
        
        let willHide = NotificationCenter.default.publisher(for: UIApplication.keyboardWillHideNotification)
            .map  _ in CGFloat(0) 
        
        return MergeMany(willShow, willHide)
            .eraseToAnyPublisher()
    

另外,你需要为keyboardHeight创建一个状态变量

@State private var keyboardHeight: CGFloat = 0

最后,您可以使用以下方法观察高度的变化:

Text("")
       .onReceive(Publishers.keyboardHeight) 
                            self.keyboardHeight = $0
                        

这是我用来获取高度的方法。

【讨论】:

以上是关于SwiftUI / iOS |在没有 NSNotification 的情况下获取键盘大小的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI / iOS |在没有 NSNotification 的情况下获取键盘大小

有没有办法在 SwiftUI 中更改列表的背景颜色? 2020 (iOS 14)

为啥相同的 SwiftUI 代码可以在 iOS 上运行而在 macOS 上失败?

SwiftUI 2.0:如何使用没有标题的工具栏()自定义 iOS 14 导航栏?

iOS 14 SwiftUI UIViewRepresentable updateUIView 没有检测到 ObservedObject 的变化?

不同布局的旋转 - iOS 4