UITableViewWrapperView y UITableView tamaño difieren con autolayout

Estoy construyendo un chat. Todo parece estar bastante bien, pero me topé con una especie de problema 'buggy'.

Obtuve UIViewController con la barra UITextView para ingresar posts y UITableView. Están en esta restricción: "V:|-(64)-[chatTable][sendMessageBar]-(keyboard)-|" . Cuando el keyboard no está desactivado, la constante de esta restricción es 0 . y después de que el keyboard esté fuera, aumenta la constante a la altura del keyboard.

cuando el keyboard no está apagado:

 self.table.contentSize = (375.0,78.5) self.table.bounds = (0.0,-490.0,375.0,568.5) self.table.frame = (0.0,64.0,375.0,568.5) self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,568.5) self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,568.5) 

y cuando sale el keyboard:

 self.table.contentSize = (375.0,78.5) self.table.bounds = (0.0,-274.0,375.0,352.5 self.table.frame = (0.0,64.0,375.0,352.5) self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,-137.5,375.0,137.5) self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,137.5) 

Entonces, UITableViewWrapperView, después de boost las constantes, difiere en tamaño a su supervisión: UITableView. ¿Hay alguna forma de arreglar esto? Supongo que UITableViewWrapperView cambiará su marco y límites de acuerdo con UITableView pero no lo hace.

¿Alguna idea de dónde está el problema o cómo podría solucionarlo?

AGREGANDO:

Después de un poco más de investigación, parece que ocurre en algún lugar entre viewWillLayoutSubviews y viewDidLayoutSubviews . Es un poco raro,

 override func viewWillLayoutSubviews() { println("WrapperView Frame :991: \(self.table.subviews[0].frame)") \\ WrapperView Frame :991: (0.0,0.0,375.0,568.5) super.viewWillLayoutSubviews() println("WrapperView Frame :992: \(self.table.subviews[0].frame)") \\ WrapperView Frame :992: (0.0,0.0,375.0,568.5) } override func viewDidLayoutSubviews() { println("WrapperView Frame :6: \(self.table.subviews[0].frame)") \\ WrapperView Frame :6: (0.0,-137.5,375.0,137.5) super.viewDidLayoutSubviews() println(">> viewDidLayoutSubviews") } 

Entonces, parece que algo pasa allí que arruina el UITableViewWrapperView

Parece que es un error (la lucha con este error me llevó todo el día) Finalmente, esta solución ayudó:

 for (UIView *subview in tableView.subviews) { if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewWrapperView"]) { subview.frame = CGRectMake(0, 0, tableView.bounds.size.width, tableView.bounds.size.height); } } 

Lo siguiente me lo arregló:

 func fixTableViewInsets() { let zContentInsets = UIEdgeInsetsZero tableView.contentInset = zContentInsets tableView.scrollIndicatorInsets = zContentInsets } override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() fixTableViewInsets() } 

Descubrí que en viewWillAppear () que los recuadros eran todos 0. Pero en viewDidAppear (), se habían modificado para aparentemente compensar la barra de navigation, etc. Esto hace que UITableViewWrapperView sea diferente de UITableView. Cambié las inserciones en su propia rutina para que fuera más fácil experimentar con llamarlo desde diferentes lugares. Las viewWillLayoutSubviews () le permiten cambiarlo antes de presentarlo; colocar el cambio en viewDidAppear () hizo que la tabla se sacudiera.

Me encontré con esto hoy y aunque la solución sugerida por @anorskdev funciona bien, parece que la causa raíz del problema es la propiedad automaticallyAdjustsScrollViewInsets de UIViewController, que es true de forma pnetworkingeterminada. Lo apagué en mi storyboard y el problema desapareció. Busque la checkbox "Ajustar vista de desplazamiento" en el inspector Ver controller y asegúrese de que está desmarcada.