所以我基本上有一个表单,由几个文本字段组成.用户像往常一样键入字段.但用户还可以选择双击文本字段,该文本字段提供了模态视图控制器,允许用户从与该字段相关的多个选项中进行选择. 
  
 
我可以以某种方式呈现模式“over”键盘,这样当它被关闭时,键盘仍然是活动的领域的第一反应者之前,我提出了模态?
现在,模态出现时,键盘解除关闭,并随着模式被关闭而重新出现.它对我来说看起来很笨重,分心.喜欢简化它,并减少屏幕上的动画数量.
解决方法
 您可以创建一个新的UIWindow并将其放在默认窗口上.使用这种技术,键盘仍然在那里,但它隐藏在新窗口后面. 
  
 
        我在Github here上有一个示例项目,但基本过程如下.
>为您的模态视图创建一个新的UIViewController类.我打电话给我的OverlayViewController.根据需要设置相应的视图.根据您的问题,您需要传回一些选项,所以我做了一个委托协议OverlayViewController,并将使主窗口的根视图控制器(ViewController类)成为我们的委托.
@protocol OverlayViewControllerDelegate <NSObject> @required - (void)optionChosen:(int)option; @end @interface OverlayViewController : UIViewController @property (nonatomic,weak) id<OverlayViewControllerDelegate> delegate; @end
>为我们的原始视图控制器添加一些支持属性.
@interface ViewController () <UIGestureRecognizerDelegate,UITextFieldDelegate,OverlayViewControllerDelegate> // The text field that responds to a double-tap. @property (weak) IBOutlet UITextField *textField; // A simple label that shows we received a message back from the overlay. @property (weak) IBOutlet UILabel *label; // Gesture recognizer for the text field @property (strong) UITapGestureRecognizer *doubleTapRecognizer; // The window that will appear over our existing one. @property (strong) UIWindow *overlayWindow; @end
>将UITapGestureRecognizer添加到您的UITextField.
- (void)viewDidLoad {
    [super viewDidLoad];
    // Perform any setup you need here
    // ...
    self.doubleTapRecognizer = [[UITapGestureRecognizer alloc]
                                 initWithTarget:self
                                 action:@selector(handleDoubleTap)];
    self.doubleTapRecognizer.numberOfTapsrequired = 2;
    self.doubleTapRecognizer.delegate = self;
    [self.textField addGestureRecognizer:self.doubleTapRecognizer];
} 
 > UITextField具有内置的手势识别器,因此我们需要允许多个UIGestureRecognizer同时操作.
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
} 
 >这是有趣的部分.触发手势识别器时,创建新的UIWindow,将您的OverlayViewController分配为根视图控制器,并显示它.请注意,我们将窗口级别设置为UIWindowLevelAlert.你不能在这里使用UIWindowLevelnormal,因为键盘仍然在前面.
- (void)handleDoubleTap {
    self.overlayWindow = [[UIWindow alloc] initWithFrame:self.view.window.frame];
    [self.overlayWindow setwindowLevel:UIWindowLevelAlert];
    OverlayViewController *overlayVC = [[OverlayViewController alloc] initWithNibName:@"OverlayViewController" bundle:nil];
    self.overlayWindow.rootViewController = overlayVC;
    overlayVC.delegate = self;
    [self.overlayWindow makeKeyAndVisible];
} 
 >覆盖窗口现在覆盖原始窗口和键盘.用户现在可以选择您在叠加层视图中构建的任何选项.在您的用户选择一个选项后,您的委托应该采取您打算的任何操作,然后关闭覆盖窗口.
- (void)optionChosen:(int)option {
    // Your code goes here. Take action based on the option chosen.
    // ...
    // dismiss the overlay
    self.overlayWindow = nil;
} 
 >覆盖窗口应该消失,原来的窗口应该与键盘的位置相同.