我正在使用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中的光标不会反映更改。我正在寻找一种机制,在键入文本之前将光标移动到正确的位置。例如,如果用户选择“居中”,我希望光标移动到视图的中心以显示文本的位置。
任何人对如何做到这一点都有任何想法?
提前致谢,
查理
答案 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]似乎修复了光标位置。