Los documentos describen - [UIView layoutSubviews] como
"Overridden by subclasses to layout subviews when layoutIfNeeded is invoked. The default implementation of this method does nothing."
Esa descripción no está detalles, pero es preciso. En este caso, el comportamiento del método es diseñar sus subvistas. Se invocará cada vez que cambie la orientación del dispositivo. También está programado para una invocación posterior siempre que llame a -setNeedsLayout.
Dado que la implementación de UIView no hace nada, (y supongo que lo mismo para UIControl), obtiene total libertad creativa para hacer que sus subvistas de subclase UIView se ubiquen donde usted las desee.
En la subclasificación un UITableViewCell, que tienen un par de opciones para tratar:
- -layoutSubviews override y
- manipular la posición de la incorporada en el textLabel y vistas -detailLabel.
- Anulación -viewDidLoad,
- crear dos de sus propios UILabels para proporcionar el texto y el texto detallado,
- añadirlos a self.contentView y
- -layoutSubviews de anulación para manipular la posición de su encargo UILabel ve
En un related SO question, el reco La recomendación es evitar el # 1, manipulando el texto incorporado LabelLabel y detailTextLabel.
Una apuesta más fiable sería hacer algo como esto:
@interface MyTableViewCell : UITableViewCell {
UILabel *myTextLabel;
UILabel *myDetailTextLabel;
}
// ... property declarations
@end
@implementation MyTableViewCell
@synthesize myTextLabel, myDetailTextLabel;
- (id) initWithFrame: (CGRect)frame {
self = [super initWithFrame: frame];
if (self) {
myTextLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
[self.contentView addSubview: myTextLabel];
myDetailTextLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
[self.contentView addSubview: myDetailTextLabel];
}
return self;
}
- (void) dealloc {
[myTextLabel release];
[myDetailTextLabel release];
[super dealloc];
}
- (void) layoutSubviews {
// Let the super class UITableViewCell do whatever layout it wants.
// Just don't use the built-in textLabel or detailTextLabel properties
[super layoutSubviews];
// Now do the layout of your custom views
// Let the labels size themselves to accommodate their text
[myTextLabel sizeToFit];
[myDetailTextLabel sizeToFit];
// Position the labels at the top of the table cell
CGRect newFrame = myTextLabel.frame;
newFrame.origin.x = CGRectGetMinX (self.contentView.bounds);
newFrame.origin.y = CGRectGetMinY (self.contentView.bounds);
[myTextLabel setFrame: newFrame];
// Put the detail text label immediately to the right
// w/10 pixel gap between them
newFrame = myDetailTextLabel.frame;
newFrame.origin.x = CGRectGetMaxX (myTextLabel.frame) + 10.;
newFrame.origin.y = CGRectGetMinY (self.contentView.bounds);
[myDetailTextLabel setFrame: newFrame];
}
@end
En MyTableViewCell, que sería ignorar las etiquetas de texto incorporados y utilizar sus propios UILabels personalizados. Usted toma el control completo de colocarlos dentro del contenido de la celda de la vista de tabla.
Voy a dejar un montón de cosas. Al hacer un diseño personalizado con etiquetas de texto, le recomendamos considerar:
Calculando su propio algoritmo de diseño.
Estoy utilizando un algoritmo de diseño anterior que cambia el tamaño de los UILabels personalizados para que se ajusten a su contenido de texto, y luego los coloca uno al lado del otro. Es probable que desee algo más específico para su aplicación.
Manteniendo las etiquetas personalizadas dentro de la vista de contenido.
En -layoutSubviews, es posible que desee que la lógica mantenga los UILabels personalizados dimensionados y colocados de modo que no queden fuera de los límites del contenido rect. Con mi ingenua lógica de diseño, cualquier texto largo insertado en UILabel (o en ambos) podría hacer que las etiquetas se posicionen directamente fuera de los límites de la vista de contenido.
Cómo manejar -viewDidLoad/-viewDidUnload.
Como se ha indicado anteriormente, esta subclase no controla la carga desde un plumín. Es posible que desee utilizar IB a la disposición de su celda, y si lo hace, tendrá que pensar en -viewDidLoad/-viewDidUnload/-initWithCoder:
¿Esta es una pregunta relacionada con el Iphone? –
Sí. UITableViewCell junto con UITableView y UITableViewController son exclusivos del iPhone OS. ¿No? – dugla
Entonces, ¿por qué la pregunta no está etiquetada como iphone? Tenga cuidado al etiquetar, para que otros puedan beneficiarse de sus preguntas. –