动态监听键盘高度,并进行view的移动(防止遮住textField)

/******************************3月26日9:26am修订版本***********************************/

1、增加累加高度。防止误差。


/******************************3月26日11:07am修订版本***********************************/

1、将UIKeyboardWillShowNotification通知换成UIKeyboardWillChangeFrameNotification。

主要应用到两个监听:

//UIKeyboardWillShowNotification

UIKeyboardWillChangeFrameNotification

UIKeyboardWillHideNotification

并且根据通知里的信息获取键盘高度。


思路大致为:

①、通过监听获取键盘高度,并算出键盘Y值。

②、键盘出现时,遍历子控件,获取textField最大的Y值,与键盘Y值相减获得view需要移动的高度,并记录此高度。

③、键盘消失时,移动记录的高度,使view恢复原样。


#import "HTKeyboardParentViewController.h"
static CGFloat const kDurationKeyboard = 0.3;

@interface HTKeyboardParentViewController ()

- (CGFloat)minKeyboardY:(NSNotification *)notification;
- (CGFloat)maxTextFieldY;

- (void)moveViewUpWithHeight:(CGFloat)height;
- (void)moveViewDownWithHeight:(CGFloat)height;

@end

@implementation HTKeyboardParentViewController
{
    CGFloat _heightHasMoved;
}

#pragma mark - 生命周期
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = COLOR_BACKGROUND_ENTER;
    
    _heightHasMoved = 0;
}


- (void)viewDidDisappear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}


- (void)viewWillAppear:(BOOL)animated
{
    [self registerKeyboradNotification];
}

#pragma mark - 点击背景键盘消失
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}

#pragma mark - 键盘通知
- (void)registerKeyboradNotification
{
//    [[NSNotificationCenter defaultCenter] addObserver:self
//                                             selector:@selector(keyboardWillShow:)
//                                                 name:UIKeyboardWillShowNotification
//                                               object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillHide:)
                                                 name:UIKeyboardWillHideNotification
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillChangeFrame:)
                                                 name:UIKeyboardWillChangeFrameNotification
                                               object:nil];
}

- (void)keyboardWillChangeFrame:(NSNotification *)notification
{
    CGFloat maxTextFieldY = [self maxTextFieldY];
    CGFloat minKeyboardY = [self minKeyboardY:notification];
    if(maxTextFieldY <  minKeyboardY){
        
        return;
    }
    //注意此处由于九宫格和全键盘高度不同,移动的高度需要累加。
    _heightHasMoved += maxTextFieldY - minKeyboardY;
    [self moveViewUpWithHeight:maxTextFieldY - minKeyboardY];
}

//- (void)keyboardWillShow:(NSNotification *)notification
//{
//    
//    CGFloat maxTextFieldY = [self maxTextFieldY];
//    CGFloat minKeyboardY = [self minKeyboardY:notification];
//    if(maxTextFieldY <  minKeyboardY){
//        
//        return;
//    }
注意此处由于九宫格和全键盘高度不同,移动的高度需要累加。
//    _heightHasMoved += maxTextFieldY - minKeyboardY;
//    [self moveViewUpWithHeight:maxTextFieldY - minKeyboardY];
//}

- (void)keyboardWillHide:(NSNotification *)notification
{
    [self moveViewDownWithHeight:_heightHasMoved];
    _heightHasMoved = 0;
}


#pragma mark - 键盘方法
- (CGFloat)minKeyboardY:(NSNotification *)notification
{
    NSDictionary *infoDict = [notification userInfo];
    NSValue *value = [infoDict objectForKey:UIKeyboardFrameBeginUserInfoKey];
    CGRect keyboardFrame = [value CGRectValue];
    
    return (Screen_Height - keyboardFrame.size.height);
}

- (CGFloat)maxTextFieldY
{
    NSArray *subviews = self.view.subviews;
    CGFloat maxViewY = self.view.frame.origin.y;
    
    for ( UIView *subview in subviews) {
       
        
        if([subview isKindOfClass:[UITextField class]]){
            
            CGFloat subviewMaxY = CGRectGetMaxY([self.view convertRect:subview.frame toView:nil]);
            if(maxViewY < subviewMaxY){
                
                maxViewY = subviewMaxY;
            }
        }
    }
    
    return maxViewY;
}
- (void)moveViewUpWithHeight:(CGFloat)height
{
    [self moveViewWithHeight:height _isMoveUp:YES];
}

