Iphone 如何在iOS UIAlertView中调整文本标签

Iphone 如何在iOS UIAlertView中调整文本标签,iphone,objective-c,uilabel,uialertview,sizewithfont,Iphone,Objective C,Uilabel,Uialertview,Sizewithfont,我一直在努力调整UIAlertView的标签,但没有成功。我想让它根据字符串长度正确调整大小。我读到除了对它进行子类化之外,没有什么可以做的,但是当我准备做的时候,我发现了一个玩它的把戏。(代码如下) 我可以成功地调整它的大小,格式化字体等小字符串。我可以放一些字符串(1000个字符)让它看起来很难看: 标签只是拒绝增长,以适应额外的内容 尽管我减小了文本大小,但它并没有减小(对于不需要的较小字符串,它会减小。对于需要的较小字符串,它会保持较大) 对于较大的字符串,标签显示为白色背景(设计时在

我一直在努力调整UIAlertView的标签,但没有成功。我想让它根据字符串长度正确调整大小。我读到除了对它进行子类化之外,没有什么可以做的,但是当我准备做的时候,我发现了一个玩它的把戏。(代码如下)

我可以成功地调整它的大小,格式化字体等小字符串。我可以放一些字符串(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;    
}

请注意,注释行是我尝试过的千变万化的东西。而未注释的也会产生同样的效果。较小的文本将按照我在这里编写的代码进行调整。我只需要一个解决方案,可以让我的标签显示所有文本,而不考虑字符串长度-我知道它仍然有很大的空间,但它只是不调整大小为更大的字符串,就是这样。

这里是一个黑客,我已经成功地用在许多航运应用程序

  • 使用
    sizeWithFont
    计算您需要多少空间(从消息文本中)
  • 将消息设置为适当的
    @“\n”
  • 插入一个新的透明
    ui标签
    ,作为包含文本的警报视图的子视图 如果需要很长的文本,可以尝试插入一个
    UITextView
    ,理论上可以滚动。(请告诉我如果你尝试它是否有效。)但是,我强烈建议不要使用这种设计,而是构建一个合适的视图控制器

    [alertView addSubview:label];
    

    这是一个我已经成功应用于许多航运应用程序的黑客

  • 使用
    sizeWithFont
    计算您需要多少空间(从消息文本中)
  • 将消息设置为适当的
    @“\n”
  • 插入一个新的透明
    ui标签
    ,作为包含文本的警报视图的子视图 如果需要很长的文本,可以尝试插入一个
    UITextView
    ,理论上可以滚动。(请告诉我如果你尝试它是否有效。)但是,我强烈建议不要使用这种设计,而是构建一个合适的视图控制器

    [alertView addSubview:label];
    
    首先,

    UILabel
    实现了标准的UIKit
    sizeToFit
    sizeThatFits:
    方法,您应该改用这些方法

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

    CGSize requiredSize = [label sizeThatFits:CGSizeMake(availableWidth, CGFLOAT_MAX)];
    labelFrame.size = requiredSize;
    // ...
    
    或者,您可以先设置标签的宽度,然后调用
    [label sizeToFit]
    。它将调整自身大小以适应当前宽度。

    首先

    UILabel
    实现了标准的UIKit
    sizeToFit
    sizeThatFits:
    方法,您应该改用这些方法

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

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

    或者,您可以先设置标签的宽度,然后调用
    [label sizeToFit]
    。它将根据当前宽度调整自身大小。

    插入新标签是什么意思?它是警报的子视图还是现有UILabel的子视图(带句柄_bodyTextLabel)?你能粘贴一些示例代码吗?我尝试过这种方法。新的透明标签并没有解决我的问题。然而,我得到了线索,并添加了一个新的UILabel,它具有所需的大小作为子视图。我把原来的标签藏起来了,不知怎么的,它受到了限制,而且从来没有超过250像素的高度。我不知道为什么,但它是UIAlertView的内部。谢谢你给了我正确的方向。向上投票并标记正确。还有一件事:willpresentalertview不会隐藏实际的消息标签。如果将视图正好放置在其上方,则会创建隐藏效果。但您既不能使用hidden=YES隐藏它,也不能使用removefromsuperview删除它。这是UIAlertView固有的东西,因此无法修改。正是因为如此,你需要黑客利用透明背景和不可见的断线。但这并没有完全解决我的问题。我必须将另一个视图放置在默认警报标签所在的位置。这会在放置图像等其他东西时造成一些限制。如果我稍微移动视图,它将显示原始标签并将事情弄糟。没有办法隐藏或移除它。另外,正如您所说,添加我自己的透明视图只会使底层的原始标签可见,这已经没有用了。怎么办?插入新标签是什么意思?它是警报的子视图还是现有UILabel的子视图(带句柄_bodyTextLabel)?你能粘贴一些示例代码吗?我尝试过这种方法。新的透明标签并没有解决我的问题。然而,我得到了线索,并添加了一个新的UILabel,它具有所需的大小作为子视图。我把原来的标签藏起来了,不知怎么的,它受到了限制,而且从来没有超过250像素的高度。我不知道为什么,但它是UIAlertView的内部。谢谢你给了我正确的方向。向上投票并标记正确。还有一件事:willpresentalertview不会隐藏实际的消息标签。如果将视图正好放置在其上方,则会创建隐藏效果。但您既不能使用hidden=YES隐藏它,也不能使用removefromsuperview删除它。这是UIAlertView固有的东西,因此无法修改。正是因为如此,你需要黑客利用透明背景和不可见的断线。但这并没有完全解决我的问题。我必须将另一个视图放置在默认警报标签所在的位置。这会导致som