web-dev-qa-db-ja.com

scaledValueForValue:テキストスタイルが設定されていないフォントで呼び出されます

現在、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の公式リリースを使用していますが、それでも機能しません。

38
Josh

この問題は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を実行しているデバイスのみを除外します。

23
Jonathan

さて、私はついにそれを理解しました。

これは、グループ化されたテーブルビューにセクションヘッダーと場合によってはフッターがある場合に発生します。一時的な回避策として、グループ化されたテーブルビューからヘッダー/フッターを削除するだけですが、本当にフォントが必要な場合は、「viewForHeaderInSection」をオーバーライドし、カスタムビューのラベルにフォントを設定することでカスタムヘッダービューを作成できます。

それでも、これは間違いなくiOS 8のバグであり、近いうちに修正されることを願っています。

4
Josh

ここにいるみんなと同じように、他の回答に修正を適用すると、フォント設定が無視されました。私がやったことは、自分で追加したラベルを持つ独自のUITableViewHeaderFooterView(クラッシュの原因の原因と思われる場所)サブクラスを持つことでした。次に、UITableViewHeaderFooterViewから継承されたtextLabelプロパティの代わりにこのラベルを使用し、自動レイアウト制約を設定し、フォントを設定しました。すべてが再び正しかったのです(ただし、理想的とは言えません)。これはiOS8独自のようだともう一度付け加えておきます。

3
Tyten

見てください: 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];
3
carlodurso

最終的に回避策が見つかりました。それは簡単です、あなたはただ他の方向にフォントを構築する必要があります:)

// 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]
1
Yury Korolev

この問題は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]];
}
1

これは、UITableViewまたはUITableViewControllerのいずれかを使用している場合にのみ発生します。ここでinitWithStyle:メソッド呼び出しはUITableViewStyleGroupedに設定されます。スタイルをUITableViewStylePlainに変更すると、問題が解決しました。

0
Byron Rode

ここでも同じ問題があります。アプリの初期化で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];

    ...
  }
}
0