4

以下のスクリーン ショットは iOS 7 のものです。label1(黄色、上) は、テキストの原点がフレームの左上の下にあり、下が切り取られた状態で描画されます。iOS 5/6 では、テキストの原点はラベル フレームの左上です。label2期待どおりにlabel3レンダリングしてレイアウトします。

ここに画像の説明を入力

このビューを生成するコードは次のとおりです。

- (void)loadView
{
    UIView *view = [[UIView alloc] initWithFrame:UIScreen.mainScreen.applicationFrame];
    view.backgroundColor = UIColor.blueColor;
    self.view = view;

    UILabel *label1 = [UILabel new];
    label1.backgroundColor = UIColor.yellowColor;
    label1.font = [UIFont systemFontOfSize:16.0f];
    label1.numberOfLines = 0;
    label1.lineBreakMode = NSLineBreakByWordWrapping;
    label1.frame = CGRectMake(50, 100, 200, 18);
    label1.text = @"This text is too long to fit on one line.";
    [self.view addSubview:label1];

    UILabel *label2 = [UILabel new];
    label2.backgroundColor = UIColor.greenColor;
    label2.font = [UIFont systemFontOfSize:16.0f];
    label2.numberOfLines = 0;
    label2.lineBreakMode = NSLineBreakByWordWrapping;
    label2.frame = CGRectMake(50, 150, 200, 36);
    label2.text = @"This text is too long to fit on one line.";
    [self.view addSubview:label2];

    UILabel *label3 = [UILabel new];
    label3.backgroundColor = UIColor.orangeColor;
    label3.font = [UIFont systemFontOfSize:16.0f];
    label3.numberOfLines = 0;
    label3.lineBreakMode = NSLineBreakByWordWrapping;
    label3.frame = CGRectMake(50, 200, 200, 18);
    label3.text = @"This text is short.";
    [self.view addSubview:label3];
}

質問label1: iOS 7 でこれが異なるのはなぜですか。期待どおりにフレームの左上からテキストをレンダリングするには、どのラベル プロパティを変更する必要がありますか。

4

1 に答える 1

8

私はそれを考え出した。質問を削除するのではなく、ここで回答します。他の誰かがこれに遭遇した場合、どうすればよいかがわかります。

ラベル フレームは、特定のサイズにハードコーディングされています。の場合label1、高さは 18 です。この境界は、16 ポイントのシステム フォントで 1 行のテキストをレンダリングするのに十分な高さではありません。iOS 5/6 では明らかにテキスト rect が上部に配置されますが、iOS 7 ではこれにより予期しない動作が発生します。この修正は、少なくとも 1 行のテキストを表示するのに十分な高さのラベル境界を確保するためのものです。

問題のサンプル コードは、この問題を再現するためのものです。私の実際のアプリコードは、必要な行数に基づいてラベルの高さを計算し、ラベルの周りに他のさまざまなビューを配置して、フレームが実行時に動的に変更されるようにします。最小ラベルの高さが 1 行のテキストに収まるようにすることで、アプリの問題を修正しました。

于 2013-10-02T20:47:46.837 に答える