2012-01-12 62 views
3

我无法获取字体的大小。为什么我的字体等于零?UIFont:我无法获取字体的大小。为什么我的字体等于零?

- (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); 

和日志:

______font family.Helvetica NeueUI 

______font name.HelveticaNeueUI-Bold 

______font size0.000000 

回答

2

提出了第一个表视图在建造时我已经注意到这个问题。后续视图在我的情况下不会出现这种行为。换句话说,字体在tableView:cellForRowAtIndexPath后明显初始化:对于第一个构建的表视图只有。要解决这个问题

的方法之一是确保字体在细胞构造正确的初始化:
定义在一个类别一个新的UITableViewCell构造,创造了为textLabel和detailTextLabel新的字体与您通话后选择什么都默认超级initWithStyle :.

两个构建策略:

  • 只使用受影响的表视图这个新的构造,使 确保您的默认值是与操作系统的默认值是一致的。

  • 或者更换 这个新的构造所有的UITableViewCell构造函数调用,以确保所有表视图的一致性,并 省略了的pointsize检查。由于未来操作系统版本的默认值可能会发生变化,因此我可能会对此采取策略。

您可以使用此处列出的默认值作为参考。虽然,我认为它们自iOS 4.2以来已经发生了变化:Default font size of UITableViewCell

您也可以使用模拟器在第二个UITableView中自己发现它们。

示例代码:

细胞的默认值:

#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类别:

@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 

实施例结构中的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; 

} 
+0

什么目的确实'K检查是否PointSize'服务? – Stas 2013-05-24 09:21:48

+1

@Stas同样,这个问题解决了第一个显示的表视图的归零字体大小。如果我没有记错,在随后的表格视图中字体大小未被清零。因此,进行检查可确保第一个表视图字体是您指定的值。后续表格视图中的字体大小将是系统默认值。或者,如果要将kCheckPointSize(设置为1),则继承此功能的每个单元格都将采用指定的字体大小。合理? – stephen 2013-05-24 18:19:44

+0

非常感谢,现在很清楚。 – Stas 2013-05-25 07:03:50