zoukankan      html  css  js  c++  java
  • (二十四)监听键盘的通知和键盘弹出隐藏的View移动

    让控制器监听键盘的通知,注意谁监听,谁的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同色。




  • 相关阅读:
    [Oracle]跨越 DBLINK 访问表时,数据缓存在何处的Data Buffer 中?
    [Oracle]查看数据是否被移入 DataBuffer 的方法
    [Oracle]如何为数据库设置Event(eg: ORA-00235)
    [Oracle][Corruption]究竟哪些检查影响到 V$DATABASE_BLOCK_CORRUPTION
    [Oracle]OpenVMS 运行 Oracle 时的推荐值
    [Oracle]System 表空间的文件丢失
    [Oracle]如果误删了某个数据文件,又没有被备份,能否恢复?
    OFS环境,删除Resource 时出现错误失败,应该如何继续
    基于酷Q的工作秘书机器人
    C++编写简单的俄罗斯方块游戏
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154229.html
Copyright © 2011-2022 走看看