2012-01-12 38 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

相關問題