为 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()
}

有效。

瞧!