swift如何限制 UITextView 中的行数?

标签: UITextView ios Swift
发布时间: 2016/2/20 13:40:50
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我在我的屏幕有 UITextView,用户应该填补只有两行,当用户在第二行中的返回键应该变成

我如何可以限制的 UITextView 中的数? 我搜索了很多,没有结果,有用!

找到了这个答案 Swift :

locationNoteTextView.textContainer.maximumNumberOfLines = 2
self.locationNoteTextView.textContainer.lineBreakMode = NSLineBreakMode.ByClipping

它不工作,通过这种方式,用户可以输入无穷大的性格,但在屏幕上查看的内容都只是两条线!

所以如果您尝试打印文本的 textView 你会发现灾难文本。

解决方法 1:

您需要实现 textView:shouldChangeTextInRange:replacementText: 。只要文本会改变,将调用此方法。您可以访问使用其 text 属性的文本视图的当前内容。

构建新的内容,从传递的范围和替换的文本与 [textView.text stringByReplacingCharactersInRange:range withString:replacementText]

你可以然后数的行数,返回 YES 允许变化或 NO 拒绝它。

编辑:在 OP 请求:

func sizeOfString (string: String, constrainedToWidth width: Double, font: UIFont) -> CGSize {
    return (string as NSString).boundingRectWithSize(CGSize(width: width, height: DBL_MAX),
        options: NSStringDrawingOptions.UsesLineFragmentOrigin,
        attributes: [NSFontAttributeName: font],
        context: nil).size
}


func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    let newText = (textView.text as NSString).stringByReplacingCharactersInRange(range, withString: text)
    var textWidth = CGRectGetWidth(UIEdgeInsetsInsetRect(textView.frame, textView.textContainerInset))
    textWidth -= 2.0 * textView.textContainer.lineFragmentPadding;

    let boundingRect = sizeOfString(newText, constrainedToWidth: Double(textWidth), font: textView.font!)
    let numberOfLines = boundingRect.height / textView.font!.lineHeight;

    return numberOfLines <= 2;
}
官方微信
官方QQ群
31647020