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, и он все еще не работает.
Ответы
Ответ 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];
...
}
}