1

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

Я рассмотрел аналогичный ответ на IOS Multiple right and left align on same line, но не смог для правильной работы табуляторов.

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

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

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

Я почти получил его на работу;

enter image description here

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

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

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

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 - где же я их, в конце моей левой строки или в начале моей правой строки?

т.е.

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

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

+1

Вы пробовали две этикетки и автозапуск? Я знаю, что это не прямой ответ на ваш вопрос, а просто предложение. – Miknash

+0

Я не могу этого сделать, потому что от меня будет ожидать передать атрибутString в подкаст JSQMessage и вернуть его; 'return [[VICChatMessage alloc] initWithAttributedText: атрибут отправителя: senderID date: message.date];}' –

ответ

0

Вот какой-то общий код 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)) 
} 
Смежные вопросы