Iphone 如何在iOS UIAlertView中调整文本标签
我一直在努力调整UIAlertView的标签,但没有成功。我想让它根据字符串长度正确调整大小。我读到除了对它进行子类化之外,没有什么可以做的,但是当我准备做的时候,我发现了一个玩它的把戏。(代码如下) 我可以成功地调整它的大小,格式化字体等小字符串。我可以放一些字符串(1000个字符)让它看起来很难看:Iphone 如何在iOS UIAlertView中调整文本标签,iphone,objective-c,uilabel,uialertview,sizewithfont,Iphone,Objective C,Uilabel,Uialertview,Sizewithfont,我一直在努力调整UIAlertView的标签,但没有成功。我想让它根据字符串长度正确调整大小。我读到除了对它进行子类化之外,没有什么可以做的,但是当我准备做的时候,我发现了一个玩它的把戏。(代码如下) 我可以成功地调整它的大小,格式化字体等小字符串。我可以放一些字符串(1000个字符)让它看起来很难看: 标签只是拒绝增长,以适应额外的内容 尽管我减小了文本大小,但它并没有减小(对于不需要的较小字符串,它会减小。对于需要的较小字符串,它会保持较大) 对于较大的字符串,标签显示为白色背景(设计时在
- 标签只是拒绝增长,以适应额外的内容
- 尽管我减小了文本大小,但它并没有减小(对于不需要的较小字符串,它会减小。对于需要的较小字符串,它会保持较大)
- 对于较大的字符串,标签显示为白色背景(设计时在IB中看到的背景),字符串的尾随部分由于较大的文本而被掩埋
-(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
实现了标准的UIKitsizeToFit
和sizeThatFits:
方法,您应该改用这些方法
如果希望标签跨多行换行,请首先将numberOfLines
设置为0。然后使用此代码计算所需的尺寸:
CGSize requiredSize = [label sizeThatFits:CGSizeMake(availableWidth, CGFLOAT_MAX)];
labelFrame.size = requiredSize;
// ...
或者,您可以先设置标签的宽度,然后调用[label sizeToFit]
。它将调整自身大小以适应当前宽度。首先
UILabel
实现了标准的UIKitsizeToFit
和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