UITextField中的自定义图像,如Venmo app

时间:2017-06-12 14:40:09

标签: ios unicode uitextfield uitextview emoji

我想知道Venmo如何将自定义表情符号放入文本字​​段中。

当您复制这些图像并将其粘贴到其他位置时,它们会显示为“:sunset:”,“:concert:”等。

所以我的猜测是textField委托检查匹配该模式的任何文本(即“:concert:”)并用一个小图像替换它。

所以我想知道你如何将自己的小UIImageView放在textField中与其他文本一起。

enter image description here

编辑:现在我也可以考虑使用UITextView

1 个答案:

答案 0 :(得分:2)

屏幕截图中的文本输入几乎肯定是UITextView的自定义子类,在这里,我将提供一种方法来实现所需的结果。

这是一个简短的演示,将包含自定义图片的文字从一个UITextView复制到另一个:

Demonstration.

首先,我们需要将NSTextAttachment子类化为手边的图像的文本表示,我们以后会在复制时使用。

class TextAttachment: NSTextAttachment {
    var representation: String?
}

现在,当我们创建包含图片的属性字符串时,我们会将所需的图片文字表示添加到附件中:

let attachment = TextAttachment()
attachment.image = UIImage(named: "1f197")
attachment.representation = ":anything-here:"

接下来,我们将UITextView作为子类,并覆盖copy(_:)UITextView实现的class TextView: UITextView { override func copy(_ sender: Any?) { let selectedString = self.attributedText.attributedSubstring(from: self.selectedRange) let enumeratableRange = NSRange(location: 0, length: selectedString.length) let result = NSMutableAttributedString(attributedString: selectedString) selectedString.enumerateAttribute(NSAttachmentAttributeName, in: enumeratableRange, options: []) { (value, range, _) in if let attachment = value as? TextAttachment, let representation = attachment.representation { result.replaceCharacters(in: range, with: representation) } } UIPasteboard.general.string = result.string } } 方法。

cut(_:)

我们也可以覆盖其他一些方法,例如paste(_:)var textView: TextView // Create an instance however. let mutableString = NSMutableAttributedString() mutableString.append(NSAttributedString(string: "Text with ")) mutableString.append(NSAttributedString(attachment: attachment)) mutableString.append(NSAttributedString(string: " text attachment.")) self.textView.attributedText = mutableString ,但这些方法不在问题范围内。

最后,让我们将一些属性文本添加到自定义文本视图的实例中,以了解它在实际操作中的执行情况:

<Button ... WidthRequest="150" HeightRequest="200"... />

显然,当用户输入时,将文本/表情符号/其他内容转换为附件会更直观。