- (void)moveViewDownWithHeight:(CGFloat)height
{
    [self moveViewWithHeight:height _isMoveUp:NO];
}

- (void)moveViewWithHeight:(CGFloat)moveHeight _isMoveUp:(BOOL)isMoveUp
{
    [UIView animateWithDuration:kDurationKeyboard animations:^{
        CGRect viewFrame = self.view.frame;
        viewFrame.origin.y = viewFrame.origin.y - (isMoveUp?moveHeight:-moveHeight);
        self.view.frame = viewFrame;
    }];
}



监听通知更普遍的做法是在dealloc中移除监听,在viewDidLoad中注册监听。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java 中监听键盘输入可以使用 Scanner 类,例如:Scanner scanner = new Scanner(System.in); String inputString = scanner.nextLine(); ### 回答2: 在Java中,监听键盘可以使用KeyListeners接口或者使用输入事件的适配器类KeyListenerAdapter来实现。 首先,需要创建一个类并实现KeyListeners接口,该接口包含了以下三个方法:keyTyped(KeyEvent e)、keyPressed(KeyEvent e)和keyReleased(KeyEvent e)。这些方法分别在键盘事件发生时被调用。 例如,下面的代码展示了如何监听键盘并在按下和释放键时输出相应的信息: import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class MyKeyListener implements KeyListener { @Override public void keyTyped(KeyEvent e) { // 当有键盘按键被输入时触发 System.out.println("键盘输入:" + e.getKeyChar()); } @Override public void keyPressed(KeyEvent e) { // 当键盘按键被按下时触发 System.out.println("键盘按下:" + e.getKeyChar()); } @Override public void keyReleased(KeyEvent e) { // 当键盘按键被释放时触发 System.out.println("键盘释放:" + e.getKeyChar()); } } 然后,我们需要为监听器注册,以便在应用程序中监听键盘事件。 例如,在主程序中,我们可以通过以下代码注册KeyListener: import javax.swing.JFrame; public class Main { public static void main(String[] args) { JFrame frame = new JFrame(); frame.addKeyListener(new MyKeyListener()); frame.setSize(300, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 在这个例子中,我们创建了一个JFrame窗口,并将我们自定义的监听器添加到窗口上。这样,当窗口获取焦点时,我们就可以监听键盘事件了。 通过上述步骤,我们就能够监听键盘事件并执行相应的操作。 ### 回答3: 在Java中,要监听键盘的输入,可以使用Java的AWT(Abstract Window Toolkit)或者Swing编程来实现。下面是一个使用AWT来监听键盘输入的简单示例: 1. 导入必要的库: ```java import java.awt.*; import java.awt.event.*; ``` 2. 创建一个监听器类,并实现KeyListener接口: ```java class MyKeyListener implements KeyListener { // 实现接口中定义的方法 public void keyPressed(KeyEvent e) { System.out.println("键盘按键被按下"); } public void keyReleased(KeyEvent e) { System.out.println("键盘按键被释放"); } public void keyTyped(KeyEvent e) { System.out.println("键盘按键被输入"); char c = e.getKeyChar(); // 获取输入的字符 System.out.println("输入的字符为: " + c); } } ``` 3. 在主程序中添加监听器并注册: ```java public static void main(String[] args) { // 创建一个窗口 Frame f = new Frame("键盘监听示例"); // 创建一个文本框 TextField tf = new TextField(); // 添加键盘监听器 MyKeyListener listener = new MyKeyListener(); tf.addKeyListener(listener); // 将文本框添加到窗口中 f.add(tf); // 设置窗口大小、可见性等 f.setSize(200, 100); f.setVisible(true); } ``` 以上代码创建了一个简单的窗口,并将一个文本框添加到窗口中。接着创建了一个自定义的监听器类MyKeyListener,并在主程序中将该监听器添加到文本框中。当您在文本框中输入或按下/释放键盘按键时,相应的监听器方法将被调用,输出相应的信息。 请注意,以上示例只是一个简单的演示,实际应用中可能需要更多的处理逻辑和错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值