Edición de límites de UIView al presentar oculta el keyboard en iOS 8

UIViewController un pequeño "inicio de session" UIViewController como un UIModalPresentationFormSheet con límites personalizados. En el método viewWillLayoutSubviews , cambio el tamaño de la vista a (300,250). Esto funcionó en iOS 5/6/7 pero ya no funciona en 8.

Cuando se presenta la vista y se UITextField un UITextField , la aplicación UITextField responder (no está congelada, simplemente no responde a los toques). Casi como si el keyboard se presenta pero no aparece. Los methods de delegación se llaman correctamente. Si self.view.superview.bounds = CGRectMake(0, 0, 300, 250); el self.view.superview.bounds = CGRectMake(0, 0, 300, 250); desde el método viewWillLayoutSubviews , el keyboard funciona, pero la vista ahora es un estilo UIModalPresentationFormSheet tamaño completo.

Esto solo sucede en iOS 8, por lo que solo puedo suponer que es un problema con la forma en que se presenta el keyboard y la forma en que estoy ocultando / cambiando el tamaño de la vista, pero no tengo experiencia con la solución.

Presentando ViewController –

 UserLoginViewController *loginVC = [[UserLoginViewController alloc] initWithNibName:@"UserLoginViewController" bundle:nil]; loginVC.modalPresentationStyle = UIModalPresentationFormSheet; loginVC.delegate = self; [self presentViewController:loginVC animated:YES completion:nil]; 

Edición de los límites de vista:

 - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; self.view.superview.layer.cornerRadius = 10.0; self.view.superview.layer.masksToBounds = YES; self.view.superview.bounds = CGRectMake(0, 0, 300, 250); } 

En iOS8, no debe cambiar los límites de supervisión en viewWillLayoutSubviews porque causa un bucle infinito.

EDITAR: en la propiedad iOS8, PrefernetworkingContentSize funciona bien.

Debes cambiar tu código de esa manera:

  UserLoginViewController *loginVC = [[UserLoginViewController alloc] initWithNibName:@"UserLoginViewController" bundle:nil]; loginVC.modalPresentationStyle = UIModalPresentationFormSheet; loginVC.delegate = self; if(IS_IOS8) { loginVC.prefernetworkingContentSize = CGSizeMake(300, 250); } [self presentViewController:loginVC animated:YES completion:nil]; 

Edición de los límites de vista:

  - (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; self.view.superview.layer.cornerRadius = 10.0; self.view.superview.layer.masksToBounds = YES; if(!IS_IOS8) { self.view.superview.bounds = CGRectMake(0, 0, 300, 250); } } 

Otra forma, que le brinda más opciones de personalización, es usar UIPresentationController y UIViewControllerTransitioningDelegate. Echa un vistazo a mi código a continuación.

Controlador de vista principal:

  _aboutViewController = [[AboutViewController alloc] init]; _aboutViewController.modalPresentationStyle = UIModalPresentationFormSheet; if(IS_IOS8) { if(aboutTransitioningDelegate == nil) { aboutTransitioningDelegate = [[AboutTransitioningDelegate alloc] init]; } _aboutViewController.transitioningDelegate = aboutTransitioningDelegate; _aboutViewController.modalPresentationStyle = UIModalPresentationCustom; } [self presentViewController:_aboutViewController animated:YES completion:nil]; 

AboutViewController.m

 #import "AboutViewController.h" @interface AboutViewController () @end @implementation AboutViewController - (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; if(IS_IOS8) { return; } CGSize displaySize = CGSizeMake(320, 462); self.view.superview.bounds = CGRectMake(0, 0, displaySize.width, displaySize.height); } @end 

AboutTransitioningDelegate.h:

 @interface AboutTransitioningDelegate : NSObject <UIViewControllerTransitioningDelegate> @end 

AboutTransitioningDelegate.m:

 #import "AboutTransitioningDelegate.h" #import "AboutPresentationController.h" @implementation AboutTransitioningDelegate -(UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(UIViewController *)presenting sourceViewController:(UIViewController *)source { return [[AboutPresentationController alloc] initWithPresentedViewController:presented presentingViewController:presenting]; } @end 

AboutPresentationController.h

 #import <UIKit/UIKit.h> @interface AboutPresentationController : UIPresentationController @end 

AboutPresentationController.m

 #import "AboutPresentationController.h" @implementation AboutPresentationController -(CGRect)frameOfPresentedViewInContainerView { CGSize displaySize = CGSizeMake(320, 462); if([[Config shanetworkingInstance] latestVersionFromAppstoreInstalled]) { displaySize = CGSizeMake(320, 416); } CGRect r = CGRectZero; r.size = displaySize; r.origin.y = self.containerView.bounds.size.height/2 - displaySize.height/2; r.origin.x = self.containerView.bounds.size.width/2 - displaySize.width/2; return r; } -(void)containerViewWillLayoutSubviews { [super containerViewWillLayoutSubviews]; self.presentedView.frame = [self frameOfPresentedViewInContainerView]; } @end 

ProjectName-Prefix.pch

 #define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) 

La forma más simple de llamar a containerViewWillLayoutSubviews() es llamar a:

 containerView?.setNeedsLayout()