5

現在テキストを選択していなくても、ユーザーが入力するテキストを下線として設定できるようにしようとしています。これは iOS 6 アプリ用で、UITextView にテキストを入力します。NSAttributedString として保存されます。太字と斜体は問題なく機能します。下線についての何かが、それが機能しないようにしています。

UITextView *textView = [self noteTextView];
NSMutableDictionary *typingAttributes = [[textView typingAttributes] mutableCopy];
[typingAttributes setObject:[NSNumber numberWithInt:NSUnderlineStyleSingle] forKey:NSUnderlineStyleAttributeName];
NSLog(@"attributes after: %@", typingAttributes);
[textView setTypingAttributes:typingAttributes];
NSLog(@"text view attributes after: %@", [textView typingAttributes]);

私の最初のログ ステートメントは、下線が設定されていることを示しています。

attributes after: {
    NSColor = "UIDeviceRGBColorSpace 0 0 0 1";
    NSFont = "<UICFFont: 0xa9c5e30> font-family: \"Verdana\"; font-weight: normal; font-style: normal; font-size: 17px";
    NSKern = 0;
    NSStrokeColor = "UIDeviceRGBColorSpace 0 0 0 1";
    NSStrokeWidth = 0;
    NSUnderline = 1;
}

しかし、直後のログ ステートメントには nsunderline 属性が表示されません。textView setTypingAttributes 行を削除しても影響はありません。

text view attributes after: {
    NSColor = "UIDeviceRGBColorSpace 0 0 0 1";
    NSFont = "<UICFFont: 0xa9c5e30> font-family: \"Verdana\"; font-weight: normal; font-style: normal; font-size: 17px";
    NSKern = 0;
    NSStrokeColor = "UIDeviceRGBColorSpace 0 0 0 1";
    NSStrokeWidth = 0;
}

太字と斜体で機能しているのに、下線を引いていない理由に困惑しています。また、最初に属性を取得してから忘れるように見えるのはなぜですか。あなたが持っているかもしれない洞察を共有してください。ありがとう。

4

2 に答える 2

4

バグ、または少なくとも文書化されていない動作を発見したと思います。入力属性を赤に設定すると、次のように実行できます。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
        replacementString:(NSString *)string {
    NSDictionary* d = textField.typingAttributes;
    NSLog(@"%@", d);
    NSMutableDictionary* md = [NSMutableDictionary dictionaryWithDictionary:d];
    // md[NSUnderlineStyleAttributeName] = @(NSUnderlineStyleSingle);
    md[NSForegroundColorAttributeName] = [UIColor redColor];
    textField.typingAttributes = md;
    return YES;
}

そのコードでは、ユーザーの新しい入力はすべて赤になります。しかし、コメント行のコメントを外して、入力属性に下線を追加しようとすると、すべてが壊れます-下線が引かず、赤い色も付けられません!

ただし、質問の他の部分への回答文書化されています。ドキュメントに明確に記載されているように、「テキストフィールドの選択が変更されると、辞書の内容は自動的にクリアされる」ため、ユーザーの入力に応じて入力属性を再度アサートして、私が行っている方法でそれを行う必要があります (それはあなたが尋ねた「忘れる」)。

于 2012-11-25T01:42:23.893 に答える
0

iOS 6 の時点で、UITextView はプロパティ attributedText を宣言するようになりました。これにより、NSAttributedString を作成してテキストに下線を引くことができます。変更されたコードは次のとおりです。

UITextView *textView = [self noteTextView];
NSMutableDictionary *typingAttributes = [[textView typingAttributes] mutableCopy];
[typingAttributes setObject:[NSNumber numberWithInt:NSUnderlineStyleSingle] forKey:NSUnderlineStyleAttributeName];
NSLog(@"attributes after: %@", typingAttributes);
textView.attributedText = [[NSAttributedString alloc] initWithString:[textView text] attributes:typingAttributes];
NSLog(@"text view attributes after: %@", [textView typingAttributes]);

このコードを使用することにより、入力されたその他のテキストも NSAttributedString で設定された形式に準拠します (下線など)。

お役に立てれば!

于 2012-10-07T01:47:15.813 に答える