UIScrollView内容插件不适用于键盘高度

我正在尝试通过键盘隐藏UITextField来移动UIScrollView ,方法是使用显示的contentInsets更改大小。

但是,它不适用于键盘高度。 键盘高度为216,但如果我将iPhone底部插图设置为515(iPhone纵向模式)和310设置为iPhone横向模式,它只会停止在正确位置滚动。 为什么这些尺寸会如此不同? 我不想硬编码这些任意值。

 - (void)viewDidLoad { [super viewDidLoad]; self.view.frame = self.parentViewController.view.frame; [self.textView becomeFirstResponder]; NSLog(@"scrollview: %f,%f, parent: %f,%f", self.view.frame.size.height, self.view.frame.size.width, self.parentViewController.view.frame.size.height, self.parentViewController.view.frame.size.width); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; } - (void)keyboardWasShown:(NSNotification *)notification { if([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone) { // Step 1: Get the size of the keyboard. CGFloat keyboardHeight = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height; // Step 2: Adjust the bottom content inset of your scroll view by the keyboard height. UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardHeight, 0.0); ((UIScrollView*)self.view).contentInset = contentInsets; ((UIScrollView*)self.view).scrollIndicatorInsets = contentInsets; // Step 3: Scroll the target text field into view. CGRect aRect = self.view.frame; aRect.size.height = aRect.size.height - keyboardHeight; if (!CGRectContainsPoint(aRect, self.textView.frame.origin) ) { CGPoint scrollPoint = CGPointMake(0.0, self.textView.frame.origin.y - keyboardHeight); [((UIScrollView*)self.view) setContentOffset:scrollPoint animated:YES]; } } } - (void) keyboardWillHide:(NSNotification *)notification { UIEdgeInsets contentInsets = UIEdgeInsetsZero; ((UIScrollView*)self.view).contentInset = contentInsets; ((UIScrollView*)self.view).scrollIndicatorInsets = contentInsets; } 

编辑:

在键盘打开之前,我打印出来:

 NSLog(@"scrollview: %f,%f, parent: %f,%f", self.view.frame.size.height, self.view.frame.size.width, self.parentViewController.view.frame.size.height, self.parentViewController.view.frame.size.width); 

并打印出这个:

 scrollview: 431.000000,320.000000, parent: 431.000000,320.000000 

我认为主要问题是你需要使用UIKeyboardFrameEndUserInfoKey而不是UIKeyboardFrameBeginUserInfoKey

话虽这么说,我写了一个不同版本的方法,即使滚动视图没有放在屏幕的底部,也可以更好地工作:

请注意,我使用self.activeTextField而不是self.textField

 // Called when the UIKeyboardDidShowNotification is sent. - (void)keyboardWasShown:(NSNotification*)aNotification { // Calculate the frame of the scrollview, in self.view's coordinate system UIScrollView *scrollView = self.scrollView; CGRect scrollViewRect = [self.view convertRect:scrollView.frame fromView:scrollView.superview]; // Calculate the frame of the keyboard, in self.view's coordinate system NSDictionary* info = [aNotification userInfo]; CGRect kbRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; kbRect = [self.view convertRect:kbRect fromView:nil]; // Figure out where the two frames overlap, and set the content offset of the scrollview appropriately CGRect hiddenScrollViewRect = CGRectIntersection(scrollViewRect, kbRect); if (!CGRectIsNull(hiddenScrollViewRect)) { UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, hiddenScrollViewRect.size.height, 0.0); scrollView.contentInset = contentInsets; scrollView.scrollIndicatorInsets = contentInsets; } [self scrollToActiveTextField]; } // Called when the UIKeyboardWillHideNotification is sent - (void)keyboardWillBeHidden:(NSNotification*)aNotification { self.scrollView.contentInset = UIEdgeInsetsZero; self.scrollView.scrollIndicatorInsets = UIEdgeInsetsZero; } - (void)scrollToActiveTextField { if (self.activeTextField) { CGRect visibleRect = self.activeTextField.frame; visibleRect = [self.scrollView convertRect:visibleRect fromView:self.activeTextField.superview]; visibleRect = CGRectInset(visibleRect, 0.0f, -5.0f); [self.scrollView scrollRectToVisible:visibleRect animated:YES]; } } 

将您的scrollView的委托设置为自动,您可以在代码中创建scrollview

  ((UIScrollView*)self.view).delegate=self; 

然后

 - (void)viewDidLoad { [super viewDidLoad]; self.view.frame = self.parentViewController.view.frame; [self.textView becomeFirstResponder]; NSLog(@"scrollview: %f,%f, parent: %f,%f", self.view.frame.size.height, self.view.frame.size.width, self.parentViewController.view.frame.size.height, self.parentViewController.view.frame.size.width); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; } - (void)keyboardWasShown:(NSNotification *)notification { if([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone) { // Step 1: Get the size of the keyboard. CGFloat keyboardHeight = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height; // Step 2: Adjust the bottom content inset of your scroll view by the keyboard height. UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardHeight, 0.0); ((UIScrollView*)self.view).contentInset = contentInsets; ((UIScrollView*)self.view).scrollIndicatorInsets = contentInsets; ((UIScrollView*)self.view).scrollEnabled=YES; } } - (void) keyboardWillHide:(NSNotification *)notification { UIEdgeInsets contentInsets = UIEdgeInsetsZero; ((UIScrollView*)self.view).contentInset = contentInsets; ((UIScrollView*)self.view).scrollIndicatorInsets = contentInsets; [((UIScrollView*)self.view) setContentOffset:CGPointMake(0.0f, 0.0f) animated:TRUE]; ((UIScrollView*)self.view).contentSize = CGSizeMake(((UIScrollView*)self.view).contentSize.width, ((UIScrollView*)self.view).contentSize.height); ((UIScrollView*)self.view).scrollEnabled=NO; } #pragma mark - set scrollView content position -(void)scrollViewToCenterOfScreen:(UIView *)theView { CGFloat theViewY = theView.center.y; CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame]; CGFloat avaliableHeight = applicationFrame.size.height - 300; CGFloat y = theViewY - avaliableHeight / 2.0; if(y<0) y = 0; [((UIScrollView*)self.view) setContentOffset:CGPointMake(0,y) animated:YES]; } #pragma -mark UITextField Delegate methods - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { [self scrollViewToCenterOfScreen:textField]; return YES; } 

现在设置文本字段的委托。 每当textFieldShouldBeginEditing:你的scrollview自动移动它。 scrollViewToCenterOfScreen:方法将您的scrollview位置设置为textfiled位置。

它肯定会设置您的scrollview内容插件以及setContentOffset。 如果您仍然遇到此问题,请告诉我。 谢谢