在iOS9上编辑UITextField时上移键盘

Gan*_*cus 14 objective-c uitextfield ios

为了让我的键盘能够UITextField在我的iOS应用程序中显示,我曾经在iOS7和8上实现了这个答案:https://stackoverflow.com/a/6908258/3855618,它现在已经完美运行了.但是在iOS 9.1上,它不再起作用了.

为了更准确,即使背景视图向上移动,UITextField也不会.

知道自iOS9和iOS 9.1以来发生了什么变化吗?

Ist*_*van 36

不推荐您链接的答案.您不应直接设置视图控制器视图的框架,尤其是在使用自动布局时.您应该将滚动视图作为子视图添加到视图中,而不是更改视图的框架,并在显示或隐藏键盘时调整内容插入.

来自官方的苹果文件:

当系统要求您显示键盘时,系统会将其从屏幕底部滑入,并将其放在应用内容上.因为它位于您的内容之上,所以键盘可以放在用户想要编辑的文本对象的顶部.发生这种情况时,您必须调整内容以使目标对象保持可见.

调整内容通常涉及暂时调整一个或多个视图的大小并对其进行定位,以使文本对象保持可见.使用键盘管理文本对象的最简单方法是将它们嵌入到UIScrollView对象(或其子类之一,如UITableView)中.显示键盘时,您所要做的就是重置滚动视图的内容区域并将所需的文本对象滚动到位.因此,响应UIKeyboardDidShowNotification,您的处理程序方法将执行以下操作:

  1. 获取键盘的大小.
  2. 按键盘高度调整滚动视图的底部内容插入.
  3. 将目标文本字段滚动到视图中.
 // Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
   NSDictionary* info = [aNotification userInfo];
   CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

   UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
   scrollView.contentInset = contentInsets;
   scrollView.scrollIndicatorInsets = contentInsets;

   // If active text field is hidden by keyboard, scroll it so it's visible
   // Your app might not need or want this behavior.
   CGRect aRect = self.view.frame;
   aRect.size.height -= kbSize.height;
   if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
     [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
   }
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
   UIEdgeInsets contentInsets = UIEdgeInsetsZero;
   scrollView.contentInset = contentInsets;
   scrollView.scrollIndicatorInsets = contentInsets;
}
Run Code Online (Sandbox Code Playgroud)


Swi*_*ect 8

零行代码

缺乏黑客,kludges,变通方法和听众.

自iOS时代开始以来,一直在问这个问题.StackOverflow上的答案没有超过2次iOS迭代.这是正确的,因为UIKit不断从脚下变换.存在一种设计,而不是对这个古老问题的实现解决方案.用一个UITableViewController.

使用UITableViewController

当a UITableView由a UITableViewController管理时,会自动为您管理滚动.再也不要修补UIKeyboardWillShowNotification了.UITableViewCells只需创建静态或动态来布局界面,添加UITextViewUITextField根据需要; 仅仅成为第一响应者将滚动正确的位置.

@availability(iOS,介绍= 2.0)

的UITableViewController

笔记

  1. 从2.0开始适用于所有iOS.
  2. 引用:«浪费时间优化一个糟糕的算法; 选一个更好的»
  3. 请参阅/sf/answers/2267365551/.


Var*_*ria 1

在 UIScrollView 上添加所有 UITextField 并使用TPKeyboardAvoiding