(二十四)监听键盘的通知和键盘弹出隐藏的View移动

本文介绍iOS中如何让控制器监听键盘通知,并通过监听键盘动作使整个View跟随键盘移动,包括监听键盘操作的具体实现、键盘退出动作的实现方法以及解决键盘移动过程中出现黑色背景的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

让控制器监听键盘的通知,注意谁监听,谁的dealloc方法中就要remove,如果非ARC还要调用父类的dealloc方法。

//监听键盘的操作:
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
- (void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)keyboardWillChangeFrame:(NSNotification *)note{
    NSLog(@"发送者%@ 内容%@",note.name,note.userInfo);
}
当键盘弹出时,接收到的内容为一个字典:需要注意的是其中的Key都有定义好的NSString,可以直接使用。

{
    UIKeyboardAnimationCurveUserInfoKey = 7;  //动画的执行节奏
    UIKeyboardAnimationDurationUserInfoKey = "0.25"; //动画时长
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 224}}";
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 592}";
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 368}";
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 480}, {320, 224}}";  //键盘的起始位置、尺寸
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 256}, {320, 224}}";    //键盘的结束位置、尺寸
}


键盘退出的动作:滑动tableView实现键盘退出:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
    //退出键盘
    [self.view endEditing:YES];
}

键盘动作时整个View跟着键盘走:

一个细节:由于字典中存放的都是对象,因此字典里的CGRect是封装以后的,用CGRectValue方法解开才是CGRect

//注意,字典里存放的都是对象,要把对象转为CGRect结构体,使用CGRectValue方法。
CGRect InfoKey = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
View随键盘移动的方法实现:注意对象向结构体的解包操作,注意note的成员,有userInfo和Object,二者是分开的。这样设计的视图还会随着键盘的尺寸实时变化。

细节:使用Transform可以方便的实现视图的移动。

- (void)keyboardWillChangeFrame:(NSNotification *)note{
    
    //注意,字典里存放的都是对象,要把对象转为CGRect结构体,使用CGRectValue方法。
    CGRect keyboardFrame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
    
    CGFloat offsetY = keyboardFrame.origin.y - self.view.frame.size.height;
    

    [UIView animateWithDuration:duration animations:^{
        self.view.transform = CGAffineTransformMakeTranslation(0, offsetY);
    }];
    
}
不够协调的时候会看到黑色的原因:

视图控制器在创建时在最底层会有一个Window,默认为黑色。
解决办法之一是改变window的颜色。

AppDelegate中声明了window。

也可以直接在控制器里面改:self.view.window.backgroundColor可以设置窗口颜色,最好和TableView同色。




转载于:https://www.cnblogs.com/aiwz/p/6154229.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值