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

person Voloda2    schedule 12.01.2012    source источник


Ответы (1)


Я заметил эту проблему, когда создается первое представленное табличное представление. Последующие представления не демонстрируют такого поведения в моем случае. Другими словами, шрифт явно инициализируется после tableView:cellForRowAtIndexPath: для первого сконструированного табличного представления только.

Один из способов обойти это — обеспечить правильную инициализацию шрифтов в конструкторе ячеек:
Определите новый конструктор UITableViewCell в категории и создайте новые шрифты для textLabel и detailTextLabel с любыми значениями по умолчанию, которые вы выберете после вызова super initWithStyle: .

Две стратегии строительства:

  • используйте этот новый конструктор только в затронутых табличных представлениях и убедитесь, что ваши значения по умолчанию соответствуют значениям по умолчанию ОС.

  • В качестве альтернативы замените все вызовы конструктора UITableViewCell этим новым конструктором, чтобы обеспечить согласованность для всех табличных представлений, и опустите проверку pointSize. Я, скорее всего, поддержу эту стратегию, поскольку значения по умолчанию могут быть изменены в будущих версиях ОС.

Вы можете использовать значения по умолчанию, перечисленные здесь, в качестве справки. Хотя я думаю, что они изменились с iOS 4.2: Размер шрифта по умолчанию 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;

}
person stephen    schedule 08.08.2012
comment
Какой цели служит kCheckPointSize? - person Stas; 24.05.2013
comment
@Stas Опять же, этот вопрос касается обнуленных размеров шрифта для первого отображаемого представления таблицы. Если я правильно помню; размеры шрифта не обнулялись в последующих представлениях таблицы. Таким образом, выполнение проверки гарантирует, что шрифты первого табличного представления соответствуют указанным вами значениям. Размеры шрифта в последующих табличных представлениях будут системными по умолчанию. В качестве альтернативы, если вы установите kCheckPointSize (равным 1), каждая ячейка, наследующая эту функцию, будет использовать указанные вами размеры шрифта. Есть смысл? - person stephen; 24.05.2013