0

我正在编写一个使用 UITextView 处理富文本编辑的应用程序。它使用 NSTextStorage 为部分字符串设置新属性。但是,如果用户想要在字符串末尾或字符串中间更改字体或字体大小以获取新的文本样式(换句话说,当传递给的范围setAttributes:range:的长度为 0 时)此无法完成,因为您无法设置范围为 0 的属性。所以基本上,如何为 UITextView 中的光标位置设置新的 UIFont?

我的 NSTextStorage 子类中的相关代码:

- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range
{
NSLog(@"setAttributes:%@ range:%@", attrs, NSStringFromRange(range));

[self beginEditing];
[_backingStore setAttributes:attrs range:range];

[_backingStore fixAttributesInRange:range];

[self edited:NSTextStorageEditedAttributes range:range changeInLength:0];
[self endEditing];
}
4

3 回答 3

3

正确的方法是设置typingAttributes.UITextView

于 2014-10-24T03:33:31.110 回答
1

修复!我最终做的是向tempAttributes我的 NSTextStorage 子类添加一个实例变量。如果我尝试设置范围为 0 的字符串的属性,则设置tempAttributes为传入的属性。然后在该方法的下一次传递中,如果tempAttributes有数据,我设置它试图更改的范围,而不是旧属性。新代码:

- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range
{
    NSLog(@"setAttributes:%@ range:%@", attrs, NSStringFromRange(range));

[self beginEditing];
if (range.location == _backingStore.length || range.length == 0) {
    tempAttributes = attrs;
} else {
    if (tempAttributes) {
        [_backingStore setAttributes:tempAttributes range:range];
        tempAttributes = nil;
    } else {
        [_backingStore setAttributes:attrs range:range];
    }
}

[_backingStore fixAttributesInRange:range];

[self edited:NSTextStorageEditedAttributes range:range changeInLength:0];
[self endEditing];
}
于 2013-11-13T15:46:18.450 回答
0

我做得更好。我只是调用 [myTextView insertText: @" "] ,它在文本存储中添加了一个空格,并且 range.length 不再 == 0 了。然后我对那段文本做任何我需要的事情。之后我立即调用 [myTextView deleteBackward: nil]。即使你是超人,你也看不到任何东西,但这个技巧可以在空范围内完成你需要的任何事情。

于 2014-10-24T02:34:54.610 回答