zoukankan      html  css  js  c++  java
  • iOS边练边学--通知机制和键盘处理小练习

    一、发送通知

    1 NSNotification *note = [NSNotification notificationWithName:@"通知的名称,随便写,例如:你妈叫你回家吃饭" object:self userInfo:@{@"time":@"11:30",
    2         @"desc":@"回家吃饭"
    3                         }];
    4     NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    5     [center postNotification:note];

    二、接收通知:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

    三、键盘处理小练习

      注意事项:tableView的高度约束取消,如果约束在的话,tableView无法实现上移,只能实现往上压缩

      正确做法:设置tableView的高度约束等于父类约束的高度减去最下面工具栏的高度,如图:

      <1>将键盘的显示和隐藏分开处理的情况

      接收通知的代码:

    1 - (void)viewDidLoad {
    2     [super viewDidLoad];
    3     // addObserver-谁来接收 @Selector-接收完成需要执行的方法,带一个参数,接收通知中心发来的NSNotofication对象
    4     // object-发送消息的对象,nil-不管谁发送的,只要是name中的消息都接收,这里监听的是键盘的即将弹出的消息,系统发出的消息是字符串常亮
    5     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    6     // 接收键盘隐藏的通知
    7     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    8 }

      接收到通知后的处理代码:

     1 - (void)keyboardWillShow:(NSNotification *)note
     2 {
     3     // 取出时间
     4     CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
     5     // 取出键盘显示出来后的最终frame
     6     CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
     7     // 改变约束
     8     self.bottomSpacing.constant = rect.size.height;
     9     // 动画效果
    10     [UIView animateWithDuration:duration animations:^{
    11         [self.view layoutIfNeeded];
    12     }];
    13 }
    14 
    15 - (void)keyboardWillHide:(NSNotification *)note
    16 {
    17     // 取出时间
    18     CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    19     // 约束改为0
    20     self.bottomSpacing.constant = 0;
    21     [UIView animateWithDuration:duration animations:^{
    22         [self.view layoutIfNeeded];
    23     }];
    24 }

      <2>将键盘显示和隐藏一起处理的情况

    - (void)viewDidLoad {
        [super viewDidLoad];
        // 接收通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardChange:) name:UIKeyboardWillChangeFrameNotification object:nil];
    }
     1 - (void)keyboardChange:(NSNotification *)note
     2 {
     3     // 取出时间
     4     CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
     5     // 取出键盘最终的frame
     6     CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
     7     self.bottomSpacing.constant = [UIScreen mainScreen].bounds.size.height - rect.origin.y;
     8     [UIView animateWithDuration:duration animations:^{
     9         [self.view layoutIfNeeded];
    10     }];
    11 }
     1 - (void)keyboardChange:(NSNotification *)note
     2 {
     3     // 取出时间
     4     CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
     5     // 取出键盘最终的frame
     6     CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
     7     self.bottomSpacing.constant = [UIScreen mainScreen].bounds.size.height - rect.origin.y;
     8     [UIView animateWithDuration:duration animations:^{
     9         [self.view layoutIfNeeded];
    10     }];
    11 }

    四、最后一步,也是最重要的一步,记得取消注册的通知监听器

    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
  • 相关阅读:
    ES6关于Promise的用法
    JS进阶篇--JS数组reduce()方法详解及高级技巧
    JavaScript常用数组操作方法,包含ES6方法
    揭密 Vue 的双向绑定
    JavaScript(E5,6) 正则学习总结学习,可看可不看!
    利用scons构建project
    cuda核函数再调用核函数,多层并行
    使用微信JSSDK实现图片上传
    android 自己定义水平和圆形progressbar 仅仅定义一些style就能够
    [LeetCode] 035. Search Insert Position (Medium) (C++)
  • 原文地址:https://www.cnblogs.com/gchlcc/p/5301884.html
Copyright © 2011-2022 走看看