UIFont: No puedo get el tamaño de la fuente. ¿Por qué mi fuente es igual a cero?

No puedo get el tamaño de la fuente. ¿Por qué mi fuente es igual a cero?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kQuestionIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kQuestionIdentifier] autorelease]; } cell.textLabel.text = [self extractText:indexPath forLabelAttribute:kTextLabel]; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.numberOfLines = 0; NSLog(@"______font family%@", cell.textLabel.font.familyName); NSLog(@"______font name%@", cell.textLabel.font.fontName); NSLog(@"______font size%f", cell.textLabel.font.pointSize); 

Y logging:

 ______font family.Helvetica NeueUI ______font name.HelveticaNeueUI-Bold ______font size0.000000 

Me he dado count de este problema cuando se construye la primera vista de tabla presentada. Las vistas posteriores no muestran este comportamiento en mi caso. En otras palabras, la fuente se inicializa claramente después de tableView: cellForRowAtIndexPath: solo para la primera vista de tabla construida.

Una forma de evitar esto es garantizar la correcta initialization de las fonts en el constructor de celdas:
Defina un nuevo constructor UITableViewCell en una categoría y cree nuevas fonts para textLabel y detailTextLabel con los valores pnetworkingeterminados que elija después de llamar a super initWithStyle :.

Dos estrategias de construcción:

  • solo use este nuevo constructor en las vistas de tabla afectadas y asegúrese de que sus valores pnetworkingeterminados sean consistentes con los valores pnetworkingeterminados del sistema operativo.

  • Alternativamente, reemplace todas las llamadas constructor UITableViewCell con este nuevo constructor para garantizar la coinheritance para todas las vistas de tabla, y omita la comprobación de pointSize. Probablemente me asocie con esta estrategia, ya que los valores pnetworkingeterminados están sujetos a cambios en futuras revisiones del sistema operativo.

Puede utilizar los valores pnetworkingeterminados enumerados aquí como reference. Aunque, creo que han cambiado desde iOS 4.2: tamaño de fuente pnetworkingeterminado de UITableViewCell

También podría iniciar session utilizando el simulador para descubrirlos usted mismo en la segunda UITableView construida.

Código de ejemplo:

Pnetworkingeterminados de celda:

 #define kCellStyleSubtitleTextLabelFont @"Helvetica-Bold" #define kCellStyleSubtitleTextLabelFontSize 18.0f #define kCellStyleSubtitleDetailLabelFont @"Helvetica" #define kCellStyleSubtitleDetailLabelFontSize 14.0f #define kCellStyle1TextLabelFont @"Helvetica-Bold" #define kCellStyle1TextLabelFontSize 17.0f #define kCellStyle1DetailLabelFont @"Helvetica Bold" #define kCellStyle1DetailLabelFontSize 15.0f #define kCellStyle2TextLabelFont @"Helvetica-Bold" #define kCellStyle2TextLabelFontSize 12.0f #define kCellStyle2DetailLabelFont @"Helvetica" #define kCellStyle2DetailLabelFontSize 15.0f 

UITableViewCell Categoría:

 @interface UITableViewCell (fontDefaults) -(id) initWithCellStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier; @end #define kCheckPointSize 0 @implementation UITableViewCell (fontDefaults) -(id) initWithCellStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [self initWithStyle:style reuseIdentifier:reuseIdentifier]; if(self == nil) return nil; switch (style) { case UITableViewCellStyleValue1: { //Left aligned label on left and right aligned label on right with blue text (Used in Settings) #if kCheckPointSize if(self.textLabel.font.pointSize == 0) #endif self.textLabel.font = [UIFont fontWithName:kCellStyle1TextLabelFont size:kCellStyle1TextLabelFontSize]; #if kCheckPointSize if(self.detailTextLabel.font.pointSize == 0) #endif self.detailTextLabel.font = [UIFont fontWithName:kCellStyle1DetailLabelFont size:kCellStyle1DetailLabelFontSize]; break; } case UITableViewCellStyleValue2: { //Right aligned label on left with blue text and left aligned label on right (Used in Phone/Contacts) #if kCheckPointSize if(self.textLabel.font.pointSize == 0) #endif self.textLabel.font = [UIFont fontWithName:kCellStyle2TextLabelFont size:kCellStyle2TextLabelFontSize]; #if kCheckPointSize if(self.detailTextLabel.font.pointSize == 0) #endif self.detailTextLabel.font = [UIFont fontWithName:kCellStyle2DetailLabelFont size:kCellStyle2DetailLabelFontSize]; break; } case UITableViewCellStyleSubtitle: { //Left aligned label on top and left aligned label on bottom with gray text (Used in iPod). #if kCheckPointSize if(self.textLabel.font.pointSize == 0) #endif self.textLabel.font = [UIFont fontWithName:kCellStyleSubtitleTextLabelFont size:kCellStyleSubtitleTextLabelFontSize]; #if kCheckPointSize if(self.detailTextLabel.font.pointSize == 0) #endif self.detailTextLabel.font = [UIFont fontWithName:kCellStyleSubtitleDetailLabelFont size:kCellStyleSubtitleDetailLabelFontSize]; break; } default: //default cell style case UITableViewCellStyleDefault: { //Simple cell with text label and optional image view (behavior of UITableViewCell in iPhoneOS 2.x). No detailTextLabel #if kCheckPointSize if(self.textLabel.font.pointSize == 0) // #endif self.textLabel.font = [UIFont fontWithName:kCellStyle1TextLabelFont size:kCellStyle1TextLabelFontSize]; break; } } return self; } @end 

Construcción de ejemplo en tableView: cellForRowAtIndexPath:

 static NSString *CellIdentifier = @"Style2Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithCellStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier] autorelease]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; cell.selectionStyle = UITableViewCellSelectionStyleNone; }