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

这是我在许多运输应用程序中成功使用的 hack。

  1. 用于sizeWithFont确定您需要多少空间(来自消息文本)。
  2. 将消息设置为适当数量的@"\n".
  3. 使用您的文本插入一个新的透明UILabel作为警报视图的子视图。

如果你需要很长的文本,你可以尝试插入一个UITextView,理论上可以滚动。(如果你尝试它,请告诉我它是否有效。)但是,我强烈建议不要使用这种设计,而是构建一个合适的视图控制器。

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

首先,您不应该使用这些sizeWithFont...方法来计算UILabels 的大小。

UILabel实现了您应该使用的标准 UIKitsizeToFit和方法。sizeThatFits:

如果您希望标签跨越多行,请首先设置numberOfLines为 0。然后使用此代码计算所需的大小:

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

或者,您可以先设置标签的宽度,然后调用[label sizeToFit]. 它将自行调整大小以适合其当前宽度。

于 2012-11-29T15:04:54.010 回答