Установка NSMutableAttributedString выровненного по левому краю и выровненного по правому краю текста

Я пытаюсь использовать NSMutableAttributedString для форматирования текста, чтобы он был выровнен по левому краю и по правому краю в одном и том же фрагменте текста.

Я рассмотрел аналогичный ответ в IOS Множественное выравнивание по правому и левому краю на той же строке, но не удалось заставить табуляции работать правильно.

Мое собственное решение состоит в том, чтобы сделать следующее.

Получить мою копию + добавить физические вкладки (например: \t) в конец копии

Затем создайте стиль абзаца для моей строки времени чата, выровненной по правому краю, и добавьте его в конец строки.

У меня почти получилось;

введите здесь описание изображения

Но проблема в том, что время вообще не выровнено; кажется, что он застрял с выравниванием по левому краю.

Я бы хотел, чтобы текст времени был справа.

Вот мой код для настройки временной части;

    NSAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:message.body attributes:attributes];

NSMutableAttributedString *finalizedCopy = [attributedString mutableCopy];
    if (message.sender.remoteID) [finalizedCopy appendAttributedString:tabStops];


    // Add time to the chat bubble
    NSString *messageTime = [[JSQMessagesTimestampFormatter sharedFormatter] timeForDate:message.date];
    NSAttributedString *chatMessageTime = [[NSAttributedString alloc] initWithString:messageTime attributes:attributes];

    NSMutableParagraphStyle *timeParagraphStyle = [[NSMutableParagraphStyle alloc] init];
    timeParagraphStyle.alignment = NSTextAlignmentRight;

    NSMutableAttributedString *dateString = [[NSMutableAttributedString alloc] initWithAttributedString:chatMessageTime];
    [dateString setAttributes:@{ NSFontAttributeName : [UIFont vic_fontOfSize:10],
                                 NSForegroundColorAttributeName: [UIColor vic_darkTextColor]
                                 }
                        range:NSMakeRange(0, dateString.length)];

    [dateString addAttribute:NSParagraphStyleAttributeName value:timeParagraphStyle range:NSMakeRange(0, dateString.length)];

    [finalizedCopy appendAttributedString:dateString];


    attributedString = [finalizedCopy copy];

Мне интересно, как лучше всего добиться желаемого эффекта.

Большое спасибо

Кроме того, если бы я использовал NSTabStops, где бы я их поместил, в конце моей левой строки или в начале моей правой строки?

ie:

NSTextTab *tabStop = [[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentRight location:150 options:nil]; [paragraph setTabStops:@[tabStop]]; [finalizedCopy addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, finalizedCopy.length)];

Находится в конце моей левой строки, но визуально я не вижу результатов.


person Atilla Jax    schedule 17.07.2015    source источник
comment
Вы пробовали две метки и autolayout? Я знаю, что это не прямой ответ на ваш вопрос, а просто предложение.   -  person Miknash    schedule 17.07.2015
comment
Я не могу этого сделать, потому что ожидается, что я передам attributeString в подфайл JSQMessage и верну это; return [[VICChatMessage alloc] initWithAttributedText:attributedString sender:senderID date:message.date];}   -  person Atilla Jax    schedule 17.07.2015


Ответы (1)


Вот некоторый общий код Swift, который, я думаю, делает то, что вы хотите. Тот же подход должен работать и в Objective-C:

    // Paragraph with left and right aligned text

let paragraph = NSMutableParagraphStyle()
paragraph.alignment = .left
for tabStop in paragraph.tabStops {
    paragraph.removeTabStop(tabStop)
}
paragraph.addTabStop(NSTextTab(textAlignment: .right, location: 240.0, options: [:]))

let text = NSMutableAttributedString()

let leftAttributes = [
    NSFontAttributeName: UIFont.systemFont(ofSize: 10.0),
    NSForegroundColorAttributeName: UIColor.white,
    NSParagraphStyleAttributeName: paragraph
]

let rightAttributes = [
    NSFontAttributeName: UIFont.boldSystemFont(ofSize: 20.0),
    NSForegroundColorAttributeName: UIColor.white,
    NSParagraphStyleAttributeName: paragraph
]

let data = [
    "Carrots": 23,
    "Pears": 453,
    "Apples ": 2350
]

for (key, value) in data {
    text.append(NSAttributedString(string: key, attributes: leftAttributes))
    text.append(NSAttributedString(string: "\t\(value)\n", attributes: rightAttributes))
}
person Chris Garrett    schedule 06.12.2016