如何在UITextView中获取光标以反映更新的typingAttributes以进行段落对齐?

时间:2013-11-28 13:54:21

标签: ios uitextview nsattributedstring text-alignment

我正在使用UITextView输入一些富文本。我创建了一个按钮来更改段落对齐方式(左,中,右)。

当用户选择一些文本并且按预期工作时,我将对齐应用于attributedText。

然而,当用户点击返回并且处于一个新的零长度段落(刚好在换行后面并且没有跟随)之后,我相信我应该更改typingAttributes以反映我希望新文本接收的属性。 / p>

我使用了以下代码:

if ((paragraphRange.length == 0) && (paragraphRange.location == [mutableText length])) {

    NSMutableParagraphStyle * mutableParagraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];

    [mutableParagraphStyle setAlignment:textAlignment];
    [mutableParagraphStyle setLineBreakMode:NSLineBreakByWordWrapping];

    NSMutableDictionary * attributes = [self.typingAttributes mutableCopy];
    [attributes setObject:mutableParagraphStyle forKey:NSParagraphStyleAttributeName];
    self.typingAttributes = attributes;

一旦键入字符,它确实应用段落对齐,但是在键入字符之前,UITextView中的光标不会反映更改。我正在寻找一种机制,在键入文本之前将光标移动到正确的位置。例如,如果用户选择“居中”,我希望光标移动到视图的中心以显示文本的位置。

任何人对如何做到这一点都有任何想法?

提前致谢,

查理

4 个答案:

答案 0 :(得分:1)

以下是我的操作方法,这会导致光标立即移动。我认为关键是在整个段落上设置属性。似乎有一个错误,有时光标不会移动,但如果你滚动文本视图然后导致它移动。似乎只出现在uitextview的顶部附近(第1 - 5行),如果这两种样式使用相同的字体大小。

如果您选择文本并将其更改为粗体或从粗体更改,则会出现类似的错误,未调整所选区域的大小以反映更改文本的新宽度。此外,如果以编程方式将字体更改为段落的粗体,则不会更新光标位置以适应文本的更改宽度。但是,如果您还更改了文本点大小,则会为下一个文本宽度正确地重新定位光标。

/*! Applies the Normal style to the range returned by [self rangeForUserParagraphAttributeChange]

    @param sender The id of the control sending the message.
 */
- (IBAction) styleNormal:(id)sender
{
    FLOG(@"styleNormal called");
    NSRange charRange = [self rangeForUserParagraphAttributeChange];
    if (charRange.location == NSNotFound) return;
    NSTextStorage *myTextStorage = [self textStorage];

    if ([self isEditable] && charRange.location != NSNotFound)
    {
        [myTextStorage beginEditing];
        [myTextStorage setAttributes:[self normalStyle] range:charRange];
        [myTextStorage endEditing];
    }
    [self setTypingAttributes:[self normalStyle]];
}
- (NSRange)rangeForUserParagraphAttributeChange {
    NSRange paragaphRange = [self.textStorage.string paragraphRangeForRange: self.selectedRange];
    return paragaphRange;
}

答案 1 :(得分:1)

对于那些跟踪这个,看起来这是iOS7中的一个错误。在计算光标位置时,渲染器似乎没有考虑typingAttributes段对齐的状态。

看起来这个需要向Apple提交错误报告; - )

答案 2 :(得分:1)

您是否尝试将textView作为第一响应者重新签名,然后立即将其作为第一响应者。

[textView resignFirstResponder];
[textView becomeFirstResponder];

答案 3 :(得分:1)

调用[textView setNeedsLayout]似乎修复了光标位置。