ios - headermode - react navigation custom header
La altura dinĂ¡mica de uitablviewcell no es correcta desde systemLayoutSizeFittingSize (1)
Estoy usando el diseño xib y automático para construir mi celda personalizada, en mi celda, hay una etiqueta de varias líneas . una en la altura de tablaForRowAtIndexPath, usaré
1 dequeueReusableCellWithIdentifier para obtener una celda
2 luego llame [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize] para obtener la altura correcta.
Pero en la depuración, encontré que cuando se llama a heightForRowAtIndexPath, el ancho de mi celda no es el ancho de la tabla, el ancho de la celda es el mismo que el ancho del archivo xib (porque en xcode6, puede establecer el tamaño xib en cualquiera). por lo que la altura obtenida de systemLayoutSizeFittingSize no es correcta. ¿Cómo puedo solucionar este problema para obtener la altura de celda correcta?
el tamaño obtenido del sistemaLayoutSizeFittingSize: no es correcto, este tamaño puede tener un ancho de más de 340 (mientras que el dispositivo es iPhone5 cuyo ancho es 320), y el 340+ es, por cierto, el ancho del archivo xib de la celda
Finalmente, obtuve la solución, gracias Ashish Gabani por la ayuda, de hecho, la solución incluye 2 pasos: 1 restablecer el marco de la celda a su mesaVer tamaño 2 llamar al diseño de la celdaSubViews antes de llamar a systemLayoutSizeFittingSize, y en su celda personalizada, necesita reescribir el método layoutSubViews. Aquí está el código para corregir este problema, yo uso el cuadrado rojo para marcarlos, disfrútenlo
Puede resolver este problema pasando la altura de su celda como
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Determine which reuse identifier should be used for the cell at this index path,
// depending on the particular layout required (you may have just one, or may have many).
NSString *reuseIdentifier = ...;
// Dequeue a cell for the reuse identifier.
// Note that this method will init and return a new cell if there isn''t one available in the reuse pool,
// so either way after this line of code you will have a cell with the correct constraints ready to go.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
// Configure the cell with content for the given indexPath, for example:
// cell.textLabel.text = someTextForThisCell;
// ...
// Make sure the constraints have been set up for this cell, since it may have just been created from scratch.
// Use the following lines, assuming you are setting up constraints from within the cell''s updateConstraints method:
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
// If you are using multi-line UILabels, don''t forget that the preferredMaxLayoutWidth needs to be set correctly.
// Do it at this point if you are NOT doing it within the UITableViewCell subclass -[layoutSubviews] method.
// For example:
// cell.multiLineLabel.preferredMaxLayoutWidth = CGRectGetWidth(tableView.bounds);
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Determine which reuse identifier should be used for the cell at this index path.
NSString *reuseIdentifier = ...;
// Use a dictionary of offscreen cells to get a cell for the reuse identifier, creating a cell and storing
// it in the dictionary if one hasn''t already been added for the reuse identifier.
// WARNING: Don''t call the table view''s dequeueReusableCellWithIdentifier: method here because this will result
// in a memory leak as the cell is created but never returned from the tableView:cellForRowAtIndexPath: method!
UITableViewCell *cell = [self.offscreenCells objectForKey:reuseIdentifier];
if (!cell) {
cell = [[YourTableViewCellClass alloc] init];
[self.offscreenCells setObject:cell forKey:reuseIdentifier];
}
// Configure the cell with content for the given indexPath, for example:
// cell.textLabel.text = someTextForThisCell;
// ...
// Make sure the constraints have been set up for this cell, since it may have just been created from scratch.
// Use the following lines, assuming you are setting up constraints from within the cell''s updateConstraints method:
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
// Set the width of the cell to match the width of the table view. This is important so that we''ll get the
// correct cell height for different table view widths if the cell''s height depends on its width (due to
// multi-line UILabels word wrapping, etc). We don''t need to do this above in -[tableView:cellForRowAtIndexPath]
// because it happens automatically when the cell is used in the table view.
// Also note, the final width of the cell may not be the width of the table view in some cases, for example when a
// section index is displayed along the right side of the table view. You must account for the reduced cell width.
cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds));
// Do the layout pass on the cell, which will calculate the frames for all the views based on the constraints.
// (Note that you must set the preferredMaxLayoutWidth on multi-line UILabels inside the -[layoutSubviews] method
// of the UITableViewCell subclass, or do it manually at this point before the below 2 lines!)
[cell setNeedsLayout];
[cell layoutIfNeeded];
// Get the actual height required for the cell''s contentView
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
// Add an extra point to the height to account for the cell separator, which is added between the bottom
// of the cell''s contentView and the bottom of the table view cell.
height += 1.0f;
return height;
}
// NOTE: Set the table view''s estimatedRowHeight property instead of implementing the below method, UNLESS
// you have extreme variability in your row heights and you notice the scroll indicator "jumping" as you scroll.
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Do the minimal calculations required to be able to return an estimated row height that''s
// within an order of magnitude of the actual height.
// For example:
if ([self isTallCellAtIndexPath:indexPath])
{
return 350.0f;
} else {
return 40.0f;
}
}
También puede encontrar la solución desde aquí Enlace