2016-12-14 5 views
0

У меня есть UITableView, в котором каждая строка отображает дату и время плюс сообщение (снимок экрана ниже). Я использую одну атрибутную строку для отображения текста в строке (что необходимо для разницы цветов).Форматирование даты фиксированной ширины без нулевого заполнения

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

В результате я хочу, чтобы все двоеточия выстроились вертикально, так что сообщения выстраиваются в линию, несмотря на то, что количество символов в дате является переменной. Каков наилучший способ сделать это?

Я пробовал по существу пробел (определяя длину месяца, дня и часа), но результат все еще не выстраивается идеально и может привести к длинным (уродливым) блокам пробелов, когда все три (месяц, дата и час) должны быть дополнены. Возможно, есть способ распределить это дополнительное пространство среди всех символов равномерно?

Дата форматирования:

//choose format for the date 
let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "M/d h:mma: " 
dateFormatter.amSymbol = "am" 
dateFormatter.pmSymbol = "pm" 

Ввод в поле зрения:

//first put in the date 
let classHistoryCellText = NSMutableAttributedString.init(string: formattedDate) 
classHistoryCellText.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(hex: "#00000", alpha: 0.3), range: NSMakeRange(0, lengthOfDate)) 

//append what the message is 
classHistoryCellText.append(NSMutableAttributedString.init(string: classBeingViewed.classHistory[indexPath.row]["event"] as! String)) 
classHistoryCellText.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(hex: "#00000"), range: NSMakeRange(lengthOfDate, classHistoryCellText.length - lengthOfDate)) 

//bold the entire thing and make it size fontSize 
classHistoryCellText.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: fontSize), range: NSMakeRange(0, classHistoryCellText.length)) 

classHistoryCellToDisplay.textLabel?.attributedText = classHistoryCellText 

Результат:

enter image description here

+0

Возьмите 2 этикетки, будет проще. –

+0

Я бы настоятельно рекомендовал использовать YYYY-MM-DD для даты (да, нулевой). Это стандарт ISO, и если у вашего приложения есть международные пользователи, они оценят его. У вас есть еще два варианта, которые вы можете рассмотреть ... шрифт фиксированной длины выровняет все, если вы заполняете нуль. Во-вторых, поместите дату и время на свою линию. Добавьте комментарий ниже следующей строки. – Tony

ответ

0

Попробуйте изменить дату форматировщик на:

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "MM/dd hh:mma: " // this line is changed 
dateFormatter.amSymbol = "am" 
dateFormatter.pmSymbol = "pm" 

Это позволит месяцам, дням и часам всегда иметь две цифры, которые сделают все ваши даты одинаковыми.

Это будет работать, если у вас нет особых требований, чтобы избежать отображения ведущих нулей. Если это так, самым простым решением является использование двух меток - один для даты и один для статуса. Установите метку даты на фиксированную ширину.

+0

Спасибо, но «я не хочу нулевать месяц, день или час». – monstermac77

+0

Отметьте обновленный ответ. Самым простым решением является использование двух меток с фиксированной шириной (с использованием ограничений) для метки даты. – JPetric

+0

Одна из причин, по которой я пытался избежать использования двух меток, заключалась в том, что мне нужен текст сообщения, чтобы он мог обернуться, если он выходит за пределы экрана. Это потребовало переопределения моей функции heightViewRotAt таблицы tableView, которая была немного сложной, поскольку она включала вычисление расчетной высоты текста с использованием 'boundingRect'. Я полагаю, что разбить его на два лейбла просто сделает этот расчет оценки высоты более сложным, но, возможно, это не так? – monstermac77

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