Hay muchas soluciones en el mercado que utilizan «sizeWithFont» o algo similar, que pasa a ser obsoleto como de iOS 7.

Aquí está el código que he construido hasta ahora. Los cambios de altura, pero no del todo precisa:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

//Configure the cell...
cell.textLabel.text = "The Cell's Text!";
cell.textLabel.numberOfLines = 0;
[cell.textLabel setLineBreakMode:NSLineBreakByWordWrapping];
[cell.textLabel sizeToFit];

return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
CGRect screenBounds = [[UIScreen mainScreen] bounds];
CGSize screenSize = screenBounds.size;

NSAttributedString *aString = [[NSAttributedString alloc] initWithString:"The Cell's Text!"];
UITextView *calculationView = [[UITextView alloc] init];
[calculationView setAttributedText:aString];
CGSize size = [calculationView sizeThatFits:CGSizeMake(screenSize.width, FLT_MAX)];
return size.height;
}

Para otro ejemplo, he aquí una similar respuesta: https://stackoverflow.com/a/9828777/693121, aunque como he dicho antes, este utiliza código obsoleto.

OriginalEl autor Demasterpl | 2013-11-25

5 Comentarios

  1. 14

    Se debe utilizar el método que se menciona en la documentación para sustituir el antiguo — boundingRectWithSize:opciones:atributos:contexto:. He aquí un ejemplo que creo que debería de trabajo (trabaja con multi-línea de etiquetas de todos modos).

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        NSStringDrawingContext *ctx = [NSStringDrawingContext new];
        NSAttributedString *aString = [[NSAttributedString alloc] initWithString:@"The Cell's Text!"];
        UITextView *calculationView = [[UITextView alloc] init];
        [calculationView setAttributedText:aString];
        CGRect textRect = [calculationView.text boundingRectWithSize:self.view.frame.size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:calculationView.font} context:ctx];
            return textRect.size.height;
      }

    Esto supone que la vista de texto a ser el tamaño del auto.vista. Si no, usted debe utilizar initWithFrame para su vista de texto, y de paso calculationView.marco.tamaño de la boundingRectWithSize: parámetro.

    Por alguna razón, este siempre devuelve una altura de 13.8? Independientemente de la cantidad de texto en «aString» de la variable.
    lo siento, he utilizado el mal parámetro de opciones en mi respuesta, debe ser NSStringDrawingUsesLineFragmentOrigin. He corregido mi respuesta.
    Que parece estar volviendo un respetable valor, aunque a veces incluso a pesar de que la altura es un gran número, aún aparece para mantener la altura por defecto. Además, no parece hacer una diferencia si me quita las propiedades de la celda (como sizeToFit & setLineBreakMode). 🙁
    lo que mantiene la altura por defecto? La célula, o la vista de texto?
    He NSStringDrawingUsesLineFragmentOrigin allí y voy a poner el 13.8 que @Demasterpl estaba recibiendo.

    OriginalEl autor rdelmar

  2. 8

    Este de aquí es la versión más fácil, iOS 7 hace todo el trabajo pesado (sólo para el diseño automático basado en uitableviewcells):

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
       CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"Cell"];
    
       [self configureCell:cell];
    
       //edit: Need to call [cell layoutIfNeeded]; otherwise the layout changes wont be applied to the   cell
    
       [cell layoutIfNeeded];
    
    
       return [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height;
    }

    systemLayoutSizeFittingSize re-evalúa el autodiseño de restricciones y devuelve la altura ideal para su celular. Fácil, ¿verdad?

    ¿qué hace el método [auto configureCell:celda]; ?
    configuración básica de la célula dependiente de los datos de objeto (por ejemplo, la configuración de las etiquetas). con esto quiero «de relleno» en la celda con el contenido, por lo tanto el diseño automático puede determinar la altura requerida de forma automática
    Me pregunto si esto es demasiado ineficiente.
    No trabajo para mí en ios8.

    OriginalEl autor Wirsing

  3. 2

    Lo tengo de mi colega (ANIRUDH) y funciona bien, puede ser útil:

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
    //Calculating height on base of length of text
        UIFont *font =  [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
        NSAttributedString *attributedText =
        [[NSAttributedString alloc]
         initWithString:YOURSTRING //[NSString string withformat:@"\n Yourstring"] \n for: number of lines require for static label in cell
         attributes:@
         {
         NSFontAttributeName: font
         }];
        CGRect rect = [attributedText boundingRectWithSize:(CGSize){CELL_CONTENT_WIDTH, CGFLOAT_MAX}
                                                   options:NSStringDrawingUsesLineFragmentOrigin
                                                   context:nil];
        CGSize size = rect.size;
    
        // NSString *height = [NSString stringWithFormat: @"%.2f", ceilf(size.height)+22];
        return (ceilf(size.height)+22)*0.6; //change 0.6 to 0.9 according to the difference in required and extra calculted height, it works for me every time
    }

    OriginalEl autor Yogesh Lolusare

  4. 0
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString *yourText = [[resultArray objectAtIndex:indexPath.row] valueForKey:@"review_text"];
        CGSize lblwidth = CGSizeMake(300, CGFLOAT_MAX);
        CGSize requiredSize = [yourText sizeWithFont:[UIFont fontWithName:@"CALIBRI" size:17] constrainedToSize:lblwidth lineBreakMode:NSLineBreakByWordWrapping];
        int calculatedHeight = requiredSize.height+50;
        return (float)calculatedHeight;
    }

    OriginalEl autor kalpesh

  5. -1

    Para obtener el tamaño de su cadena debe utilizar - (CGSize)sizeWithAttributes:(NSDictionary *)attars.

    Así por su ejemplo calcular la altura de la etiqueta de texto como tal:

    CGSize *cellSize = [cell.textLabel.text sizeWithAttributes:@{NSFontAttributeName:[cell.textLabel.font]}];

    o

    CGSize *rowSize = [aString sizeWithAttributes:nil];
    Esto no va a funcionar. A partir de Apple docs: «Devuelve el tamaño de la cadena, si se representa con la fuente especificada en una sola línea.» Que no es útil si usted está tratando de cambiar la altura de las células basadas en un multi-etiqueta de línea.

    OriginalEl autor ChrisSamuelson

Dejar respuesta

Please enter your comment!
Please enter your name here