用xib做scrollView的键盘自适应以及自动布局

来源:互联网 发布:淘宝大学 vip课退款 编辑:程序博客网 时间:2024/04/29 15:55

首先,拖进来一个scrollView

这里写图片描述

然后对这个scrollView设置上下左右的约束

这里写图片描述

接着,拖进来一个UIView

这里写图片描述

设置这个view的上下左右约束

这里写图片描述

然后要设置这个view的滚动方向,我是让他垂直滚动,所以选中下面这个,如果垂直水平方向都滚动那么久都不用选了,设置一下view的宽高就行

这里写图片描述

然后很关键的一步就是,因为你设置的是上下滚动,你就要再设置一下他的高度,他才知道他在什么范围内滚动。

这里写图片描述

酱紫就大功告成了

这里写图片描述

下面我们说一下关于键盘的自适应

这个键盘自适应一般都是指监听文本框的输入然后不让键盘遮挡住文本框。所以呢,先要将文本框的代理设置为file‘s owner,遵守UITextFieldDelegate协议,监听键盘弹出和隐藏

先注册监听

  • (void)viewWillAppear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:self.view.window];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
    }

之后别忘了对称的移除监听

  • (void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
    }

然后根据键盘的frame设置scrollView的frame

  • (void)keyboardDidShow:(NSNotification *)notification {
    if (self.keyboardIsShown) {
    return ;
    }
    NSDictionary *info = [notification userInfo];
    NSValue *value = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardRect = [self.view convertRect:[value CGRectValue] fromView:nil];

    CGRect viewFrame = [self.scrollView frame];

    viewFrame.size.height -= keyboardRect.size.height;
    self.scrollView.frame = viewFrame;
    CGRect textFieldRect = [self.currentTextField frame];
    [self.scrollView scrollRectToVisible:textFieldRect animated:YES];
    self.keyboardIsShown = YES;
    }

-(void)keyboardDidHide:(NSNotification *)notification{
self.keyboardIsShown = NO;
}

然后实现UITextField的代理方法

  • (void)textFieldDidBeginEditing:(UITextField *)textField {
    self.currentTextField = textField;
    }

  • (void)textFieldDidEndEditing:(UITextField *)textField {
    self.currentTextField = nil;
    }

  • (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
    }

搞定了

0 0