zoukankan      html  css  js  c++  java
  • iOS-键盘常见处理,自定义键盘上的工具条、定义键自盘方法等

    场景一说明

    在iOS开发中,我们经常处理这样的情况:

    当键盘出现或者消失的时候,我们需要做一些相应的操作。比如键盘上面的工具条的位置变化等。

    这里我们就假设有一个工具条在键盘的上面,我们要求当键盘出现的时候,工具条的位置向上移动始终在键盘的上面,当键盘消失的时候,工具条向下移动到屏幕的下面。

    这时候,我们应该怎么处理呢?

    思路

    • 为了让工具条上下移动,我们就要求出键盘上下移动的高度值,从而知道工具条该上下移动的高度值
    • 想获取键盘的移动值,就要对键盘的显示和隐藏进行监听,我们这里可以使用通知

    是不是觉得思路很清晰了,那么开始吧。

    处理步骤

    • 1、给键盘设一个通知
    /**
         *  给键盘的frame改变添加监听
         *  @param keyBoardWillChangeFrame: 监听方法
         */
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyBoardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
    
    • 2、在键盘的通知监听方法里面做需要的操作
    
      - (void)keyboardWillChangeFrame:(NSNotification *)notification
    {
        // 键盘显示隐藏完毕的frame
        CGRect frame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
        // 修改底部约束
        self.bottomSapce.constant = XMGScreenH - frame.origin.y;
        // 动画时间
        CGFloat duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
        // 动画
        [UIView animateWithDuration:duration animations:^{
            [self.view layoutIfNeeded];
        }];
    }
    

    上一段代码解释:

    notification.userInfo:

    • notification是指传递过来的通知
    • userInfo是一个字典,存储任何和通知相关联的可能用到的信息。当一个通知的值发生改变的时候,就会将值存储到userInfo的字典中。例如这里的userInfo包含通知执行的时间,和通知结束时候键盘的frame等信息。
    • 也可以改变工具条的transform实现:
        self.toolbar.transform = CGAffineTransformMakeTranslation(0, -keyboardF.size.height);
    

    自定义键盘,只需要设置下面的属性即可

    @property (readwrite, retain) UIView *inputView;
    

    最后,一定要记得在dealoc方法里释放监听

    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    

    场景二说明

    有时候在同一个界面里面,可能有多个TextField输入框,而点击不同额输入框,我们可能希望弹出的键盘拥有不同的工具条,这时候我们怎么办呢?

    思路

    • 首先我们要有那么几种工具条,可以使用xib方式(简单,不讲解了了,不知道可以发邮件给我)
    • 然后设置不同输入框的配件视图(textField.inputAccessoryView = xxxTool)
    • 设置输入框成为第一响应者,这样弹出的时候就能有不同的toolBar了。

    代码实现

    //这里不贴图了,比较简单
    UIView *tool1 = [[[NSBundle mainBundle] loadNibNamed:@"ToolBar1" owner:nil options:nil] lastObject];
    UIView *tool2 = [[[NSBundle mainBundle] loadNibNamed:@"ToolBar2" owner:nil options:nil] lastObject];
    self.textField1.inputAccessoryView = tool1;
    self.textField2.inputAccessoryView = tool2;
    

    常用知识点:

    成为第一响应者(可以调出键盘)

    - (BOOL)becomeFirstResponder;
    

    取消第一响应者

    - (BOOL)resignFirstResponder;
    

    全部取消第一响应者

    - (BOOL)endEditing:(BOOL)force;    //使用这个使得view或者其所有的子视图都取消第一响应者 (optionally force)
    
  • 相关阅读:
    android开发(1) 登录界面的布局演示
    android开发(5) 动态生成控件
    android开发(6) 初遇handler
    android开发(2) 九宫格的实现
    android开发(8) 选项卡的切换
    android开发(9) 渐变动画演示(Tween Animation)
    android开发(8) 使用ViewFlipper来用手势切换画面
    css textarea固定大小不显示滚动条
    css zindex
    js ie input onchange事件兼容BUG
  • 原文地址:https://www.cnblogs.com/66it/p/4756375.html
Copyright © 2011-2022 走看看