2012-01-12 8 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 :.

二つの建設戦略:

  • のみ影響を受けるテーブルビューに、この新しいコンストラクタを使用して、 必ずあなたのデフォルトはOSのデフォルト値と一致しているします。

  • はまた、すべてのテーブルビューのための一貫性を確保するために この新しいコンストラクタを持つすべてのUITableViewCellのコンストラクタの呼び出しを交換し、 はポイントサイズのチェックを省略します。将来のOSの改訂でデフォルト値が変更される可能性があるので、私はこの戦略に賛成するでしょう。

ここではデフォルト値を参考にして使用できます。しかし、iOS 4.2から変更されていると思います。

また、シミュレータを使用してログを記録して、2番目の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のカテゴリ:のtableViewで

@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 

構成例:cellForRowAtIndexPath: `kCheckを何目的

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

PointSize'サービス? – Stas

+1

@Stasこの質問は、最初に表示されたテーブルビューのフォントサイズをゼロにします。もし私が正確に覚えていれば;フォントサイズは、その後のテーブルビューでゼロにされませんでした。したがって、チェックを行うと、最初のテーブルビューのフォントが指定した値になります。後続のテーブルビューのフォントサイズは、システムのデフォルト値になります。また、kCheckPointSizeを1に設定した場合、この機能を継承する各セルは指定されたフォントサイズを使用します。理にかなっている? – stephen

+0

ありがとう、今は明らかです。 – Stas

関連する問題