2013-05-07 16 views
11

私はUITextViewにさまざまなスタイルのテキストを入力できるようにしようとしています。太字や斜体などの単純な属性を使用するテキストエディタのようなものです。私はtextViewのattributedTextプロパティを使用して理解しています。特定のテキスト範囲に属性を適用できます。これはうれしいことですが、私はtextViewに属性付きテキストを入力できるようにしたいと思います。これはボタンで切り替えることができます(太字のテキストの入力など)。NSAttributedStringテキストをUITextViewに入力する方法を教えてください。

は、ここで私はこれまで考えてきたものだ:

私はtext引数を取り、同じテキストでNSAttributedStringを作成することにより、属性とそれを修正するために-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text UITextViewのデリゲートメソッドを使用しました。その後、textViewのattributedTextのコピーであるNSMutableAttributedStringを作成します。 appendAttributedStringを使用して2つを追加し、textViewのattributedTextプロパティを結果のattributedStringに設定します。ここで

はコードです:

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 

    if (self.boldPressed) { 

     UIFont *boldFont = [UIFont boldSystemFontOfSize:self.textView.font.pointSize]; 
     NSDictionary *boldAttr = [NSDictionary dictionaryWithObject:boldFont forKey:NSFontAttributeName]; 
     NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]initWithString:text attributes:boldAttr]; 
     NSMutableAttributedString *textViewText = [[NSMutableAttributedString alloc]initWithAttributedString:textView.attributedText]; 
     [textViewText appendAttributedString:attributedText]; 
     textView.attributedText = textViewText; 

      return NO; 
     } 
    return YES;     
} 

は、文字が入力されるたびに、単純な行動のために多くのビットのように思えるtextViews attributedTextをリセットすること。それだけでなく、正常に動作しません。ここでは大胆な属性が有効になっているとき、それは次のようになります。

attributedText issues

この2つの問題があります。最も顕著なのは、新しいキャラクターが新しい行にどのように置かれるかです。しかし、奇妙な点は、挿入ポイントが常にテキストビュー内のテキストの最初のインデックスにあることです(太字が有効で、太字が新しい行に挿入されている場合のみ)。したがって、太字を有効にして入力してから太字にすると、既存のテキストの前に入力が再開されます。

なぜこれらのエラーが発生しているのか分かりません。私のソリューションは非常に効率的だとは思っていませんが、他の方法で実装することはできません。

+1

を探している場合、これは動作するはずですし、私はその考えてそうするサンプルコードですあなたが見つけられるような良いテクニックとして。いくつかのログメッセージを追加できますか?また、常に属性文字列を書き込むのではなく、決してYESを返さないようにしてください。あなたが管理するシャドー属性の文字列を持つことができ、通常の文字列と属性文字列を混在させる代わりに、そのデリゲートメソッドに常に設定します。それが失敗した場合は、このコード化されたデモアプリケーションをアップロードしてください。誰か(私のような)がそれを見ていきます。私は99%の人がこれを働かせることができると確信しています。 –

+0

'typingAttributes'プロパティが使われなければならなかったことが分かりました。いくつかのログメッセージを追加すると、textViewの 'attributedText'に追加されたすべてのNSAttributedStringが常に新しい行に移動するので、答えより多くの質問をしてしまいました。これは' shouldChangeTextInRange'メソッドではできないと結論づけますしたがって、setTypingAttributesプロパティ)。それでもまだ分かりませんが、 'typingAttributes'を設定する方がはるかに洗練された解決策のように思えます。 – Joe

+0

ハハ - これは、ロブネイピアが70Kポイントを持っている理由です!あなたが解決策を見つけてうれしいです - 私は確信していました! –

答えて

28

これはsetTypingAttributes:が対象です。ユーザーがあなたの属性ボタンの1つを押して、新しい文字が要求された属性を拾うたびに、これをあなたの属性辞書に設定してください。ここで

+0

ありがとうございました。あなたはもはやそれを使用したくないときに属性をどのように削除しますか?空の辞書にtypingAttributesプロパティを設定しようとしましたが、フォントサイズなどの他の属性はすべて削除されました。プロパティは変更可能ではないので、最後に追加された属性を削除することはできません。 – Joe

+0

現在の値の 'mutableCopy'を作成します。それを変更して、それを再割り当てします。 –

+0

ああ、持っています。とても有難い。 – Joe

3

あなたが例

スウィフト3.0

var attributes = textField.typingAttributes 
attributes["\(NSForegroundColorAttributeName)"] = UIColor.red 
textField.typingAttributes = attributes 

のObjective-C

NSMutableDictionary* attributes = [textField.typingAttributes mutableCopy]; 
attributes[NSForegroundColorAttributeName] = [UIColor redColor]; 
textField.typingAttributes = attributes; 
関連する問題