2

我想使用 UITextField 显示一个单行文本字段,在显示它之前我需要知道它包含 UICollectionViewCell 的正确大小。文本可以是多种字体大小之一,我需要获得合适的高度才能舒适地显示它。

由于事先不知道文本(它可以由用户编辑),我不能使用NSAttributedString's-size-boundingRectWithSize:options:context:除了虚拟文本之外的任何东西,在这种情况下,我不能真正相信生成的大小来保存任何文本, 正确的?

我想我的问题是:一般来说,是否有关于排版的经验法则,或者我不知道的一些有用的 API,这将允许我确定要在Xpt 显示文本,我需要一个高度为的文本字段Y像素。

4

2 回答 2

4

UITextField实现sizeThatFits:方法。因此,获取文本字段大小的最可靠方法是实际创建一个,像设置真实文本字段一样设置它,并要求它提供合适的大小。您甚至不必为其提供占位符文本,因为UITextField将根据其字体而不是其文本来选择大小。

UITextField *dummy = [[UITextField alloc] init];
dummy.font = [UIFont systemFontOfSize:20];
dummy.borderStyle = UITextBorderStyleRoundedRect;
CGFloat requiredHeight = [dummy sizeThatFits:CGSizeMake(HUGE_VALF, HUGE_VALF)].height;
// requiredHeight == 30 in my test

如果您的部署目标是 iOS 6.0 或更高版本,您可以改为使用该intrinsicContentSize属性,如下所示:

CGFloat requiredHeight = dummy.intrinsicContentSize.height;
// requiredHeight == 30 in my test

请注意,它sizeThatFits:在 iOS 6 中仍然有效,但intrinsicContentSize更容易理解。

于 2013-06-26T03:58:14.243 回答
4

当borderStyle 为RoundedRect 时,iOS 总是返回30 个单位的高度。如果要计算自定义字体所需的高度,则必须将borderStyle 更改为任何其他值,计算高度,然后将borderStyle 改回来。

textField.borderStyle = UITextBorderStyle.None;
let sizeThatFits = textField.sizeThatFits(CGSize(width:textField.bounds.width, height: CGFloat.max));
textField.bounds.height = sizeThatFits.height;
textField.borderStyle = UITextBorderStyle.RoundedRect;
于 2016-04-12T09:34:06.137 回答