[英]How to estimate the proper height of a UITextField, to hold text of given font size
我想使用UITextField显示单行文本字段,我需要在显示它之前知道它包含UICollectionViewCell的正确大小。 文本可以是多种字体大小之一,我需要获得正确的高度以便舒适地显示它。
由于文本事先不知道(它可以由用户编辑),我不能使用NSAttributedString
的-size
和-boundingRectWithSize:options:context:
除了虚拟文本之外的任何东西,在这种情况下我不能真的相信最终的大小可以容纳任何文本,对吧?
我想我的问题是:是否有关于排版的一般经验法则,或者我不知道的一些有用的API,这将允许我确定在X
pt显示文本,我需要一个高度的文本字段Y
px。
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
更容易理解。
当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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.