2

Я создал простое приложение для чата, где наши сообщения находятся с правой стороны (выравнивание по правому краю), а все остальные сообщения находятся слева (выравнивание по левому краю). Я использую NSAttributedString, потому что я сильно изменяю текст с цветами и т. Д. Каждое сообщение является UILabel. Моя проблема заключается в том, что в конце сообщения с выравниванием по правому краю, я хочу поставить пробел так это выглядит следующим образом:NSAttributedString с правильным выравниванием удаляет пробелы в конце

"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; 

И ... мое место удаляется. Как я могу предотвратить удаление текста в конце текста? Мне это нужно.

EDIT:

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:

т

Так что же происходит: текст идет от RIGH t налево, оставляя в этом случае только последний символ. И tailIndent только 0.1!

+0

Как вы можете сказать, что пробелы удалены? – danh

+0

@ danh текст записывается прямо на краю метки, между правым краем метки и текстом нет пробелов. И если что-то я не занят в заполнении;) Мне нужно пробел там – L3M0L

+0

Я думаю, что стиль абзаца предоставляет tailIndent. Вы попробовали это? – danh

ответ

4

Я пробовал несколько значений самостоятельно, и, вопреки ожиданиям, указанным по названию атрибута (и отсутствию других указаний in the doc), tailIndent должен быть отрицательным.

Вот код (ОП-х, в основном) без атрибута установлен:

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

РЕДАКТИРОВАТЬ Любой из управляющих Params должны быть представлены в виде объектов, подобно NSNumber, представляющий отступа:

NSNumber *theIndent = @(-18); 

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

только объекты, как NSNumbers, могут быть помещены в массивы, словари, основных данных и т.д.

+0

Он работает! О, мой бог! Благодаря! – L3M0L

+0

Один вопрос, есть ли способ получить значение tailIndent программно? Потому что теперь есть -18.0 жестко закодированный (в моем случае это -8.0). Я хочу получить значение для пробелов, чтобы не было жестко заданного значения. – L3M0L

+0

Пожалуйста, обратитесь к редактированию и дайте мне знать, если я правильно понял ваш следующий вопрос. – danh

Смежные вопросы