什么是 – 好吗?

在我的问题“ 我怎么得到-[NSString sizeWithFont:forWidth:lineBreakMode:]工作? ”,我了解到-[NSString sizeWithFont:constrainedToSize:lineBreakMode:]实际上是我需要的。

-[NSString sizeWithFont:forWidth:lineBreakMode:]状态的文档解释了它实际上并没有将文本换行到其他行。 那么我将如何使用它? (例子会有所帮助)

它也适用于多行string。

基本上它是一个函数,可以让你看到字体和换行符模式渲染时string的大小。

我在我的应用程序的几个地方使用它,当我想要显示在某个区域的可变长度文本。

默认情况下,UILabel将垂直居中文本。 要使文本顶部alignment,您需要将标签的大小设置为其中包含的string所需的高度。

我使用这种方法来做到这一点。

我将如何使用它来做到这一点的例子如下:

 //Calculate the expected size based on the font and linebreak mode of your label CGSize maximumLabelSize = CGSizeMake(296,9999); CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode]; //adjust the label the the new height. CGRect newFrame = yourLabel.frame; newFrame.size.height = expectedLabelSize.height; yourLabel.frame = newFrame; 

你可以指定一个区域有多大的空间,然后这个方法告诉你需要多less空间(根据需要换行)。 此外,如果string将溢出您提供的矩形边界,您可以告诉,然后决定如何显示文本。

对它的引用实际上并没有包装文本,因为这个方法实际上并没有对文本做任何事情。 它只是虚拟地展示出来,并返回需要真正布置的区域的大小。

它的标签的责任(或者你正在使用什么容器来进行文本)来执行包装/还有什么需要做的事情。

希望有所帮助。

克里斯。

有一段时间,我觉得这个例程简直就是坏的。 这听起来像是一个完美的例程,用于计算出一段文本的高度 ,当以一定的宽度包裹时 。 但是,这不是它所做的。 事实上,返回的高度总是一条线。 (顺便说一句: UIFont-leading返回相同的价值。)

在撰写本文时引用文档:

虽然它计算会发生换行的地方,但这种方法实际上并没有将文本换行到额外的行; […]

这句话让我困惑了很久。 我的想法沿着:

  • 计算换行符,但不包装。 嗯?
  • 也许它们意味着接收的NSString本身不会被突变来反映换行符? 但是我不指望呢?
  • 这句话不符合自己。 我别无select,只能无视它。

然而,事实certificate,这与我们所看到的行为相符。 看来他们的意思是:

此例程将计算出现第一个换行符的位置,并且为了计算边界框,将忽略此后的所有文本。

因此,返回的边界框将具有单行高度和宽度,直到指定的最大值。 (根据计算换行符的位置,或者文本足够短以至于不需要最大宽度,宽度可能会更小。)

呃回答实际的问题:有什么好处? 我自己没有发现任何有用的东西:只有我认为有用的东西,但没有。 但是,有些想到的东西是:

  • 以单行文本为中心。 我正在考虑button和/或标题在这里。 (虽然UILabelUIButton可以做到,但有时候你想自己画一下。)
  • 计算一段较长文本的“提取”的边界。 在这里,我正在考虑在哪里可能要显示一个更大的文本片段。

这听起来像是单行标签。 例如,如果您正在绘制可能被截断或有换行符的string,但实际上不会绘制多行。 知道string的确切高度和宽度仍然是有帮助的,所以你可以把它放在你想要的位置(并在其周围绘制其他UI项目)。

下面是我在应用PyjamaSam示例中的一些原则之后提出的一些事情:

 AnnotationPin *myAnnotation = (AnnotationPin *)annotation; self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier]; self.backgroundColor = [UIColor greenColor]; self.frame = CGRectMake(0,0,30,30); imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE]; imageView.frame = CGRectMake(3,3,20,20); imageView.layer.masksToBounds = NO; [self addSubview:imageView]; [imageView release]; CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]]; CGRect newFrame = self.frame; newFrame.size.height = titleSize.height + 12; newFrame.size.width = titleSize.width + 32; self.frame = newFrame; self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor; self.layer.borderWidth = 3.0; UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)]; infoLabel.text = myAnnotation.title; infoLabel.backgroundColor = [UIColor clearColor]; infoLabel.textColor = [UIColor blackColor]; infoLabel.textAlignment = UITextAlignmentCenter; infoLabel.font = [UIFont systemFontOfSize:12]; [self addSubview:infoLabel]; [infoLabel release]; 

在这个例子中,我添加了一个自定义的引脚到一个MKAnnotation类,根据文本大小调整UILabel的大小。 它还在视图的左侧添加了一个图像,所以您会看到一些pipe理适当间距的代码来处理图像和填充。

关键是使用CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]]; 然后重新定义视图的尺寸。 您可以将此逻辑应用于任何视图,但不能处理像睡衣这样的换行符。

尽pipe睡衣的答案对某些人来说是有效的,但对我来说并不合适。 这是一个详细的解释,你应该在去其他任何地方之前立即尝试,如果你想要一个dynamic的自定义MKAnnotation pin与图像和可resize的UILabel。