让控制器监听键盘的通知,注意谁监听,谁的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]; }
一个细节:由于字典中存放的都是对象,因此字典里的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同色。