具有右对齐的NSAttributedString在末尾删除空格

时间:2016-09-04 13:52:50

标签: objective-c whitespace nsattributedstring nsmutableattributedstring right-align

我创建了一个简单的聊天应用,其中我们的消息位于右侧(右对齐),所有其他消息位于左侧(左对齐)。我正在使用NSAttributedString,因为我大量修改了带有颜色的文本等。 每条消息都是UILabel。我的问题是,在具有正确对齐的消息的末尾,我想放一个空格,使它看起来像这样:

"Some example sentence "

而不是这样:

"Some example sentece"

并且每当我把空白放在那里时它就被移除了(我也试过了不间断的空间\u00a0并且我得到了同样的问题(空间被移除) 我的正确对齐代码如下所示:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:self.text /*attributes:attrDict*/];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setAlignment:NSTextAlignmentRight];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [attributedString length])];

稍后我添加一些其他属性与颜色等(没有任何改变文本本身)。文本最后总是带有空格,如下所示:"Some example sentece " 最后我做了这样的事情:

self.attributedText = attributedString;

而且...我的空间被删除了。如何防止我的文本删除最后的空格?我需要它。

编辑:

if (self.textAlignment == NSTextAlignmentRight) {
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        [paragraphStyle setAlignment:NSTextAlignmentRight];
        [paragraphStyle setTailIndent:0.1];
        [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [attributedString length])];
    }

这是我的tailIndent代码,它看起来像这样。 我在聊天的右侧有一条消息“测试”(这里是左侧,因为我不知道如何正确对齐文本:P) 在tailIndent之前:

  

测试

在tailIndent之后:

  

那么会发生什么:文本从右到左,在这种情况下只留下最后一个字符。而tailIndent只是0.1

1 个答案:

答案 0 :(得分:6)

我自己尝试了一些值,并且与属性名称设置的期望(以及缺少其他指导in the doc)相反,tailIndent必须是否定的。

这是没有属性集的代码(基本上是OP):

NSString *text = @"Am I indented?";

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setAlignment:NSTextAlignmentRight];
// paragraphStyle.tailIndent = -18.0;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [attributedString length])];
self.label.attributedText = attributedString;

enter image description here

将行设置tailIndent取消注释为否定值,即可获得:

enter image description here

修改 任何控制参数都应表示为对象,如表示缩进的NSNumber:

NSNumber *theIndent = @(-18);

// then, later:
paragraphStyle.tailIndent = [theIndent intValue];

只有像NSNumbers这样的对象可以放在数组,字典,核心数据等中。