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];
}

 

posted @ 2016-03-21 14:41  Chaos_G  阅读(305)  评论(0编辑  收藏  举报