键盘偏移在 SwiftUI 2 中不再起作用

Posted

技术标签:

【中文标题】键盘偏移在 SwiftUI 2 中不再起作用【英文标题】:Keyboard offset no longer functions in SwiftUI 2 【发布时间】:2021-01-19 13:50:32 【问题描述】:

所以我有一个 ObservableObject 将发布的变量 'currentHeight' 设置为键盘的高度:

import Foundation
import SwiftUI

class KeyboardResponder: ObservableObject 

@Published var currentHeight: CGFloat = 0

var _center: NotificationCenter

init(center: NotificationCenter = .default) 
    _center = center
    _center.addObserver(self, selector: #selector(keyBoardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    _center.addObserver(self, selector: #selector(keyBoardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)


@objc func keyBoardWillShow(notification: Notification) 
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue 
        withAnimation 
           currentHeight = keyboardSize.height
        
    
    print("the KEYBOARD HEIGHT IS \(self.currentHeight)")


@objc func keyBoardWillHide(notification: Notification) 
    withAnimation 
       currentHeight = 0
    
    print("the KEYBOARD HEIGHT IS \(self.currentHeight)")


在我的其他视图中,我创建了一个 ObservedObject keyboardResponder,然后在视图主体内,我将有一些设置垂直偏移的视图:

struct ViewName: View 
    @ObservedObject var keyboardResponder = KeyboardResponder()
    var body: some View 
        GeometryReader  proxy in 
            VStack 
                Text("this should be offset")
                .offset(y: -keyboardResponder.currentHeight)
            .edgesIgnoringSafeArea(.all)
        
    

在 Xcode 12/SwiftUI 2 下降之前,这就像一个魅力,但我认为他们改变了视图的刷新方式——任何人都知道他们改变了什么以及是否有解决我的问题的方法?

编辑:在我看来,如果我删除了 edgeIgnoringSafeArea(.all),它会起作用,但很奇怪。从本质上讲,视图只能向上移动到所有视图都在框架内的点,它不允许整个视图向上移动(和屏幕视图之外)......我会扔一个视频来展示什么我的意思是……

这是当有更多元素占据大部分屏幕时的链接(因此偏移量非常小)

https://youtu.be/jpID11-rZDs

这是元素较少时的链接,因此偏移量会变得更大

https://youtu.be/MjqX1qDEA6E

如果 GeometryReader 封闭了视图,那就真的会破坏它并完全阻止它响应。如果我删除它,那么它会根据需要运行...

【问题讨论】:

通知处理程序中的打印语句是否被调用?如果是这样,还为keyboardSize 添加一个打印语句,看看它是否从零开始变化。 @CenkBilgen 确实调用了 print 语句,它打印出 currentHeight 的正确值,因此keyboardSize 必须改变...... 但是为了确保在调用时发生了变化,请打印出两个 - 来自通知 keyboardHeight 的本地值和 if let 展开块内的状态 currentHeight。因为一个潜在的问题可能是 NSValue 演员表。另外,如果您删除动画并直接设置它会发生什么? @CenkBilgen 我在两个地方都打印了(在设置 currentHeight 之后和该块之外)并且它正确设置了值。如果我删除动画,它不会改变任何东西 它总是会为 currentHeight 打印一些东西。从通知中提取的值,即keyboardHeight 或当前值。所以打印keyboardHeight或两者都更重要。 【参考方案1】:

在最新的 Swift、Xcode 12 和 ios14 中,我注意到它是标准内置的,当输入时文本字段不可见。屏幕随着键盘高度上升并显示原始字段。例如,尝试使用可滚动视图和 20 个文本字段。 也许你可以摆脱你的observableheight 并且不用硬编码就可以做到。

【讨论】:

我编辑了原始帖子,它具有 .edgesIgnoringSafeArea(.all) 是由于某种原因导致偏移量不起作用,我不知道为什么。 这个问题也是由使用 GeometryReader 封闭具有偏移量的事物引起的

以上是关于键盘偏移在 SwiftUI 2 中不再起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有日期的 Docker 标记在 Gitlab 中不再起作用

用于截取整个 UITableView 的代码在 iOS 13 中不再起作用

用户创建的警告在 XCode 7.1 中不再起作用。有替代方案吗? [复制]

指针偏移在 memset 中不起作用?

MR_importFromObject 方法在 XCode 7.1 beta (Swiftui 2.0) 中不起作用

SwiftUI:为啥 ObservedObject 在 AppDelegate 中不起作用?