zoukankan      html  css  js  c++  java
  • iOS 解决表单被键盘遮住的问题

    问题

    处理表单的时候,一定会碰到的就是输入控件被键盘遮住的问题,如图:

    实例实例

    左边是普通表单,中间是2B表单,右边是文艺表单.

    分析

    处理这种问题无非就是2个步骤:

    1. 键盘弹出时,缩小UITableViewframe
    2. 滚动UITableView,让当前输入的控件可见

    代码写出来就是这几步

    1. 捕获键盘事件
    2. 计算键盘高度并调整UITableViewframe
    3. 获取当前正在输入的控件
    4. 计算其在UITableView中的位置,并滚动到其位置让其可见

    那么如何一步一步的来实现这些步骤呢?

    捕获键盘事件

    捕获键盘事件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(actionKeyboardShow:)
    name:UIKeyboardDidShowNotification
    object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(actionKeyboardHide:)
    name:UIKeyboardWillHideNotification
    object:nil];

    - (void)actionKeyboardShow:(NSNotification *)notification
    {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidChangeFrameNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(actionKeyboardShow:)
    name:UIKeyboardDidChangeFrameNotification
    object:nil];

    }

    - (void)actionKeyboardHide:(NSNotification *)notification
    {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidChangeFrameNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(actionKeyboardShow:)
    name:UIKeyboardDidShowNotification
    object:nil];
    }

    计算键盘高度并调整UITableViewframe

    计算键盘高度并调整UITableView的frame

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    - (void)actionKeyboardShow:(NSNotification *)notification
    {
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size
    self.tableView.frame = CGRectMake(0, 0, 320, self.view.h-keyboardSize.height);

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidChangeFrameNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(actionKeyboardShow:)
    name:UIKeyboardDidChangeFrameNotification
    object:nil];

    }

    获取当前正在输入的控件

    这里得说一句,普通程序员一般是这样来获取的

    UIView的Category

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    - (UIView *) getFirstResponder
    {
    if (self.isFirstResponder) {
    return self;
    }

    for (UIView *subView in self.subviews) {
    UIView *firstResponder = [subView getFirstResponder];
    if (firstResponder != nil) {
    return firstResponder;
    }
    }

    return nil;
    }

    虽然没错,但是文艺程序员应该这样来获取

    UIResponder的Category

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    static __weak id currentFirstResponder;

    +(id)currentFirstResponder {
    currentFirstResponder = nil;
    [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:nil forEvent:nil];
    return currentFirstResponder;
    }

    -(void)findFirstResponder:(id)sender {
    currentFirstResponder = self;
    }

    同理,有时候我们需要让键盘消失,那么也有三种做法可以选择

    1
    2
    3
    4
    5
    [someView resignFirstResponder];

    [self.view endEditing:YES];

    [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

    如何选择呢? It’s up to U.

    计算其在UITableView中的位置,并滚动到其位置让其可见

    计算其在UITableView中的位置,并滚动到其位置让其可见

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    - (void)actionKeyboardShow:(NSNotification *)notification
    {
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
    self.tableView.frame = CGRectMake(0, 0, 320, self.view.h-keyboardSize.height);

    UIView *v = [UIResponder currentFirstResponder];

    if ( v )
    {
    while ( ![v isKindOfClass:[UITableViewCell class]]) {
    v = v.superview;
    }

    UITableViewCell *cell = (UITableViewCell*)v;

    [self.tableView scrollToRowAtIndexPath:[self.tableView indexPathForRowAtPoint:cell.center] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    }

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidChangeFrameNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(actionKeyboardShow:)
    name:UIKeyboardDidChangeFrameNotification
    object:nil];

    }
  • 相关阅读:
    腾讯云环境配置之PHP5.6.3 + redis扩展 稳定版
    越狱后的ios如何用apt-get 安装各种命令
    批量 kill mysql 中运行时间长的sql
    谷歌Chrome浏览器开发者工具的基础功能
    话说好像是这样,ios下面通常用iframe来打开你的scheme地址; Android下通常用location.href来。。。 不过实际情况好像比这个复杂得多。。
    js判断移动端是否安装某款app的多种方法
    设计不错的网站
    BADIP filter
    开窗函数 函数() OVER()
    2018年1月初的一次面试题
  • 原文地址:https://www.cnblogs.com/jgCho/p/5265497.html
Copyright © 2011-2022 走看看