• 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];
    }
  • 相关阅读:
    前端要懂的视频知识DASH协议(建议收藏)
    HTML5 video标签播放视频下载原理
    dash视频服务器本地搭建 (初探)
    纵论WebAssembly,JS在性能逆境下召唤强援
    详解volatile在C++中的作用
    C++ lambda表达式
    Java 从入门到进阶之路(十七)
    Java 从入门到进阶之路(十六)
    Java 从入门到进阶之路(十五)
    Java 从入门到进阶之路(十四)
  • 原文地址:https://www.cnblogs.com/gchlcc/p/5301884.html
Copyright © 2020-2023  润新知