2017-06-12 11 views
3

Venmoがカスタムの顔文字をテキストフィールドに配置する方法を知りたいと思います。 「:夕日:」、あなたはこれらのイメージをコピーして別の場所に貼り付けると、彼らはとして表示VenomoのようなUITextFieldのカスタム画像

「:コンサート:」、など

だから私の推測では、ということと一致して、任意のテキストのためのTextFieldのデリゲートをチェックしていますパターン(すなわち、 "コンサート:")を作成し、それを小さな画像に置き換えます。

私はどのようにあなた自身の小さなUIImageViewを他のテキストと一緒にtextField内に置くことができるのだろうかと思います。

enter image description here

編集:これはまた、スクリーンショットのテキスト入力は、ほぼ間違いなくUITextViewのカスタムサブクラスである今、私はそれ

+1

[ここ](https://stackoverflow.com/a/38016657/5442445)のように、NSAttributedStringとNSTextAttachmentを使用します。 – beyowulf

+0

@beyowulfそれは役に立ちます - 私はUILabelとUITextViewのために働いているが、画像はUITextFieldに表示されません。私はさらに探求しますが、これは今のところうまくいきます。ありがとう! – vikzilla

+0

@vikzilla ** UITextFieldはリッチテキストをサポートしていないので、**はおそらく 'UITextView'でしょう。 – xoudini

答えて

2

について考えるUITextViewをすることができ、ここで私は1つの方法を紹介しますそれだけで望ましい結果を達成することができます。ここで

は1 UITextViewから別のカスタムイメージを含むテキストをコピーし、短いデモです:

Demonstration.

まず、我々はその手の画像のテキスト表現を持つようにNSTextAttachmentをサブクラス化する必要があります後でコピーするときに使用します。

class TextAttachment: NSTextAttachment { 
    var representation: String? 
} 

我々は、画像を含む属性付きの文字列を作成するときに今、我々は添付ファイルに画像の所望のテキスト表現を追加します:

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

次に、我々はUITextViewをサブクラス化し、オーバーライドしますUIResponderStandardEditActionsで宣言された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 

明らかに添付ファイルにテキスト/絵文字/何を変換するために、より直感的になりますユーザーが入力中にオンザフライで実行できます。

+0

非常に涼しい!コピー/カット/ペーストの方法をオーバーライドすることができるかどうかはわかりませんでした。私はすでに、コロンの中のテキストをイメージに変換する機能を実装しています(そのイメージ名のアセットが存在する場合)。ありがとう! – vikzilla

+0

@vikzillaいいよ、問題ありません! – xoudini

関連する問題