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 

Я заметил эту проблему при создании первого представления таблицы. Последующие взгляды не проявляют такого поведения в моем случае. Другими словами, шрифт явно инициализируется после 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 

Пример построения в таблицеView: 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; } 
  • Как остановить UILabel от замены «...» символом многоточия
  • Ограничения AutoLayout для UITableViewCell contentView не соблюдаются
  • Подчеркивать текст в UILabel в моноточе (портировать код ObjC)
  • Можно ли получить список атрибутов и диапазонов для NSMutableAttributedString?
  • Метка переменной длины, высота строк таблицы и автоматическая компоновка
  • iOS 8 - изменение интервала символов на UILabel в интерфейсе Builder
  • Обновите предпочтительнуюMaxLayoutWidth для многострочного UILabel с неизвестным размером (Auto Layout)
  • мои первоначальные проблемы с UIScrollView теперь, похоже, связаны с автозапуском
  • У UILabel есть странная серая верхняя строка / граница в iOS7, как я могу ее удалить?
  • NSTextAlignment обратный. Естественный
  • iOS - UILabel меняет внешний вид отключенной метки
  • Interesting Posts

    Как эффективная файловая система iOS работает с большим количеством файлов в одной папке

    EXC_BAD_ACCESS при преобразовании строки Swift в данные

    не может заставить приложение к портрету только в iOS9

    NSJSONSerialization возвращает ноль

    iOS UILabel autoshrink, поэтому слово не усекает до двух строк

    Показать динамический вывод аннотации в mapview

    Быстрый способ получения доминирующего цвета изображения

    Поврежденные аудио файлы WAV в iOS – почему?

    Какова максимальная величина текстуры для ipad / 3gs (графическая карта SGX)? сколько памяти мы можем использовать «специально» для данных текстуры?

    Как изменить оттенок, яркость и насыщенность UIColor?

    Как перечислить все подзаголовки в UIViewcontroller в iOS?

    Ограничьте скорость прокрутки UITableView, как это делает Instagram

    Новая четкая карта места

    Почему SKShapeNode ярче на верхней границе

    iPhone Вы можете показать интерфейс дозвона из своего приложения?

    Давайте будем гением компьютера.