如何在键盘出现时使缩小视图区域中的滚动视图可滚动

时间:2014-09-16 11:55:07

标签: ios objective-c uiscrollview keyboard frame

我已将所有视图嵌入到xib的UIScrollView中。滚动视图内容覆盖状态栏下方的所有屏幕。现在,当点击文本字段时,我可以轻轻地移动scrollview。但我希望它可以完全滚动,直到最底部的视图在键盘上方也可见。此外,当滚动视图滚动到顶部时,它应该到达正常的原始位置。因此,总的来说,我想要一个完全可滚动的功能,如上面提到的滚动视图。

我完成了以下技巧,但没有运气:

技巧1:更改scrollview的高度,使内容超过scrollview高度,因此视图可滚动:

-(void)keyboardWillAppear:(NSNotification *)sender
{
CGFloat y_offset=0;

if([UIScreen mainScreen].bounds.size.height == 480){
    y_offset = 80;
} else {
    y_offset = 70;
}
NSDictionary* userInfo = [sender userInfo];

CGRect keyboardEndFrame;
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];
keyboardHeight = keyboardEndFrame.size.height;

[UIView animateWithDuration:0.5f animations:^{
    [self.view setFrame:CGRectMake(0, - y_offset, self.view.frame.size.width, self.view.frame.size.height)];
}];


[self.loginScrollView setFrame:CGRectMake(self.loginScrollView.frame.origin.x, self.loginScrollView.frame.origin.y, self.loginScrollView.frame.size.width, [UIScreen mainScreen].bounds.size.height - keyboardHeight)];
}

-(void)keyboardWillDisappear:(NSNotification *)sender
{
[UIView animateWithDuration:0.5f animations:^{
    [self.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
}];
[self.loginScrollView setFrame:CGRectMake(self.loginScrollView.frame.origin.x, self.loginScrollView.frame.origin.y, self.loginScrollView.frame.size.width, [UIScreen mainScreen].bounds.size.height)];
}

技巧2:根据其他建议,我更改了UIScrollView的contentInset。

在keyboardWillAppear方法中,我添加了以下代码:

  CGSize kbSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
  UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height+100, 0.0);
  self.loginScrollView.contentInset = contentInsets;
  self.loginScrollView.scrollIndicatorInsets = contentInsets;

在keyboardWillDisappear方法中,我将contentInset设置回零值。

因此,请告诉我是否需要以任何其他方式对此进行排序或在滚动视图框架中进行任何其他可能的更改。此外,如果我打开弹跳功能,即使屏幕上显示我不想要的完整子视图,它也能够反弹。所以基本上我希望它在键盘不存在时冻结,并且当它可用时可滚动到可视区域。那么,给我任何其他建议?提前谢谢。

3 个答案:

答案 0 :(得分:1)

- (void)textFieldDidBeginEditing:(UITextField *)textField

{

[self animateTextField:textField up:YES];

}

- (void)textFieldDidEndEditing:(UITextField *)textField

{

[self animateTextField:textField up:NO];

}

- (void)animateTextField:(UITextField *)textField up:(BOOL)up {

    const int movementDistance = -60; // change this size if you need
    const float movementDuration = 0.3f; // change this size if you need

    int movement = (up ? movementDistance : -movementDistance);

    [UIView beginAnimations: @"animateTextField" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

对我来说很有用

答案 1 :(得分:1)

我真的可以推荐这个库: https://github.com/michaeltyson/TPKeyboardAvoiding

它非常易于使用,适用于ScrollView,TableView和CollectionView!

答案 2 :(得分:1)

从“ scrollView Size == scrollView ContentSize ”的概念角度来看,它不会滚动。为了使其可滚动,我们需要增加 contentSize 。在您的问题中,您需要调整scrollView的 contentSize 以及框架。这可以在您的第一种方法中完成。

对于第二种方法,更改边缘插入将为内容可绘制区域创建一种填充。这可以使底部内容可见,但不会影响 contentSize ,因此视图将无法滚动。