【发布时间】:2021-03-09 20:21:09
【问题描述】:
我正在尝试重新创建一个简单版本的 iOS 笔记应用程序。请注意,我是一个完整的 Swift 新手。我当前的问题是我希望我的视图在键盘出现时向上移动。我已经实现了一些 可以 执行此操作的代码,但它有一些令人讨厌的错误。它首先将视图向上移动得太高,然后当您开始输入时,视图就在它应该在的位置。这里有一些图片来表示,以及我的代码:
When the keyboard first appears
代码:
class KeyboardResponder: ObservableObject {
@Published var currentHeight: CGFloat = 0
var _center: NotificationCenter
@objc func keyBoardWillShow(notification: Notification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
withAnimation {
currentHeight = keyboardSize.height
print("KEYBOARDSIZE.HEIGHT IN OBSERVER: \(keyboardSize.height)")
}
}
print("KEYBOARD HEIGHT IN OBSERVER: \(currentHeight)")
}
@objc func keyBoardWillHide(notification: Notification) {
withAnimation {
currentHeight = 0
}
}
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)
}
}
首先,有一个 KeyboardResponder 类,用于侦听键盘的出现和消失(带有一个已发布的高度变量)。
VStack {
TextEditor(text: $content).padding(.all).foregroundColor(fontColors[self.color]).font(fontStyles[self.font])
HStack {
Spacer()
Button(action: {
self.show = false
}) {
Text("Cancel").foregroundColor(.gray).font(.headline)
}
Spacer()
Button(action: {
self.showPanel = true
}) {
Image(systemName: "textformat").font(.headline).foregroundColor(.white).padding(.all)
}.background(Color.green).clipShape(Circle())
Spacer()
Button(action: {
self.show.toggle()
self.saveData()
}) {
Text("Save").foregroundColor(Color(UIColor.systemBlue)).font(.headline)
}
Spacer()
}
}.padding(.bottom, keyboardResponder.currentHeight)
这是视图,照片中显示了编辑器。在这个视图的顶部,我有 @ObservedObject var keyboardResponder = KeyboardResponder()。我已经尝试过 .padding(.bottom,keyboardResponder.currentHeight) 以及 .offset(y: -keyboardResponder.currentHeight)。有谁知道怎么回事?
【问题讨论】: