为 UITextField 禁用“...”截断
Disable "..." truncating for a UITextField
我一直在查看 UITextField 的文档,它的选项比 UITextView 更有限。
我 运行 遇到了这样一种情况,我需要通过强制边界框变大来处理 t运行 文本,这样 t运行cation 就不存在了。
我不能只使用 .adjustsFontSizeToFitWidth
因为只有当文本框处于屏幕宽度时才允许此事件。当它不是全屏长度时,t运行cation 就会发生。
现在,当用户键入时,我会记录每次击键并确保 UITextFields 框展开以适合文本。但是,如果我使用大字体,文本仍然会被截断:
"THIS IS LARGE TEXT GETTING CUT O..."
目前我记录每个击键和运行此代码来调整它的大小:
func adjustFrameWidthToFitText()
{
var size = sizeThatFits(CGSizeMake(CGFloat.max,height))
frame = CGRectMake(frame.origin.x, frame.origin.y, size.width + 7, frame.height)
}
但是我仍然在某些地方...被切断了。无论如何判断文本是否被 t运行cated 并覆盖导致所述 t运行cation 的行为?
(Swift 和 Obj-c 中的解决方案欢迎!)
根据我试过的以下答案:
func adjustFrameWidthToFitText()
{
var fontSize = font.pointSize
var atr = [NSFontAttributeName:font]
var textSize = NSString(string: text).sizeWithAttributes(atr)
frame = CGRectMake(frame.origin.x, frame.origin.y, textSize.width, frame.height)
}
但是还有t运行cation
extension String {
func sizeWithAttributes(atr: NSDictionary) -> CGSize {
return NSString(string: self).sizeWithAttributes(atr)
}
}
let size = textView.text.sizeWithAttributes([NSFontAttribute:textView.font])
这将 return 包含“\n”字符的字符串的确切大小。
您可以根据需要使用大小。
已添加
此外,当我使用 CATextLayer 时,我不得不将其添加到属性中以获取行,但尚未在 UITextView 或字段上进行测试:
let style = NSMutableParagraphStyle()
style.lineHeightMultiple = 1.05
..., NSParagraphStyleAttributeName:style])
经过大量挖掘,我找到了根本原因和捷径。
快捷方式优先:
func adjustFrameWidthToFitText()
{
var size = intrinsicContentSize()
frame = CGRectMake(frame.origin.x, frame.origin.y, size.width, frame.height)
}
这给出了文本字段的大小。
我的代码的问题是我在将字符添加到文本之前计算调整大小事件。所以我的边界总是在最新的击键被添加到字符串之前被计算出来。
当我改变我的逻辑时
public func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
adjustFrameWidthToFitText()
return true
}
到
textFieldDidEndEditing(_:)
{
adjustFrameWidthToFitText()
}
有效。
瞧!
我一直在查看 UITextField 的文档,它的选项比 UITextView 更有限。
我 运行 遇到了这样一种情况,我需要通过强制边界框变大来处理 t运行 文本,这样 t运行cation 就不存在了。
我不能只使用 .adjustsFontSizeToFitWidth
因为只有当文本框处于屏幕宽度时才允许此事件。当它不是全屏长度时,t运行cation 就会发生。
现在,当用户键入时,我会记录每次击键并确保 UITextFields 框展开以适合文本。但是,如果我使用大字体,文本仍然会被截断:
"THIS IS LARGE TEXT GETTING CUT O..."
目前我记录每个击键和运行此代码来调整它的大小:
func adjustFrameWidthToFitText()
{
var size = sizeThatFits(CGSizeMake(CGFloat.max,height))
frame = CGRectMake(frame.origin.x, frame.origin.y, size.width + 7, frame.height)
}
但是我仍然在某些地方...被切断了。无论如何判断文本是否被 t运行cated 并覆盖导致所述 t运行cation 的行为?
(Swift 和 Obj-c 中的解决方案欢迎!)
根据我试过的以下答案:
func adjustFrameWidthToFitText()
{
var fontSize = font.pointSize
var atr = [NSFontAttributeName:font]
var textSize = NSString(string: text).sizeWithAttributes(atr)
frame = CGRectMake(frame.origin.x, frame.origin.y, textSize.width, frame.height)
}
但是还有t运行cation
extension String {
func sizeWithAttributes(atr: NSDictionary) -> CGSize {
return NSString(string: self).sizeWithAttributes(atr)
}
}
let size = textView.text.sizeWithAttributes([NSFontAttribute:textView.font])
这将 return 包含“\n”字符的字符串的确切大小。
您可以根据需要使用大小。
已添加
此外,当我使用 CATextLayer 时,我不得不将其添加到属性中以获取行,但尚未在 UITextView 或字段上进行测试:
let style = NSMutableParagraphStyle()
style.lineHeightMultiple = 1.05
..., NSParagraphStyleAttributeName:style])
经过大量挖掘,我找到了根本原因和捷径。
快捷方式优先:
func adjustFrameWidthToFitText()
{
var size = intrinsicContentSize()
frame = CGRectMake(frame.origin.x, frame.origin.y, size.width, frame.height)
}
这给出了文本字段的大小。
我的代码的问题是我在将字符添加到文本之前计算调整大小事件。所以我的边界总是在最新的击键被添加到字符串之前被计算出来。
当我改变我的逻辑时
public func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
adjustFrameWidthToFitText()
return true
}
到
textFieldDidEndEditing(_:)
{
adjustFrameWidthToFitText()
}
有效。
瞧!