Подтвердить что ты не робот

ScaledValueForValue: вызов шрифта, который не имеет набора текста

В настоящее время я использую предварительный выпуск Xcode 6 (а не бета-версию) и симулятор OS X 10.10 Yosemite beta 7. Я пытаюсь создать проект, разработанный в xcode 6, но приложение вылетает всякий раз, когда я открываю определенный контроллер представления, Этот контроллер представления буквально не имеет в нем никакого кода (это пустой, статический, контроллер табличного представления, который имеет пару ячеек и меток по умолчанию).

Указанная ошибка:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason:  
'scaledValueForValue: called on a font that doesn't have a text style set'

И как раз перед этим я получаю этот отказ:

*** Assertion failure in -[UICTFont _scaledValueForValue:],         
/SourceCache/UIFoundation_Sim/UIFoundation-371/UIFoundation/iOS/UIFont.m:496

Я серьезно не знаю, что происходит, я попытался установить точки останова в VC, но ошибка возникает после вызова метода viewDidLoad (и, следовательно, после выполнения всего моего кода).

Любые идеи? Шрифты для всего, что есть в моем проекте, - "Baskerville", и я попытался изменить это, но это не влияет на сбой.

О, и он отлично работает, если я использую Xcode 5.

Обновление 9/24: Так что я все еще не могу понять это. Я попытался использовать метод fontWithDescriptor, но он по-прежнему сбой. Самое забавное: у меня есть много страниц, которые используют пользовательские шрифты, и большинство из них отлично работают, но есть два VC, которые сразу же срабатывают, когда я иду к ним... у одного из них даже нет пользовательских шрифтов. Я очень ценю все ваши отзывы, но есть ли у кого-нибудь другие идеи/исправления? Я использую официальный выпуск Xcode, и он все еще не работает.

4b9b3361

Ответ 1

Эта проблема была исправлена ​​в iOS 8.1.

Вместо того, чтобы тратить время на создание пользовательского представления заголовка/нижнего колонтитула, я просто не применяю пользовательский шрифт к устройствам под управлением iOS 8.0. Большинство людей, вероятно, обновили бы до iOS 8.1 в любом случае.

Для этого я использую следующий код:

NSOperatingSystemVersion iOS_8_1 = (NSOperatingSystemVersion){8, 1, 0};

if (![[NSProcessInfo processInfo] respondsToSelector:@selector(isOperatingSystemAtLeastVersion:)]
    || [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:iOS_8_1]) {
    header.textLabel.font = [UIFont fontWithName:@"Avenir-Medium" size:header.textLabel.font.pointSize];
}

Первый оператор верен, если на устройстве установлена ​​версия iOS ниже 8 (поскольку isOperatingSystemAtLeastVersion: был введен в iOS 8.0). Второй оператор верен, если устройство работает под управлением iOS 8.1 или новее. Таким образом, оба оператора исключают только те устройства, на которых запущена iOS 8.0.

Ответ 2

Хорошо, наконец, понял.

Это происходит, когда сгруппированные представления таблиц имеют заголовки разделов и, возможно, нижние колонтитулы. Как временный обходной путь я просто удаляю верхние и нижние колонтитулы из сгруппированных таблиц, но если вам действительно нужен шрифт, вы можете создать собственное представление заголовка, переопределив "viewForHeaderInSection" и установив шрифт на своей пользовательской метке представления.

Тем не менее, это определенно ошибка в iOS 8, и, надеюсь, она скоро будет исправлена.

Ответ 3

Взгляните на: http://openradar.io/17623734

К сожалению, на ранних этапах xCode 6 я могу предложить только обходной путь для сбоя.

Заменить эту строку:

[header.textLabel setFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:17]];

для этого:

header.textLabel.font = [UIFont fontWithDescriptor:[UIFontDescriptor fontDescriptorWithFontAttributes:@{@"NSCTFontUIUsageAttribute" : UIFontTextStyleBody,
                                                                                                        @"NSFontNameAttribute" : @"HelveticaNeue-Italic"}] size:17.0];

Ответ 4

Как и все здесь, применение исправления в других ответах привело к игнорированию настройки шрифта. То, что я закончил, - это иметь собственный UITableViewHeaderFooterView (откуда он кажется причиной сбоя) подклассы, у которых была метка, которую я добавил. Затем я использовал этот ярлык вместо свойства textLabel, унаследованного от UITableViewHeaderFooterView, настроил ограничения автоматического макета, установил шрифт, и все было правильно еще раз (хотя не то, что я бы считал идеальным). Я еще раз добавлю, что это похоже на уникальную iOS 8.

Ответ 5

Наконец нашел обходной путь. Это просто, вам просто нужно построить шрифт в другом направлении:)

// 1. Grab your custom font
CGFloat size = 17.0f;
UIFont *font = [UIFont fontWithName:@"Brandon Grotesque" size:size];

// 2. Get descriptor for your font and create new descriptor with
UIFontDescriptorTextStyleAttribute and UIFontDescriptorSizeAttribute attributes from it.

UIFontDescriptor *des = [[font fontDescriptor] fontDescriptorByAddingAttributes:@{
   UIFontDescriptorTextStyleAttribute: UIFontTextStyleBody, // You can tune this style based on usage
   UIFontDescriptorSizeAttribute: @(size)
}];

// 3. Get your font
UIFont *finalFont = [UIFont fontWithDescriptor:des size:0.0]

Ответ 6

Эта проблема все еще присутствует в iOS 8.0.2, но, похоже, она исправлена ​​в версии 8.1.

Моим обходным решением было установить пользовательский шрифт, только если iOS больше 8.0.2:

#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

...

if (SYSTEM_VERSION_GREATER_THAN(@"8.0.2")) {
    [[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setFont:[UIFont fontWithName:@"Helvetica" size:14.0]];
}

Ответ 7

Это происходит только для меня, когда используется UITableView или UITableViewController, где вызов метода initWithStyle: установлен на UITableViewStyleGrouped. Изменение стиля до UITableViewStylePlain разрешило проблемы.

Ответ 8

Такая же проблема: установите пользовательский шрифт для UITableViewHeaderFooterView в моем приложении init, получите этот сбой при отображении сгруппированного UITableView.

Что работает для меня - это отложить настройку до тех пор, пока не будет создан контроллер представления, т.е. делать то, что вы сделали бы в app init в контроллере представления init. Раздражает, но работает для меня.

- (id) init
{
  ...

  if (self = [super init])
  {
    // customise table view headers
    UILabel *headerLabel =
      [UILabel appearanceWhenContainedIn: [UITableViewHeaderFooterView class], nil];

    headerLabel.font =
      [UIFont fontWithName: @"AvenirNext-Medium" size: 15];

    ...
  }
}