現在、Xcode 6プレリリース(ベータ版ではない)とOS X 10.10 Yosemiteベータ7のシミュレーターを使用しています。xcode6で開発されたプロジェクトをビルドしようとしていますが、特定のViewControllerを開くたびにアプリがクラッシュします。このビューコントローラーには、文字通りコードが含まれていません(これは、いくつかのデフォルトのセルとラベルを持つ空の静的なテーブルビューコントローラーです)。
与えられたエラーは次のとおりです。
*** 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」であり、それを変更しようとしましたが、クラッシュには影響しません。
ああ、Xcode5を使用すれば問題なく動作します。
更新9/24:それで私はまだこれを理解することができません。 fontWithDescriptorメソッドを使用しようとしましたが、それでもクラッシュします。面白いことに、カスタムフォントを使用するページがたくさんあり、ほとんどが正常に機能しますが、アクセスするとすぐにクラッシュするVCが2つあります...そのうちの1つにはカスタムフォントすらありません。私はあなたのフィードバックのすべてに本当に感謝していますが、誰か他のアイデア/修正がありますか? Xcodeの公式リリースを使用していますが、それでも機能しません。
この問題はiOS8.1で修正されています。
カスタムヘッダー/フッタービューの作成に時間を費やす代わりに、iOS8.0を実行しているデバイスにカスタムフォントを適用しません。とにかく、ほとんどの人はおそらくiOS8.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];
}
最初のステートメントは、デバイスが8より前のバージョンのiOSを実行している場合に当てはまります(isOperatingSystemAtLeastVersion:
はiOS8.0で導入されました)。 2番目のステートメントは、デバイスがiOS8.1以降を実行している場合に当てはまります。したがって、両方のステートメントで、iOS8.0を実行しているデバイスのみを除外します。
さて、私はついにそれを理解しました。
これは、グループ化されたテーブルビューにセクションヘッダーと場合によってはフッターがある場合に発生します。一時的な回避策として、グループ化されたテーブルビューからヘッダー/フッターを削除するだけですが、本当にフォントが必要な場合は、「viewForHeaderInSection」をオーバーライドし、カスタムビューのラベルにフォントを設定することでカスタムヘッダービューを作成できます。
それでも、これは間違いなくiOS 8のバグであり、近いうちに修正されることを願っています。
ここにいるみんなと同じように、他の回答に修正を適用すると、フォント設定が無視されました。私がやったことは、自分で追加したラベルを持つ独自のUITableViewHeaderFooterView(クラッシュの原因の原因と思われる場所)サブクラスを持つことでした。次に、UITableViewHeaderFooterViewから継承されたtextLabelプロパティの代わりにこのラベルを使用し、自動レイアウト制約を設定し、フォントを設定しました。すべてが再び正しかったのです(ただし、理想的とは言えません)。これはiOS8独自のようだともう一度付け加えておきます。
見てください: 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];
最終的に回避策が見つかりました。それは簡単です、あなたはただ他の方向にフォントを構築する必要があります:)
// 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]
この問題はiOS8.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]];
}
これは、UITableViewまたはUITableViewControllerのいずれかを使用している場合にのみ発生します。ここでinitWithStyle:
メソッド呼び出しはUITableViewStyleGrouped
に設定されます。スタイルをUITableViewStylePlain
に変更すると、問題が解決しました。
ここでも同じ問題があります。アプリの初期化でUITableViewHeaderFooterViewのカスタムフォントを設定すると、グループ化されたUITableViewを表示するとこのクラッシュが発生します。
私にとってうまくいくのは、View Controllerが作成されるまでカスタマイズを遅らせることです。つまり、ViewControllerのinitのappinitで行うことをすべて実行します。イライラするが、私のために働く。
- (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];
...
}
}