Estoy usando el guión gráfico para definir una de las celdas prototipo como "Personalizada" y agregando un UITextField. Hay una etiqueta (con texto estático) a la izquierda. Se parece al tipo de celda "Detalle derecho", solo que la parte derecha es editable.

¿Hay alguna forma de cambiar el tamaño del campo de texto de forma económica para que llegue desde el final de la etiqueta de texto hasta el borde derecho? La etiqueta de texto de la izquierda debe ser lo suficientemente grande para mostrar su texto.

Sé acerca de sizeToFit y sizeWithFont:constrainedToSize:, pero el cambio de tamaño de las subvistas parece bastante engorroso y tendrá que repetirse con cada reciclaje de una celda.

¿Hay alguna manera de trabajar con autoresizingMask de UIView, quizás especificando esto en IB / storyboard?

2
Mundi 3 abr. 2012 a las 21:19
Cambié el lado editable, ¿crees que eso es lo que querías decir? ¿Cuánto texto espera poner en el campo de texto editable? 20 caracteres, 20 líneas?
 – 
jrturton
3 abr. 2012 a las 21:29
Gracias por editar. El contenido del campo es como máximo una línea. El controlador de vista es para editar, los datos ni siquiera tienen que mostrarse por completo.
 – 
Mundi
3 abr. 2012 a las 21:32

1 respuesta

La mejor respuesta

Siento que te decepcioné en la pregunta anterior, así que aquí va algo con un poco más de esfuerzo.

Puedes probar algo como lo siguiente. Este es solo un proyecto de muestra para darle una idea aproximada, pero funciona bastante bien.

Creé un proyecto vacío con un controlador de vista de tabla única. Esto tenía un número codificado de secciones (1) y filas (10). Tenía una sola celda prototipo, del tipo Basic. Puede configurar cualquier vista que desee como vista accesoria, así que he usado un campo de texto. Por lo tanto, toda la magia ocurre en cellForRowAtIndexPath:

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

    if (!cell.accessoryView)
    {
        UITextField *accessory = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 30.0)];
        accessory.borderStyle = UITextBorderStyleLine; // Just so you can see the effect
        cell.accessoryView = accessory;
    }

    NSMutableString *text = [NSMutableString stringWithFormat:@"A"];

    for (int i = 0; i < indexPath.row; i++) {
        [text appendFormat:@"A"]; // Just to illustrate different sizes
    }

    cell.textLabel.text = text;

    CGSize labelSize = [cell.textLabel.text sizeWithFont:cell.textLabel.font];
    CGRect accessoryFrame = cell.accessoryView.frame;

    accessoryFrame.size.width = cell.bounds.size.width - labelSize.width - 40; 
    // 40 is a magic number to prevent overlaps, you could be cleverer here
    // You'd also want to restrict to some minimum width.
    cell.accessoryView.frame = accessoryFrame;

    return cell;
}

Puntos clave:

  • Solo necesita cambiar el tamaño de la vista de accesorios.
  • El campo de texto es bastante básico; por lo general, querrá un pequeño método de fábrica que le devuelva uno, configurando el delegado y probablemente una barra de herramientas como vista accesoria con botones anterior, siguiente y hecho.
  • Asignar el valor ingresado en el campo de texto al modelo de datos es un ejercicio que queda para el lector.

Esto produce el siguiente resultado:

enter image description here

4
jrturton 3 abr. 2012 a las 22:32
Solución muy cuidada. Perfectamente claro y económico. Había pensado en accessoryView pero tenemos que dejar de diseñar todo en IB. Bueno, este es un buen compromiso. ¡Gracias!
 – 
Mundi
3 abr. 2012 a las 23:37