私は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をリセットすること。それだけでなく、正常に動作しません。ここでは大胆な属性が有効になっているとき、それは次のようになります。
この2つの問題があります。最も顕著なのは、新しいキャラクターが新しい行にどのように置かれるかです。しかし、奇妙な点は、挿入ポイントが常にテキストビュー内のテキストの最初のインデックスにあることです(太字が有効で、太字が新しい行に挿入されている場合のみ)。したがって、太字を有効にして入力してから太字にすると、既存のテキストの前に入力が再開されます。
なぜこれらのエラーが発生しているのか分かりません。私のソリューションは非常に効率的だとは思っていませんが、他の方法で実装することはできません。
を探している場合、これは動作するはずですし、私はその考えてそうするサンプルコードですあなたが見つけられるような良いテクニックとして。いくつかのログメッセージを追加できますか?また、常に属性文字列を書き込むのではなく、決してYESを返さないようにしてください。あなたが管理するシャドー属性の文字列を持つことができ、通常の文字列と属性文字列を混在させる代わりに、そのデリゲートメソッドに常に設定します。それが失敗した場合は、このコード化されたデモアプリケーションをアップロードしてください。誰か(私のような)がそれを見ていきます。私は99%の人がこれを働かせることができると確信しています。 –
'typingAttributes'プロパティが使われなければならなかったことが分かりました。いくつかのログメッセージを追加すると、textViewの 'attributedText'に追加されたすべてのNSAttributedStringが常に新しい行に移動するので、答えより多くの質問をしてしまいました。これは' shouldChangeTextInRange'メソッドではできないと結論づけますしたがって、setTypingAttributesプロパティ)。それでもまだ分かりませんが、 'typingAttributes'を設定する方がはるかに洗練された解決策のように思えます。 – Joe
ハハ - これは、ロブネイピアが70Kポイントを持っている理由です!あなたが解決策を見つけてうれしいです - 私は確信していました! –