• 获得键盘高度以及UITableView中多个UITextField时UITableView的滚动和键盘的隐藏


    1.获得键盘高度

     (UIView *)keyboardViewNotepad;
    {
            NSArray *windows = [self windows];
            for (UIWindow *window in [windows reverseObjectEnumerator])
            {
                    for (UIView *view in [window subviews])
                    {
                            if (!strcmp(object_getClassName(view), "UIPeripheralHostView") || !strcmp(object_getClassName(view), "UIKeyboard"))
                            {
                                    return view;
                            }
                    }
            }
            
            return nil;
    }

    得到UIView *keyboardView = [**** keyboardViewNotepad];

    UITableView中多个UITextField时,编辑textfield 时 UITableView 自动滚动到当前textfield 可见的行即不被键盘遮住,及键盘的显示和隐藏的问题

    1、 采用 NSNotificationCenter 方式

    在 .h 文件中 添加两个变量后面会用到

    int keyboardHeight;
    BOOL keyboardIsShowing;

    @property (nonatomic, retain) UITextField *currentTextField;

    在.m 文件里
    @synthesize currentTextField = _currentTextField;

    首先,在你的viewWillAppear:订阅到键盘上的通知,让你知道什么时候键盘会显示和隐藏,系统会告诉你的键盘大小,但是不要忘记注销您的viewWillDisappear:

    - (void)viewWillAppear:(BOOL)animated
    {
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    }

    - (void)viewWillDisappear:(BOOL)animated
    {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    }

    实现方法类似下面这样你调整你曾经为tableView匹配的键盘显示可视面积的大小。不要忘了执行keyboardWillHide:

    -(void) keyboardWillShow:(NSNotification *)note {

    CGRect keyboardBounds;

    [[note.userInfo valueForKey:UIKeyboardWillShowNotification] getValue: &keyboardBounds];

    keyboardHeight = keyboardBounds.size.height;

    if (keyboardIsShowing == NO) {

    keyboardIsShowing = YES;
    CGRect frame = self.view.frame;
    frame.size.height -= keyboardHeight;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3f];
    self.view.frame = frame;
    [UIView commitAnimations];
    }
    }

    - (void)keyboardWillHide:(NSNotification*)notification {

    if (!keyboardIsShowing) {
    return;
    }

    NSDictionary* userInfo = [notification userInfo];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];

    //CGRect rect = self.view.bounds;
    //self.tableView.frame = CGRectMake(0, 0, 320, 416);
    NSValue *value = [userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey];
    CGSize keyboardSize = [value CGRectValue].size;
    CGRect viewFrame = self.view.frame;
    viewFrame.size.height +=keyboardSize.height;
    keyboardIsShowing = NO;
    [UIView commitAnimations];
    }

    - (void)textFieldDidBeginEditing:(UITextField *)textField
    {
    self.currentTextField = textField;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *) [self.tableView viewWithTag:self.currentTextField.tag]];

    UITableViewCell *cell = (UITableViewCell *) [textField superview];
    indexPath = [self.tableView indexPathForCell:cell];
    //[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
    //int currentIndex = textField.tag;
    CGRect frame = textField.frame;
    CGFloat rowHeight = self.tableView.rowHeight;
    //下面的代码只是为了判断是哪一个textField,可以根据自己的情况进行修改,我为了测试加了7个
    if (indexPath.row == 0) {
    frame.origin.y += rowHeight * 0;
    } else if (indexPath.row==1) {
    frame.origin.y += rowHeight * 1;
    } else if (indexPath.row == 2) {
    frame.origin.y += rowHeight * 2;
    } else if (indexPath.row ==3){
    frame.origin.y += rowHeight * 3;
    }else if(indexPath.row==4)
    {
    frame.origin.y +=rowHeight *4;
    } else if(indexPath.row==5)
    {
    frame.origin.y +=rowHeight *5;
    } else if(indexPath.row==6)
    {
    frame.origin.y +=rowHeight *6;
    }
    CGFloat viewHeight = self.tableView.frame.size.height;
    CGFloat halfHeight = viewHeight / 2;
    CGFloat halfh= frame.origin.y +(textField.frame.size.height / 2);

    if(halfh<halfHeight){
    frame.origin.y = 0;
    frame.size.height =halfh;
    }else{
    frame.origin.y =halfh;
    frame.size.height =halfh;
    }
    [self.tableView scrollRectToVisible:frame animated:YES ];
    }

    点击done(完成)按钮关闭键盘,可以在UIControlEventEditingDidEndOnExit 响应事件

    [textField addTarget:self action:@selector(textFieldDoneEditing:) forControlEvents:UIControlEventEditingDidEndOnExit];

    -(IBAction)textFieldDoneEditing:(id)sender
    {
    self.currentTextField = (UITextField *)sender;
    [self.currentTextField resignFirstResponder];
    [sender resignFirstResponder];
    //[self.tableView scrollRectToVisible:self.currentTextField.frame animated:YES];
    }

    2、采用 scrollToRowAtIndexPath

    点击done(完成)按钮关闭键盘,可以在UIControlEventEditingDidEndOnExit 响应事件

    [textField addTarget:self action:@selector(textFieldDoneEditing:)forControlEvents:UIControlEventEditingDidEndOnExit];

    -(IBAction)textFieldDoneEditing:(id)sender
    {
    self.currentTextField = (UITextField *)sender;
    [self.currentTextField resignFirstResponder];
    [sender resignFirstResponder];
    [self.tableView scrollRectToVisible:self.currentTextField.frame animated:YES];
    }

    - (void)textFieldDidBeginEditing:(UITextField *)textField

    {
    self.currentTextField = textField;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *) [self.tableView viewWithTag:self.currentTextField.tag]];

    //这里要看textField 是直接加到cell 上的还是加的 cell.contentView上的

    //直接加到cell 上

    UITableViewCell *cell = (UITableViewCell *) [textField superview];
    indexPath = [self.tableView indexPathForCell:cell];

    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

    }

     
  • 相关阅读:
    设计模式(六)—原型模式Prototype(创建型)
    hdu_2039_三角形_解题报告
    古代赌局 俗话说:十赌九输。因为大多数赌局的背后都藏有阴谋。不过也不尽然,有些赌局背后藏有的是:“阳谋”。 有一种赌局是这样的:桌子上放六个匣子,编号是1至6。多位参与者(以下称玩家)可以把
    读《Boost程序库完全开发指南》
    使用HttpSessionListener接口监听Session的创建和失效
    HDU2317:Nasty Hacks
    意淫的需求要不得
    enumerate(s)与range(len(s))的作用是相同
    一种数据展示方式,UI设计新颖,供大家参考(源码部分) (demo已经上传)
    RMAN Compressed Backupset
  • 原文地址:https://www.cnblogs.com/Cristen/p/2784985.html
Copyright © 2020-2023  润新知