Здесь SSCCE ,
package experiment;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class KeyListenerTester extends JFrame implements KeyListener {
JLabel label;
public KeyListenerTester(String s) {
super(s);
JPanel p = new JPanel();
label = new JLabel("Key Listener!");
p.add(label);
add(p);
addKeyListener(this);
setSize(200, 100);
setVisible(true);
}
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
System.out.println("Right key typed");
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("Left key typed");
}
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
System.out.println("Right key pressed");
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("Left key pressed");
}
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
System.out.println("Right key Released");
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("Left key Released");
}
}
public static void main(String[] args) {
new KeyListenerTester("Key Listener Tester");
}
}
Дополнительно читайте по этим ссылкам: Как написать прослушиватель клавиш и ] Как использовать привязки клавиш
При преобразовании кадра клавиатуры следует передать nil
параметру from
. Это правильно преобразует из оконных координат (как указано в документации UIView convert
).
Ваш код также будет проще, если вы избежите всего кодирования Objective-C.
private func keyboardWillShow(_ aNotification: Notification) {
guard let info = aNotification.userInfo,
let endFrame = info[UIWindow.keyboardFrameEndUserInfoKey] as? NSValue,
let rate = info[UIWindow.keyboardAnimationDurationUserInfoKey] as? NSNumber
else { return }
let currentKeyboard = endFrame.cgRectValue
let convertedFrame = self.view.convert(currentKeyboard, from: nil)
bottomConstraint.constant = self.view.frame.height - convertedFrame.origin.y
UIView.animate(withDuration: rate.doubleValue) {
self.view.layoutIfNeeded()
}
}