2012-10-08 12 views
16

Estoy tratando de agregar una UIView a un encabezado de UITableView, luego, usando NSLayoutConstraints, quiero darle un alto.Use NSLayoutConstraints en una vista de cabecera de UITableView

He revisado los documentos de Apple Docs y la WWDC 2012 pero no puedo encontrar este error en particular en ninguna parte.

Tengo el siguiente código:

- (UIImageView *)logoImageView 
{ 
    if (!_logoImageView) { 
     _logoImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo"]]; 
     [_logoImageView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    } 
    return _logoImageView; 
} 

... en viewDidLoad

UIView *tableHeaderView = [[UIView alloc] init]; 
tableHeaderView.translatesAutoresizingMaskIntoConstraints = NO; 

[tableHeaderView addSubview:self.logoImageView]; 

[self.tableView setTableHeaderView:tableHeaderView]; 

NSDictionary *constraintViews = @{@"tableView" : self.tableView, @"tableHeaderView" : tableHeaderView, @"logoImageView" : self.logoImageView}; 

[self.tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tableHeaderView(50)]" 
                     options:0 
                     metrics:nil 
                     views:constraintViews]]; 

Sin embargo, cuando lo ejecuto me sale el siguiente error:

2012-10-08 16:31:34.559 myApp[6934:c07] *** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776 
2012-10-08 16:31:34.561 myApp[6934:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.' 
*** First throw call stack: 
(0x199b012 0x17c0e7e 0x199ae78 0x1256f35 0x7589ef 0x17d46b0 0x622fc0 0x61733c 0x622eaf 0x7f78cd 0x7401a6 0x73ecbf 0x73ebd9 0x73de34 0x73dc6e 0x73ea29 0x741922 0x7ebfec 0x738bc4 0x738dbf 0x738f55 0x741f67 0x705fcc 0x706fab 0x718315 0x71924b 0x70acf8 0x27e8df9 0x27e8ad0 0x1910bf5 0x1910962 0x1941bb6 0x1940f44 0x1940e1b 0x7067da 0x70865c 0x6d5d 0x2395) 
libc++abi.dylib: terminate called throwing an exception 
+3

¿Puedo preguntar si alguna vez encontró una solución a este problema? –

Respuesta

2

La mejor manera de superar esto es usar Interface Builder para configurar el encabezado UITableView, luego agregar un Outlet a la altura NSLayoutConstraint.

+3

Puedes elaborarlo. No tengo idea de lo que esto significa. – jgvb

+0

'NSLayoutConstraint's son objetos regulares, por lo que puedes crear salidas para ellos desde Interface Builder, y manipular sus propiedades en el tiempo de ejecución del mismo modo que lo haría para una vista IB (por ejemplo) –

+0

No veo una manera de agregar restricciones de diseño de altura o ancho al encabezado o pie de página de UITableView en el guión gráfico. Añadir nuevas restricciones' tiene todo bloqueado dentro. – derpoliuk

3

I tenía la misma excepción cuando estaba tratando de establecer la vista de encabezado de la tabla. Cuando me di cuenta de que la vista tenía Contraints, simplemente desactivé la opción "Usar ajuste automático" de Storyboard.

Captura de pantalla: http://i.stack.imgur.com/5jWHy.png

Esto resolvió para mí.

+8

Esto solo está solucionando el problema, no solucionándolo :(¡No puedes simplemente desactivar el autolayout! – jgvb

1

Prueba esto:

logoImageView.translatesAutoresizingMaskIntoConstraints = YES; 

(Si no funciona, intente quitar:

tableHeaderView.translatesAutoresizingMaskIntoConstraints = NO; //Remove this line 

:)

0

no he tenido ninguna solución adecuada para este problema, pero se puede Solucionarlo mediante el uso de marcos y no establecer la propiedad traducirAtlasizingMaskIntoConstraints a No (de forma predeterminada es sí, así que no lo establezca)

CGRect headerViewFrame = CGRectMake(0,0,320,60); //Frame for your header/footer view 

UIView *tableHeaderView = [[UIView alloc] initWithFrame:headerViewFrame]; 
tableHeaderView.translatesAutoresizingMaskIntoConstraints = Yes; //Or don't set it at all 
[self.tableView setTableHeaderView:tableHeaderView]; 
Cuestiones relacionadas