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同色。




  • 相关阅读:
    windwos8.1英文版安装SQL2008 R2中断停止的解决方案
    indwows8.1 英文版64位安装数据库时出现The ENU localization is not supported by this SQL Server media
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    SQL数据附加问题
    eclipse,myeclipse中集合svn的方法
    JAVA SSH 框架介绍
    SSH框架-相关知识点
    SuperMapRealSpace Heading Tilt Roll的理解
    SuperMap iserver manage不能访问本地目的(IE9)
    Myeclipse中js文件中的乱码处理
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154229.html
Copyright © 2011-2022 走看看