0

UIAlertViewのラベルを調整しようと懸命に努力してきましたが、うまくいきません。文字列の長さに応じて正しくサイズ変更したい。サブクラス化する以外にできることはあまりないということを読みましたが、やろうとすると、それをいじるコツを見つけました。(以下のコード)

サイズを変更したり、フォントをフォーマットしたりして、小さな文字列を作成することができました。一部の文字列(<1000文字)はうまく収まりますが、文字列が大きい(> 1000文字)と見苦しくなります。

  • ラベルは、余分なコンテンツに合わせて成長することを拒否します
  • テキストサイズは小さくしても小さくなりません(文字列が小さいほど不要な場合は小さくなります。必要な場合は小さくなります)
  • ラベルは、大きな文字列の場合は白い背景(デザイン時にIBで表示されるもの)で表示され、テキストが大きいために文字列の末尾部分が埋め込まれます。

全体が完全に台無しに見えます。

UIAlertViewの外観コードに潜入した方法は次のとおりです。

-(void)willPresentAlertView:(UIAlertView *)alertView
{
    UILabel *body = [alertView valueForKey:@"_bodyTextLabel"]; 

    body.lineBreakMode = UILineBreakModeWordWrap;
    // body.adjustsFontSizeToFitWidth = YES;

    CGRect  alFrame = body.frame;

    CGFloat pointSize;

    UIFont * font = [UIFont fontWithName:@"Verdana" size:10];

    CGSize labelSize = [body.text sizeWithFont:font minFontSize:8   actualFontSize:&pointSize forWidth:alFrame.size.width  lineBreakMode:UILineBreakModeWordWrap];

    NSLog (@"%f", labelSize.height);
    UIFont *actualFont = [UIFont fontWithName:@"Verdana" size:10];
    CGSize sizeWithCorrectHeight = [body.text sizeWithFont:actualFont];

    alFrame.size.height = sizeWithCorrectHeight.height*10;
    NSLog (@"%f - %f", alFrame.size.height, alFrame.size.width);
    body.numberOfLines = 8;
    body.frame = alFrame;
    body.font = actualFont;    
}

コメントされた行は、私が何千ものひねりを加えて試したものであることに注意してください。また、コメントされていないものも同じ効果を生み出します。小さいテキストは、ここでコーディングしたとおりに調整されます。文字列の長さに関係なく、ラベルにすべてのテキストを表示できるソリューションが必要です。まだ十分なスペースがあることはわかっていますが、大きな文字列に合わせてサイズが変更されることはありません。

4

2 に答える 2

2

これは、私が多くの配送アプリでうまく使用したハックです。

  1. sizeWithFont(メッセージテキストから)必要なスペースを把握するために使用します。
  2. メッセージを適切な数に設定します@"\n"
  3. UILabelアラートビューのサブビューとして、テキストとともに新しい透明部分を挿入します。

非常に長いテキストが必要な場合はUITextView、理論的にはスクロールできる、を挿入してみてください。(試してみたらうまくいくかどうか教えてください。)ただし、このデザインを使用せず、代わりに適切なViewControllerを構築することを強くお勧めします。

[alertView addSubview:label];
于 2012-11-29T14:10:27.860 に答える
1

まず、のサイズを計算するためのメソッドを使用しないでください。sizeWithFont...UILabel

UILabel代わりに使用する必要がある標準のUIKitsizeToFitとメソッドを実装します。sizeThatFits:

ラベルを複数行に折り返す場合は、最初numberOfLinesに0に設定します。次に、次のコードを使用して必要なサイズを計算します。

CGSize requiredSize = [label sizeThatFits:CGSizeMake(availableWidth, CGFLOAT_MAX)];
labelFrame.size = requiredSize;
// ...

または、最初にラベルの幅を設定してから、を呼び出すこともできます[label sizeToFit]。現在の幅に合わせてサイズが調整されます。

于 2012-11-29T15:04:54.010 に答える