我有一个UIViewController,我有一个UIScrollView里面有几个UITextFields。我从苹果那里得到了一段似乎从键盘下方移动内容的代码。
- (void)keyboardWasShown:(NSNotification *)notification
{
// Step 1: Get the size of the keyboard.
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
// Step 2: Adjust the bottom content inset of your scroll view by the keyboard height.
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0);
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
// Step 3: Scroll the target text field into view.
CGRect aRect = self.view.frame;
aRect.size.height -= keyboardSize.height;
if (!CGRectContainsPoint(aRect, self.firstResponder.frame.origin) ) {
CGPoint scrollPoint = CGPointMake(0.0, self.firstResponder.frame.origin.y - (keyboardSize.height-10));
[self.scrollView setContentOffset:scrollPoint animated:YES];
}
}
我的UIScrollView是320x416,因为我有一个导航栏。我的键盘还有44个像素,因为我正在添加一个UIToolBar,所以代码并没有真正起作用。我尝试了各种配置来解决两个问题:
更新:这有效,但我很确定是错的,如果是对的,我不知道为什么,对我来说没有意义。有人可以解决/解释吗?
- (void)keyboardWasShown:(NSNotification *)notification
{
// Step 1: Get the size of the keyboard.
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
// Step 2: Adjust the bottom content inset of your scroll view by the keyboard height.
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height + 44.0f, 0.0);
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
// Step 3: Scroll the target text field into view.
CGRect aRect = self.view.frame;
aRect.size.height -= keyboardSize.height + 44.0f;
if (!CGRectContainsPoint(aRect, self.firstResponder.frame.origin) ) {
CGPoint scrollPoint = CGPointMake(0.0, self.firstResponder.frame.origin.y - (keyboardSize.height-10.0f - 44.0f - 44.0f - 44.0f));
[self.scrollView setContentOffset:scrollPoint animated:YES];
}
}
UPDATE1:还有另一个错误,我在UIToolBar中有一个上一个按钮,如果我点击最后一个文本字段,滚动视图会上升,如果我移回第一个文本视图,它位于视图之外,因为滚动视图不会向下滚动。
答案 0 :(得分:1)
尝试将工具栏高度添加到计算中,
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height + 44.0f, 0.0);
也是,
aRect.size.height = aRect.size.height - keyboardSize.height - 44.0f;
答案 1 :(得分:1)
我尝试过与编辑部分相同的方法,但对if条件略有改动:
!CGRectContainsRect(aRect, self.firstResponder.frame)
这可能有助于您解决只有原点位于键盘上方的问题,但文本字段已被覆盖。
答案 2 :(得分:0)
在尝试了很多修复苹果解决方案的问题后,我在描绘了苹果代码背后的一般概念之后,最终自己编写了一些代码。顺便说一下,我认为苹果代码使问题复杂化并且实际上并不起作用。
- (void)textFieldDidBeginEditing:(UITextField*)textField {
self.firstResponder = textField;
if (self.firstResponder.frame.origin.y + self.firstResponder.frame.size.height > self.view.bounds.size.height - (216 + 44)) {
double fix = (self.firstResponder.frame.origin.y + self.firstResponder.frame.size.height) - (self.view.bounds.size.height - (216 + 44)) + 10;
CGRect rect = CGRectMake(0, -fix, self.view.frame.size.width, self.view.frame.size.height);
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
self.view.frame = rect;
[UIView commitAnimations];
} else if (self.firstResponder.frame.origin.y + 10 < -self.view.frame.origin.y) {
double fix = -self.view.frame.origin.y - (-self.view.frame.origin.y - self.firstResponder.frame.origin.y) - 10;
CGRect rect = CGRectMake(0, -fix, self.view.frame.size.width, self.view.frame.size.height);
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
self.view.frame = rect;
[UIView commitAnimations];
}
}